Лекции по ассемблеру / пример_прог1
.docTITLE prg_10_3
STACK SEGMENT PARA STACK ‘STACK’
DB 64 DUP(‘STACK’) ; Область стека
STACK ENDS
DSEG SEGMENT PARA PUBLIC ‘DATA’
Mas db 1,0,9,8,0,7,8,0,2,0 ; это заданный одномерный массив байт
Len_mas equ 10 ; количество элементов в массиве
DSEG ENDS
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
START: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG ; инициировать адрес сегмента данных
MOV DS,AX
MOV СX, LEN_MAS ; в сх – счетчик элементов массива
XOR AX,AX
XOR SI,SI
JCXZ EXIT ; проверка сх на 0, если 0, то выход
CYC1: CMP MAS[SI],0 ;сравнить очередной элемент задан. массива с 0
JNE M1 ; если не равно 0, то на m1
INC AL ; увеличение счетчика нулевых элементов
M1: INC SI ; перейти к следующему элементу
LOOP CYC1
EXIT: MOV AX, 4C00H
INT 21H ; возврат управления операционной системе
END START
TITLE prg_10_4
STACK SEGMENT PARA STACK ‘STACK’
DB 64 DUP(‘STACK’) ; Область стека
STACK ENDS
DSEG SEGMENT PARA PUBLIC ‘DATA’
Mas db 1,0,9,8,0,7,8,0,2,0 ; это заданный одномерный массив байт
Len_mas equ 10 ; количество элементов в массиве
MESS1 DB ‘в массиве нет нулевых элементов, $’
MESS2 DB ‘найден первый нулевой элемент в позиции, $’
DSEG ENDS
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
START: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG ; инициировать адрес сегмента данных
MOV DS,AX
MOV СX, LEN_MAS ; в сх – счетчик элементов массива
XOR AX,AX
XOR SI,SI
JCXZ EXIT ; проверка сх на 0, если 0, то выход
MOV SI, -1 ; готовим SI к адресации элементов MAS
CYC1: INC SI
CMP MAS[SI],0 ;сравнить очередной элемент задан. массива с 0
LOOPNZ CYC1 ; цикл перебора элементов массива
JZ EXIT ; на эту команду попадем, если весь массив просмотрен
и нулевой элемент не обнаружен, либо, если нулевой элемент найден
. . . . .здесь поместить команды выдачи сообщения MESS1
INC SI ; определить номер первого нулевого элемента
EXIT:
. . . . . .здесь поместить команды выдачи сообщения MESS2 и номера первого нулевого элемента
MOV AX, 4C00H
INT 21H ; возврат управления операционной системе
END START
TITLE prg_10_5
STACK SEGMENT PARA STACK ‘STACK’
DB 64 DUP(‘STACK’) ; Область стека
STACK ENDS
DSEG SEGMENT PARA PUBLIC ‘DATA’
Mas db 1,0,9,8,0,7,8,0,2,0 ; это заданный двумерный массив байт
db 1,0,9,8,6,7,8,0,5.4
db 0,1,9,8,0,7,8,0,2,0
db 1,2,9,8,0,7,8,0,2,3
db 10,0,0,9,8,0,0,8,0,2
Len_mas equ 10 ; количество элементов в строке
DSEG ENDS
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
START: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG ; инициировать адрес сегмента данных
MOV DS,AX
XOR AX,AX
MOV CX, 5 ; в счетчик – число строк массива
LEA BX, MAS ;смещение начала массива занести в ВХ
CYC1: PUSH CX ;сохранить в стеке текущее значение счетчика строк
XOR SI, SI ; начать обработку очередной строки
MOV СX, LEN_MAS ; в сх – счетчик элементов строки
CYC2: CMP BYTE PTR [BX+SI],0 ; очередной элемент 0?
JNE NO-ZERO ; если не 0, перейти на метку
MOV BYTE PTR [BX+SI],0FFH ;заменить нулевой элемент
заданным значением
NO_ZERO:
INC SI ; перейти к следующему элементу строки
LOOP CYC2
POP CX ; восстановить счетчик внешнего цикла (номера строки)
ADD BX, LEN_MAS ; перейти к следующей строке
LOOP CYC1
EXIT: MOV AX, 4C00H
INT 21H ; возврат управления операционной системе
END START