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

.stack 256h                                                     ; упрощенная директива для 256-байтного сегмента стека                                            

.code                                                              ; упрощенная директива сегмента кода

keyin proc                  ; начало процедуры keyin

            mov dx,offset buff      ; инициализация dx адресом начала буфера ввода buff

            mov ah,0Ah                ; формирование функции буферизованного ввода с клавиатуры

            int 21h                        ; программное прерывание типа 21h

            mov dx,10                  ; инициализация dx символом "Line Feed" ("Перевод Строки")

            mov ah,02h                 ; формирование функции вывода единичного символа на экран

            int 21h                        ; программное прерывание типа 21h

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

            mov cl,buff[1]                        ; в младший байт регистра cx помещается число введенных символов

            mov dl,buff[1]                        ; в младший байт регистра dx помещается число введенных символов

            cmp buff[2],2Dh                    ; проверка наличия знака "минус" (2D) в первом символе буфера...

            jne notneg                   ; ...если false, то переход на метку notneg

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

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

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

            mov negf,1                 ; флаг отрицательности равен единице (true)

            jmp beg                                  ; безусловный переход на метку beg

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

            mov negf,0                 ; флаг отрицательности равен нулю (false)

            mov si,2                      ; инициализация индексного регистра si двойкой

beg:

            push 1                         ; запись в стек числа 1

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

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

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

            push 10                                   ; запись в стек числа 10      

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

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

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

            push 100                     ; запись в стек числа 100    

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

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

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

            push 1000                   ; запись в стек числа 1000  

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

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

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

            push 10000                 ; запись в стек числа 10000

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

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

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

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

            mov al,buff[si]                       ; запись в al si-ого символа буфера buff

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

            mov ah,0                     ; обнуление ah

            pop bx                         ; запись в регистр bx верхнего элемента стека

            mul bx                        ; умножение вида (dx:ax):=ax*bx

            add mass1[di],ax        ; сумма вида mass1[di]:=mass1[di]+ax

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

            loop stend                   ; если cx еще не равно нулю, то cx:=cx-1 и переход к метке stend

            cmp negf,1                 ; проверка флага отрицательности, если false, то...

            jne endscan                 ; ...переход к концу процедуры

            neg mass1[di]             ; в противном случае обращение знака у di-ого элемента массива mass1

endscan:

            ret                               ; возврат в основную процедуру

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

outnum proc               ; начало процедуры outnum

            mov ah,9                     ; формирование функции вывода строки на экран

            mov dx,offset mess2  ; инициализация dx адресом начала символьной цепочки mess2

            int 21h                        ; программное прерывание типа 21h

            mov si,0                      ; инициализация индексного регистра si нулем

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

            mov cx,0                     ; инициализация счетчика cx нулем

            mov ax,mass2[si]       ; запись в регистр ax si-ого элемента массива array2

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

            xor dx,dx                    ; очистка dx

            mov bx,10                  ; запись в регистр bx числа 10

            div bx                         ; деление вида (dx.ax):=ax/bx

            xor bx,bx                    ; очистка bx

            mov bx,dx                  ; запись старшей части результата деления в bx

            push bx                                   ; запись содержимого bx в стек

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

            cmp ax,0                     ; сравнение вида ax=0, и если false, то...

            jne star1                      ; ...переход на метку star1

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

            pop dx                         ; запись в dx верхнего элемента стека

            add dx,30h                  ; сумма вида dx:=dx+30h

            mov ah,02h                 ; формирование функции вывода символа на экран

            int 21h                        ; программное прерывание типа 21h

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

            cmp cx,0                     ; сравнение вида cx=0, и если false, то...

            jne star2                      ; ...переход на метку star2

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