11.06.2012, 14:13
общий
это ответ
Здравствуйте, Flawless!
[code h=200];Вычислить сумму двух двойных слов (считать, что в них хранятся беззнаковые числа).
;Сумму разместить в третьем двойном слове. Если сумма не помещается в двойном слове,
;то перейти на метку error..
;Оформить в виде процедур:
;1. С передачей параметров через регистры.
;2. Через стек.
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
NUM1 dd 43211234h
NUM2 dd 0dcbaabcdh
NUM3 dd ?
D ENDS
.186
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 ; напрямую не пересылается!!!
;передаем параметры через регистры
LEA SI, NUM1 ;адрес первого числа
LEA DI, NUM2 ;адрес второго числа
LEA BX, NUM3 ;адрес результата
CALL SUM1 ;считаем
;передаем параметры через стек
PUSH OFFSET NUM3;передаем адрес результата
PUSH OFFSET NUM2;передаем адрес второго числа
PUSH OFFSET NUM1;передаем адрес второго числа
CALL SUM2 ;считаем
RET
Start ENDP
;адрес первого числа в SI
;адрес второго числа в DI
;адрес результата в BX
SUM1 PROC
MOV AX, WORD PTR [SI] ;младшее слово
MOV DX, WORD PTR [SI+2] ;старшее
ADD AX, WORD PTR [DI] ;сначала складываем младшие
ADC DX, WORD PTR [DI+2] ;старшие с учетом переноса
JC ERROR1 ;если перенос, значит сумма не помещается в двойное слово
MOV WORD PTR[BX], AX ;сохраняем результат
MOV WORD PTR[BX+2], DX
ERROR1:
RET
SUM1 ENDP
;параметры в стеке, передаются в сле порядке:
;адрес результата
;адрес второго числа
;адрес первого числа
SUM2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+4] ;адрес первого числа
MOV DI, [BP+6] ;адрес первого числа
MOV AX, WORD PTR [SI] ;анаогично
MOV DX, WORD PTR [SI+2]
ADD AX, WORD PTR [DI]
ADC DX, WORD PTR [DI+2]
JC ERROR2
MOV BX, [BP+6] ;адрес результата
MOV WORD PTR[BX], AX
MOV WORD PTR[BX+2], DX
ERROR2:
POP BP ;восстановим старый BP
RET 6 ;при возврате удалим из стека 4 байта (2 слова)!
SUM2 ENDP
C ENDS
END Start[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен