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