Консультация # 186394: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Задание 4. Изучить особенности сложения и вычитания целых чисел в ПК (беззнаковых и со знаком). Разобраться, для чего служат флаги переноса (CF) и переполнения мантиссы (OF). Изучить команды сложения и вычитания, допустимые типы операндов, устанавливаемые флаги. Написать фрагмент программы ...
Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Задание 4. Изучить особенности сложения и вычитания целых чисел в ПК (беззнаковых и со знаком). Разобраться, для чего служат флаги переноса (CF) и переполнения мантиссы (OF). Изучить команды сложения и вычитания, допустимые типы операндов, устанавливаемые флаги. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом из табл. 5. Подобрать числовые значения таким образом, чтобы команды
устанавливали различные флаги условий (OF,CF,ZF,SF); в каждом варианте – по крайней мере 3 различных флага. В комментариях к командам указать получаемые значения флагов.
Вариант задания
F – массив 5 слов. Вычтите из среднего числа сумму остальных. Результат поместить в ВX.
Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации ци
кла и индексирование.
Вариант задания
В последовательные 10 байт памяти поместить коды цифр от ‘0’ до ‘9’. Выполнить размещение не в директиве описания данных, а программно. А так же. Оформить в виде процедур фрагмент программы : 1. С передачей параметров через регистры. 2. Через стек.
;Краткая справка по необходимым флагам
;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
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!