Из массива чисел сформировать новый массив, в который должны войти нечетные числа - Assembler
Формулировка задачи:
Дан массив чисел Х = 0,3,-15,19,-26,49,-61,18,55,4. Необходимо сформировать новый массив Y в который должны войти нечетные числа. Сделал по примеру похожей программы, но что-то не правильно и не могу понять где
Решение задачи: «Из массива чисел сформировать новый массив, в который должны войти нечетные числа»
textual
Листинг программы
.386
.model small ; делаем exe-file
.stack 100h ; 256-байт для стека
.data
array_x db 0,3,-15,19,-26,49,-61,18,55,4
array_y db 10 dup(0)
.code
mov ax,@data
mov ds,ax ; настраиваем сегм.регистры
mov es,ax ; ..для строковых инструкций.
lea si,array_x ; DS-SI для LODSB (чтение)
lea di,array_y ; ES-DI для STOSB (запись)
mov cx,10 ; длина цикла
xor ah,ah ; в AH будет кол-во найденых
m1: lodsb ; AL = байт из DS:SI
test al,1 ; проверить мл.бит
jz m2 ; перейти, если нуль (число чётное)
stosb ; иначе: сохранить AL в DI
inc ah ; увеличить счётчик найденых
m2: loop m1 ; промотать СХ-раз...
mov ax,4c00h ; выход в DOS!
int 21h ;
end
Объяснение кода листинга программы
- .386 - идентификатор, указывающий на версию процессора.
- .model small - идентификатор, задающий модель памяти.
- .stack 100h - определение стека.
- .data - начало блока данных.
- array_x db 0,3,-15,19,-26,49,-61,18,55,4 - определение массива.
- array_y db 10 dup(0) - инициализация массива нулями.
- .code - начало блока кода.
- mov ax,@data - установка сегментного регистра для данных.
- mov ds,ax - установка сегментного регистра для стека.
- lea si,array_x - установка индекса для чтения из массива.
- lea di,array_y - установка индекса для записи в массив.
- mov cx,10 - инициализация счётчика цикла.
- xor ah,ah - инициализация счётчика найденных чисел.
- m1: lodsb - чтение байта из массива.
- test al,1 - проверка на чётность числа.
- jz m2 - переход на следующую итерацию цикла, если число чётное.
- stosb - запись найденного числа в массив.
- inc ah - увеличение счётчика найденных чисел.
- m2: loop m1 - переход на начало цикла.
- mov ax,4c00h - выход в DOS.
- int 21h - вызов функции DOS.