Заполнить массив 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

Объяснение кода листинга программы

  1. Объявление переменной massA и инициализация массива значений: massA db 0,3,4,6,7
  2. Объявление переменной sizeA как размер массива massA: sizeA equ $-dbA
  3. Объявление переменной massB и инициализация массива значений: massB db 1,2,5,8,10
  4. Объявление переменной sizeB как размер массива massB: sizeB equ $-dbB
  5. Объявление переменной massC как массив суммарного размера sizeA+sizeB и инициализация его нулями: massC db (sizeA+sizeB)dup (0)
  6. Начало сегмента кода: .code
  7. Перемещение указателя данных в регистр ds: mov ax,@data и mov ds,ax
  8. Инициализация указателей на массивы: lea si, massA, lea di, massB, lea bx, massC
  9. Загрузка размерности массивов massA и massB в регистры: mov dx, sizeA, mov cx, sizeB
  10. Начало цикла l1
  11. Загрузка значений из массивов massA и massB в регистры al и ah
  12. Сравнение значений из массивов
  13. Переход к метке l2 если значение из massA больше значения из massB, иначе продолжение выполнения цикла
  14. Обмен значений и указателей, если значение из massB больше значения из massA
  15. Помещение значения из massA в массив massC и увеличение указателей и счетчика цикла
  16. Проверка окончания цикла l1 и переход к метке l3, если цикл ещё не завершен
  17. Переназначение размерности массива massB и указателя si для продолжения заполнения массива massC
  18. Помещение значений из massB в массив massC и увеличение указателей и счетчика цикла
  19. Проверка окончания цикла l3 и завершение сегмента кода: mov ax,4C00h и int 21h

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы