Заполнить массив 3 элементами из массивов 1 и 2 по возрастанию - Assembler
Формулировка задачи:
Программа заполняет массив 3, элементами из массива 1 и 2 по возрастанию, но где-то ошибка не могу найти, либо регистры не те для массива 3, либо 1 не те.
.model small
.stack 100h
.data
A db 0,3,4,6,7
B db 1,2,5,8,10
C db 10 dup (0)
len equ 5
.code
start:
mov ax, @data
mov ds, ax
xor si, si
xor di, di
xor bp, bp
mov cx, len
mov si, 0
mov bp, 0
minA:
mov al, A[si]
cmp ah, al
jle min
jmp pov
minB:
mov ah, B[di]
cmp bp, ax
jle min
jmp pov
min:
cmp si, di
jle minC
minC:
mov bp, si
mov bp, di
jmp pov
pov:
inc si
inc di
mov ax,4c00h
int 21h
end startРешение задачи: «Заполнить массив 3 элементами из массивов 1 и 2 по возрастанию»
textual
Листинг программы
.model small .stack org 100h .data massA db 0,3,4,6,7 sizeA equ $-dbA massB db 1,2,5,8,10 sizeB equ $-dbB massC db (sizeA+sizeB)dup (0) .code begin: mov ax,@data mov ds,ax lea si,massA lea di,massB lea bx,massC mov dx,sizeA mov cx,sizeB l1: mov al,[si] mov ah,[di] cmp al,ah jle l2 xchg dx,cx xchg si,di xchg ah,al l2: mov [bx],al inc bx inc si loop l1 mov cx,dx mov si,di l3: mov al,[si] mov [bx],al inc bx inc si loop l3 mov ax,4C00h int 21h end begin
Объяснение кода листинга программы
- Объявление переменной
massAи инициализация массива значений:massA db 0,3,4,6,7 - Объявление переменной
sizeAкак размер массиваmassA:sizeA equ $-dbA - Объявление переменной
massBи инициализация массива значений:massB db 1,2,5,8,10 - Объявление переменной
sizeBкак размер массиваmassB:sizeB equ $-dbB - Объявление переменной
massCкак массив суммарного размераsizeA+sizeBи инициализация его нулями:massC db (sizeA+sizeB)dup (0) - Начало сегмента кода:
.code - Перемещение указателя данных в регистр
ds:mov ax,@dataиmov ds,ax - Инициализация указателей на массивы:
lea si, massA,lea di, massB,lea bx, massC - Загрузка размерности массивов
massAиmassBв регистры:mov dx, sizeA,mov cx, sizeB - Начало цикла
l1 - Загрузка значений из массивов
massAиmassBв регистрыalиah - Сравнение значений из массивов
- Переход к метке
l2если значение изmassAбольше значения изmassB, иначе продолжение выполнения цикла - Обмен значений и указателей, если значение из
massBбольше значения изmassA - Помещение значения из
massAв массивmassCи увеличение указателей и счетчика цикла - Проверка окончания цикла
l1и переход к меткеl3, если цикл ещё не завершен - Переназначение размерности массива
massBи указателяsiдля продолжения заполнения массиваmassC - Помещение значений из
massBв массивmassCи увеличение указателей и счетчика цикла - Проверка окончания цикла
l3и завершение сегмента кода:mov ax,4C00hиint 21h