30.05.2012, 14:14
общий
это ответ
Здравствуйте, Flawless!
Меняются все 4 флага. Изучайте, будут вопросы - спрашивайте
[code h=200];Краткая справка по необходимым флагам
;OF — флаг переполнения. Этот флаг устанавливается в 1, если результат предыдущей
; арифметической операции над числами со знаком выходит за допустимые для них пределы.
; Например, если при сложении двух положительных чисел получается число со старшим битом,
; равным единице (то есть отрицательное) и наоборот.
;CF — флаг переноса. Устанавливается в 1, если результат предыдущей операции
; не уместился в приемнике и произошел перенос из старшего бита или если
; требуется заем (при вычитании), иначе устанавливается в 0.
; Например, после сложения слова 0FFFFh и 1, если регистр, в который надо
; поместить результат, — слово, в него будет записано 0000h и флаг CF = 1.
;ZF — флаг нуля. Устанавливается в 1, если результат предыдущей команды — ноль.
;SF — флаг знака. Этот флаг всегда равен старшему биту результата.
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DB 07fh,7fh,0ffh,0ffh
D ENDS
C SEGMENT
ASSUME SS:S,CS:C,DS:D
Start PROC FAR
; Выполнение соглашений DOS и настройка регистра DS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,D ; D - непосредственный операнд, в сегментный регистр
MOV DS,AX ; напрямую не пересылается!!!
MOV AL,A+2 ; AL = 0ffh
ADD AL,A+3 ; AL = 0ffh+0ffh = 0feh с переносом
; O=0, S=1, Z=0, C=1
MOV BL,A ; BL = 7fh
ADD BL,A+1 ; BL = 7fh + 7fh = 0feh
; O=1, S=1, Z=0, C=0
SUB BL,AL ; BL = 0feh - 0feh = 0
; O=, S=0, Z=1, C=0
; Возврат в DOS
RET
Start ENDP
C ENDS
END Start[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен