20.06.2012, 11:42
общий
это ответ
Здравствуйте, Igordrum!
4)
[code h=200];Краткая справка по необходимым флагам
;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[/code]
5)
[code h=200];В последовательные 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[/code]
В виде процедур:
[code h=200];В последовательные 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[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен