Формирование массива из 10 двухбайтных чисел, переписать во второй массив все положительные числа, страница 6

            xor dx,dx                    ; очистка регистра dx

            mov al,bcd1[di]                      ; запись в регистр al di-ого разряда числа bcd1

            mov dl,bcd2[di]                     ; запись в регистр dl di-ого разряда числа bcd2

            cmp al,dl                    ; сравнение вида al<=dl и если равно, то...

            je equal                       ; ...переход на метку equal

            jl signum                    ; ...если меньше, то переход на метку signum

            jmp precycle              ; ...в противном случае переход на метку precycle

equal:                          ; пользовательская метка equal

            dec si                          ; декремент si

            loop compare             ; если cx еще не равно 0, то cx:=cx-1 и переход к compare

signum:                                  ; пользовательская метка signum

            mov sign,1                  ; запись в переменную-знак sign числа 1

precycle:                     ; пользовательская метка precycle

            cmp sign,1                  ; сравнение вида sign=1 и если true, то...

            jne forward                 ; ...в противном случае переход на метку forward

bcycle:                                    ; пользовательская метка bcycle

            xor ax,ax                     ; очистка регистра ax

            xor dx,dx                    ; очистка регистра dx

            mov al,bcd1[si]                      ; запись в младший байт регистра ax si-ого разряда числа bcd1

            mov dl,bcd2[si]                      ; запись в младший байт регистра dx si-ого разряда числа bcd2

            mov num1[si-2],dl     ; запись в [si-2]-й разряд числа num1 содержимого регистра dl

            mov num2[si-2],al      ; запись в [si-2]-й разряд числа num2 содержимого регистра al

            inc si                           ; инкремент si

            loop bcycle                 ; если cx еще не равно 0, то cx:=cx-1 и переход к bcycle,...

            mov si,0                      ; запись в индексный регистр si нуля

            mov cx,10                   ; инициализация счетчика циклов cx десятью

            jmp cycle                    ; безусловный переход к основному циклу cycle

forward:                      ; пользовательская метка forward

fcycle:                        ; пользовательская метка fcycle

            xor ax,ax                     ; очистка регистра ax

            xor dx,dx                    ; очистка регистра dx

            mov al,bcd1[si]                      ; запись в младший байт регистра ax si-ого разряда числа bcd1

            mov dl,bcd2[si]                      ; запись в младший байт регистра dx si-ого разряда числа bcd2

            mov num1[si-2],al      ; запись в [si-2]-й разряд числа num1 содержимого регистра al

            mov num2[si-2],dl     ; запись в [si-2]-й разряд числа num2 содержимого регистра dl

            inc si                           ; инкремент si

            loop fcycle                 ; если cx еще не равно 0, то cx:=cx-1 и переход к fcycle,...

            mov si,0                      ; запись в индексный регистр si нуля

            mov cx,10                   ; инициализация счетчика циклов cx десятью

cycle:                          ; пользовательская метка cycle

            xor ax,ax                     ; очистка регистра ax                     

            xor dx,dx                    ; очистка регистра dx

            mov al,num1[si]                     ; запись в регистр al si-ого разряда числа num1

            mov dl,num2[si]                     ; запись в регистр dl si-ого разряда числа num2

            cmp al,dl                    ; сравнение вида al<dl и если true, то...

            jl less                          ; ...переход на метку less

            sub al,dl                      ; ...в противном случае разность вида al:=al-dl

            mov res[si],al             ; запись в si-й разряд результата res полученной разности al

            inc si                           ; инкремент si

            loop cycle                   ; если cx еще не равно 0, то cx:=cx-1 и переход к cycle        

            jmp endprog               ; ...в противном случае переход к концу программы endprog

less:                            ; пользовательская метка less

            add al,10                     ; сумма вида al:=al+10

            sub al,dl                      ; разность вида al:=al-dl

            mov res[si],al             ; запись в si-й разряд результата res полученной разности al

            inc si                           ; инкремент si (т. е. переход к следующему разряду)

            mov di,si                     ; запись в индексный регистр di содержимого регистра si

            cmp num1[si],0                      ; сравнение следующего разряда числа num1 с нулем...

            je zero                         ; ...и если true, то переход на метку zero

            sub num1[si],1                       ; ...в противном случае вычитаем 1 из si-ого разряда числа

            loop cycle                   ; если cx еще не равно 0, то cx:=cx-1 и переход к cycle        

            jmp endprog               ; ...в противном случае переход к концу программы endprog 

zero:                           ; пользовательская метка zero

            mov num1[di],9                     ; запись в di-й разряд числа num1 девятки

            inc di                          ; инкремент di (т. е. переход к следующему разряду)

            cmp num1[di],0                     ; сравнение следующего разряда числа num1 с нулем...

            je zero                         ; ...и если true, то переход на метку zero

            sub num1[di],1                       ; ...в противном случае вычитаем 1 из di-ого разряда числа

            loop cycle                   ; если cx еще не равно 0, то cx:=cx-1 и переход к cycle        

endprog:                     ; пользовательская метка конца программы endprog

            call output                  ; вызов процедуры output

            mov ax,4c00h             ; формирование функции стандартного выхода                                  

            int 21h                        ; формирование прерывания типа 21h и стандартный выход 

;Результат работы в массиве res:=(num1=bcd1)-(num2=bcd2) (знак минус определяется через sign=1 или sign=0)

main endp                              ; конец процедуры main

end main                                ; конец программы с точкой входа main