Консультация № 186390
19.06.2012, 01:14
123.47 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужна помощь в решении задач по Операционным системам на ассемблере.
Задание 5. Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом. Использовать операторы организации цикла и индексирование.
Проверить, упорядочен ли по возрастанию массив из 12 целых со знаком типа байт.
А так же. Оформить в виде процедур фрагмент программы из задания №5:
1. С передачей параметров через регистры.
2. Через стек.

Обсуждение

давно
Посетитель
7438
7205
19.06.2012, 02:35
общий
это ответ
Здравствуйте, Flawless!
5)
[code h=200];Проверить, упорядочен ли по возрастанию массив
;из 12 целых со знаком типа байт
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DB -12,-10,-8,-7,-2,0,8,9,81,100,110,127
COUNT EQU $-A ; (текущий адрес($) - A) - длина массива в байтах
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 ;его длина

MOV AH, -128 ;предыдущий элемент, пока - самое маленькое число
CMP_INC_LOOP:
MOV AL, [SI] ;очередное слово массива
INC SI ;адрес следующего слова
CMP AL, AH ;сравним с предыдущим
JLE NO_INC ;если меньше или равно, то массив не упорядочен по возрастанию
MOV AH, AL ;сохраняем предыдущего
LOOP CMP_INC_LOOP ;циклим по CX, пока не 0
MOV AL, 1 ;упорядочен
RET ;результат в AL (=1 - упорядочен, =0 - неупорядочен)
NO_INC:
MOV AL, 0 ;неупорядочен
RET
Start ENDP

C ENDS
END Start[/code]
6,7)
[code h=200];Проверить, упорядочен ли по возрастанию массив
;из 12 целых со знаком типа байт
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DB -12,-10,-8,-7,-2,0,8,9,81,100,110,127
COUNT EQU $-A ; (текущий адрес($) - A) - длина массива в байтах
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 CMP_INC1 ;проверка на возрастание

;передаем параметры через стек
PUSH COUNT ;передаем количество
PUSH OFFSET A ;смещение массива
CALL CMP_INC2 ;проверка на возрастание

RET
Start ENDP

;адрес массива в SI
;его длина в CX
;результат в AL (=1 - упорядочен, =0 - неупорядочен)
CMP_INC1 PROC
MOV AH, -128 ;предыдущий элемент, пока - самое маленькое число
CMP_INC_LOOP1:
MOV AL, [SI] ;очередное слово массива
INC SI ;адрес следующего слова
CMP AL, AH ;сравним с предыдущим
JLE NO_INC1 ;если меньше или равно, то массив не упорядочен по возрастанию
MOV AH, AL ;сохраняем предыдущего
LOOP CMP_INC_LOOP1 ;циклим по CX, пока не 0
MOV AL, 1 ;упорядочен
RET ;результат в AL (=1 - упорядочен, =0 - неупорядочен)
NO_INC1:
MOV AL, 0 ;неупорядочен
RET
CMP_INC1 ENDP

;параметры в стеке
;сначала передается дина массива
;затем адрес массива
;результат в регистре AL
CMP_INC2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+4] ;получим в стеке адрес массива
MOV CX, [BP+6] ;количество

MOV AH, -128 ;предыдущий элемент, пока - самое маленькое число
CMP_INC_LOOP2:
MOV AL, [SI] ;очередное слово массива
INC SI ;адрес следующего слова
CMP AL, AH ;сравним с предыдущим
JLE NO_INC2 ;если меньше или равно, то массив не упорядочен по возрастанию
MOV AH, AL ;сохраняем предыдущего
LOOP CMP_INC_LOOP2 ;циклим по CX, пока не 0
MOV AL, 1 ;упорядочен
JMP CMP_INC_RET;на общий выход (чтобы поправить стек)
NO_INC2:
MOV AL, 0 ;неупорядочен
CMP_INC_RET: ;результат в AL (=1 - упорядочен, =0 - неупорядочен)
POP BP ;восстановим старый BP
RET 4 ;при возврате удалим из стека 4 байта (2 слова)!
CMP_INC2 ENDP

C ENDS
END Start[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа