19.06.2012, 01:30
общий
это ответ
Здравствуйте, Flawless!
5)
[code h=200];Найти (поместить в регистр BX) меньший из элементов массива
;из 10 беззнаковых целых типа слово
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DW 1234,2345,3456,4567,5678,6789,8901,9012,10,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 ;его длина
MOV BX, 0FFFFH ;минимальное число, пока равно самому большому числу
MIN_LOOP:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
CMP AX, BX
JAE NEXT ;если выше (больше) или равно, то обходим
MOV BX, AX ;сохраняем, как минимального
NEXT:
LOOP MIN_LOOP ;циклим по CX, пока не 0
RET ;результат в BX
Start ENDP
RET
C ENDS
END Start[/code]
6,7)
[code h=200];Найти (поместить в регистр BX) меньший из элементов массива
;из 10 беззнаковых целых типа слово
S SEGMENT STACK
DW 64 DUP(?)
S ENDS
D SEGMENT ; сегмент данных
; ДИРЕКТИВЫ ОПИСАНИЯ ДАННЫХ
A DW 1234,2345,3456,4567,5678,6789,8901,9012,10,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 MIN1 ;поиск минимального
;передаем параметры через стек
PUSH COUNT ;передаем количество
PUSH OFFSET A ;смещение массива
CALL MIN2 ;
RET
Start ENDP
;адрес массива в SI
;его длина в CX
MIN1 PROC
MOV BX, 0FFFFH ;минимальное число, пока равно самому большому числу
MIN_LOOP1:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
CMP AX, BX
JAE NEXT1 ;если выше (больше) или равно, то обходим
MOV BX, AX ;сохраняем, как минимального
NEXT1:
LOOP MIN_LOOP1 ;циклим по CX, пока не 0
RET ;результат в BX
MIN1 ENDP
;параметры в стеке
;сначала передается дина массива
;затем адрес массива
;результат в регистре BX
MIN2 PROC
PUSH BP ;сохраним старое значение BP
MOV BP, SP ;будем адресовать стековый кадр
MOV SI, [BP+4] ;получим в стеке адрес массива
MOV CX, [BP+6] ;количество
MOV BX, 0FFFFH ;минимальное число, пока равно самому большому числу
MIN_LOOP2:
MOV AX, [SI] ;очередное слово массива
ADD SI, 2 ;адрес следующего слова
CMP AX, BX
JAE NEXT2 ;если выше (больше) или равно, то обходим
MOV BX, AX ;сохраняем, как минимального
NEXT2:
LOOP MIN_LOOP2 ;циклим по CX, пока не 0
POP BP ;восстановим старый BP
RET 4 ;при возврате удалим из стека 4 байта (2 слова)!
MIN2 ENDP
C ENDS
END Start[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен