Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по ассемблеру / пример_прог1

.doc
Скачиваний:
101
Добавлен:
02.05.2014
Размер:
36.86 Кб
Скачать

TITLE 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

Соседние файлы в папке Лекции по ассемблеру