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

Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование.
Найти последний положительный элемент массива из 10 целых со знаком типа слово.

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

Обсуждение

давно
Посетитель
7438
7205
11.06.2012, 01:11
общий
это ответ
Здравствуйте, Flawless!
[code h=200];Найти последний положительный элемент массива из 10 целых со знаком типа слово

S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DW -1234,2345,-3456,4567,5678,-6789,-8901,9012,0,-15234
COUNT EQU ($-A)/2 ; (текущий адрес($) - A) - длина массива в байтах
; поделив на 2 получим число слов в массиве
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, A ;адрес массива в SI
MOV CX, COUNT ;его длина
CALL LastPositive1 ;проверяем, результат в регистре AX и С=0, С=1, если все отриц
;передаем параметры через стек
PUSH COUNT ;передаем количество
PUSH OFFSET A ;смещение массива
CALL LastPositive2 ;проверяем, результат в регистре AX и С=0, С=1, если все отриц
RET
Start ENDP
;адрес массива в SI
;его длина
;результат в регистре AX и С=0, С=1, если все отриц
LastPositive1 PROC
MOV DX, -1 ;предыдущее значение (=-1 -> положительных нет)
LOOP1:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
TEST AX, AX
JLE NEXT1 ;если меньше или равно, то обходим
MOV DX, AX ;сохраняем, как последнего положительного
NEXT1:
LOOP LOOP1 ;циклим по CX, пока не 0
MOV AX, DX ;результат в AX, AX=-1 если нет положительных чисел
RET
LastPositive1 ENDP
;параметры в стеке
;сначала передается дина массива
;затем адрес массива
;результат в регистре AX, если все отриц, то AX=-1
LastPositive2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+4] ;получим в стеке адрес массива
MOV CX, [BP+6] ;количество
LOOP2:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
TEST AX, AX
JLE NEXT2 ;если меньше или равно, то обходим
MOV DX, AX ;сохраняем, как последнего положительного
NEXT2:
LOOP LOOP2 ;циклим по CX, пока не 0
MOV AX, DX ;результат в AX, AX=-1 если нет положительных чисел
POP BP ;восстановим старый BP
RET 4 ;при возврате удалим из стека 4 байта (2 слова)!
LastPositive2 ENDP
C ENDS
END Start[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа