Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10970
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 4366
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2263
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1526
Дата выхода:23.06.2012, 15:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:91 / 35
Вопросов / ответов:1 / 1

Консультация # 186394: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Задание 4. Изучить особенности сложения и вычитания целых чисел в ПК (беззнаковых и со знаком). Разобраться, для чего служат флаги переноса (CF) и переполнения мантиссы (OF). Изучить команды сложения и вычитания, допустимые типы операндов, устанавливаемые флаги. Написать фрагмент программы ...


Консультация # 186394:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Задание 4. Изучить особенности сложения и вычитания целых чисел в ПК (беззнаковых и со знаком). Разобраться, для чего служат флаги переноса (CF) и переполнения мантиссы (OF). Изучить команды сложения и вычитания, допустимые типы операндов, устанавливаемые флаги.
Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом из табл. 5. Подобрать числовые значения таким образом, чтобы команды устанавливали различные флаги условий (OF,CF,ZF,SF); в каждом варианте – по крайней мере 3 различных флага. В комментариях к командам указать получаемые значения флагов.

Вариант задания

F – массив 5 слов. Вычтите из среднего числа сумму остальных. Результат поместить в ВX.


Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации ци кла и индексирование.

Вариант задания

В последовательные 10 байт памяти поместить коды цифр от ‘0’ до ‘9’. Выполнить размещение не в директиве описания данных, а программно.
А так же. Оформить в виде процедур фрагмент программы :
1. С передачей параметров через регистры.
2. Через стек.

Дата отправки: 19.06.2012, 22:24
Вопрос задал: Igordrum (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Igordrum!
4)

Код :
;Краткая справка по необходимым флагам
;OF — флаг переполнения. Этот флаг устанавливается в 1, если результат предыдущей 
;     арифметической операции над числами со знаком выходит за допустимые для них пределы. 
;     Например, если при сложении двух положительных чисел получается число со старшим битом, 
;     равным единице (то есть отрицательное) и наоборот.
;CF — флаг переноса. Устанавливается в 1, если результат предыдущей операции 
;     не уместился в приемнике и произошел перенос из старшего бита или если 
;     требуется заем (при вычитании), иначе устанавливается в 0. 
;     Например, после сложения слова 0FFFFh и 1, если регистр, в который надо 
;     поместить результат, — слово, в него будет записано 0000h и флаг CF = 1. 
;ZF — флаг нуля. Устанавливается в 1, если результат предыдущей команды — ноль. 
;SF — флаг знака. Этот флаг всегда равен старшему биту результата. 

;F – массив 5 слов. Вычтите из среднего числа сумму остальных. 
;Результат поместить в ВX

SSEG   SEGMENT STACK
       DW      64 DUP(?)
SSEG   ENDS

DSEG   SEGMENT         ; сегмент данных
                       ; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
F      DW     0002h,7fffh,0ffffh,8000h,0fffeh
DSEG   ENDS
CSEG   SEGMENT 
       ASSUME SS:SSEG,CS:CSEG,DS:DSEG

Start  PROC   FAR 
; Выполнение соглашений DOS и настройка регистра DS       
       PUSH   DS              
       SUB    AX,AX           
       PUSH   AX              
       MOV    AX,DSEG
       MOV    DS,AX

       MOV    AX,F     ; AX = 0002h
       ADD    AX,F+2   ; AX = 0002h+07fffh = 8001h
                      ; O=1, S=1, Z=0, C=0
       ADD    AX,F+6   ; AX = 8001h+8000h = 0001h
                      ; O=1, S=0, Z=0, C=1
       ADD    AX,F+8   ; AX = 0001h+0fffeh = 0ffffh
                      ; O=0, S=1, Z=0, C=0
       MOV    BX,F+4   ; BX = 0ffffh
       SUB    BX,AX    ; BX = 0ffffh - 0ffffh = 0
                      ; O=0, S=0, Z=1, C=0
; Возврат в DOS           
       RET    
                 
Start  ENDP    
CSEG   ENDS                    
       END    Start

5)
Код :
;В последовательные 10 байт памяти поместить коды цифр от ‘0’ до ‘9’. 
;Выполнить размещение не в директиве описания данных, а программно.

SSEG   SEGMENT STACK
       DW    64 DUP(?)
SSEG   ENDS

COUNT  EQU   10

DSEG   SEGMENT         ; сегмент данных
NUMS   DB    COUNT dup(?)
DSEG   ENDS

   .186
CSEG   SEGMENT 
       ASSUME  SS:SSEG,CS:CSEG,DS:DSEG

Start  PROC  FAR 
; Выполнение соглашений DOS и настройка регистра DS       
       PUSH  DS              
       SUB   AX,AX           
       PUSH  AX              
       MOV   AX,DSEG
       MOV   DS,AX

       LEA   SI,NUMS
       MOV   CX,COUNT
       MOV   AL,'0'
FORM_NUM_LOOP:
       MOV   [si],AL
       INC   SI
       INC   AL
       LOOP  FORM_NUM_LOOP

       RET
Start  ENDP    

CSEG   ENDS                    
       END   Start

В виде процедур:
Код :
;В последовательные 10 байт памяти поместить коды цифр от ‘0’ до ‘9’. 
;Выполнить размещение не в директиве описания данных, а программно.

SSEG   SEGMENT STACK
       DW    64 DUP(?)
SSEG   ENDS

COUNT  EQU   10

DSEG   SEGMENT         ; сегмент данных
NUMS   DB    COUNT dup(?)
DSEG   ENDS

       .186             ;необходимо, чтобы в стек засылать число
CSEG   SEGMENT 
       ASSUME  SS:SSEG,CS:CSEG,DS:DSEG

Start  PROC  FAR 
; Выполнение соглашений DOS и настройка регистра DS       
       PUSH  DS              
       SUB   AX,AX           
       PUSH  AX              
       MOV   AX,DSEG
       MOV   DS,AX

       LEA   SI,NUMS    ;в регистрах
       MOV   CX,COUNT
       CALL  FORM1

       PUSH  OFFSET NUMS;через стек
       PUSH  COUNT
       CALL  FORM2

       RET
Start  ENDP    

FORM1  PROC
       MOV   AL,'0'
FORM_NUM_LOOP1:
       MOV   [SI],AL
       INC   SI
       INC   AL
       LOOP  FORM_NUM_LOOP1
       RET
FORM1  ENDP

FORM2  PROC   
       PUSH  BP         ;сохраним старое значение BP
       MOV   BP, SP     ;будем адресовать стековый кадр

       MOV   CX, [BP+4] ;длина массива
       MOV   SI, [BP+6] ;адрес массива

       MOV   AL,'0'
FORM_NUM_LOOP2:
       MOV   [SI],AL
       INC   SI
       INC   AL
       LOOP  FORM_NUM_LOOP2

       POP   BP         ;восстановим старый BP
       RET   4          ;при возврате удалим из стека 4 байта (2 слова)!
FORM2  ENDP

CSEG   ENDS                    
       END   Start

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 20.06.2012, 11:42
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное