Консультация № 186349
11.06.2012, 12:44
170.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере.
Windows, какую версию используют PC в университете не знаю. Всего 4 задания.
Это задание будет состоять из подпунктов. Потому цена будет выше.

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

А так же. Оформить в виде процедур фрагмент программы из задания №5:
1. С передачей параметров через регистры.
2. Через стек.

Обсуждение

давно
Посетитель
7438
7205
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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа