Одномерный массив - Assembler
Формулировка задачи:
Дан числовой вектор размера m. Найти минимальный из положительных и максимальный из отрицательных элементов.
можно ли как то переделать?
.model small .486 ochistka macro s push di mov di,0 m0: mov s[di],' ' add di,1 cmp di,7 jnz m0 pop di endm vivod macro stroka mov ah,9 lea dx,stroka int 21h endm Vvodc macro num mov ah,0Ah lea dx,max int 21h mov bl,len mov bh,0 dec bl cmp bl,0 je n0 n: mov al,s2[bx] sub al,30h mov ah,0 mul mult10 dec bx add num,ax mov ax,10 mul mult10 mov mult10,ax cmp bx,0 jne n n0: cmp s2[bx],'-' je n2 mov al,s2[bx] sub al,30h mov ah,0 mul mult10 add num,ax n2: endm vivodc macro var mov ax,var push ax ;сохраняем число из ax в стеке mov si,10 mov di,3 ;di будем использовать в качестве индекса строки s. mov dx,0 ;Чистим регистр dx cmp ax,0 ;если ax- неотрицательный, переходим на метку m jge m neg ax ;меняем знак ax m: div si ;делим ax:dx на 10 add dl,30h ;В dx появится остаток от деления. Преобразуем его в код символа соотв. числа. mov s[di],dl ;помещаем код символа из dl в s[di] mov dx,0 ;Чистим dx dec di ;уменьшаем di на один cmp ax,0 ;сравниваем ax с нулём jne m ;если ax неравен нулю переходим на метку m pop ax ;извлекаем первоначальное значение из стэка для проверки знака cmp ax,0 ;сравниваем с нулём jge m1 ;если число отрицательное, добавляем в строку s символ '-' mov s[di],'-' m1: mov ah,9 ;Выводим строку, которая содержит преобразованное число. lea dx,s int 21h endm Nachalo macro mov ax,@data mov ds,ax endm Konets macro mov ah,4ch int 21h endm Nomer macro inc si mov dx,si mov ah,2 add dl,30h int 21h endm .stack 100 .data num dw ? mas dw -8,54,1000 dw 1,2,-5234 dw 4,-5,678 mes1 db 'Vvedite chislo:','$' mes2 db ' stolbets udovletvoriaet usloviiu',10,13,'$' mes3 db ' stolbets ne udovletvoriaet usloviiu',10,13,'$' s db 7 dup(' '),'$' new db 10,13,'$' max db 8 len db ? s2 db 8 dup(?) mult10 dw 1 .code Nachalo mov cx,3 m2: push cx mov cx,3 m3: vivodc mas[bx] ochistka s add bx,2 loop m3 pop cx mov ah,9 lea dx,new int 21h loop m2 Vivod mes1 Vvodc num Vivod new mov di,0 mov si,0 mov cx,3 m8: mov di,0 mov ax,si mov bl,2 mul bl add di,ax push cx mov cx,3 m4: mov ax,mas[di] cmp ax,0 jge m5 neg ax m5: cmp ax,num jge m6 add di,6 loop m4 Nomer Vivod mes2 jmp m7 m6: Nomer Vivod mes3 m7: pop cx loop m8 Konets end
Решение задачи: «Одномерный массив»
textual
Листинг программы
.model small .486 ochistka macro s push di mov di,0 m0: mov s[di],' ' add di,1 cmp di,7 jnz m0 pop di endm vivod macro stroka mov ah,9 lea dx,stroka int 21h endm Vvodc macro num mov ah,0Ah lea dx,max int 21h mov bl,len mov bh,0 dec bl cmp bl,0 je n0 n: mov al,s2[bx] sub al,30h mov ah,0 mul mult10 dec bx add num,ax mov ax,10 mul mult10 mov mult10,ax cmp bx,0 jne n n0: cmp s2[bx],'-' je n2 mov al,s2[bx] sub al,30h mov ah,0 mul mult10 add num,ax n2: endm vivodc macro var mov ax,var push ax ;сохраняем число из ax в стеке mov si,10 mov di,3 ;di будем использовать в качестве индекса строки s. mov dx,0 ;Чистим регистр dx cmp ax,0 ;если ax- неотрицательный, переходим на метку m jge m neg ax ;меняем знак ax m: div si ;делим ax:dx на 10 add dl,30h ;В dx появится остаток от деления. Преобразуем его в код символа соотв. числа. mov s[di],dl ;помещаем код символа из dl в s[di] mov dx,0 ;Чистим dx dec di ;уменьшаем di на один cmp ax,0 ;сравниваем ax с нулём jne m ;если ax неравен нулю переходим на метку m pop ax ;извлекаем первоначальное значение из стэка для проверки знака cmp ax,0 ;сравниваем с нулём jge m1 ;если число отрицательное, добавляем в строку s символ '-' mov s[di],'-' m1: mov ah,9 ;Выводим строку, которая содержит преобразованное число. lea dx,s int 21h endm Nachalo macro mov ax,@data mov ds,ax endm Konets macro mov ah,4ch int 21h endm Nomer macro inc si mov dx,si mov ah,2 add dl,30h int 21h endm .stack 100 .data num dw ? mas dw -8,54,1000 dw 1,2,-5234 dw 4,-5,678 mes1 db 'Vvedite chislo:','$' mes2 db ' stolbets udovletvoriaet usloviiu',10,13,'$' mes3 db ' stolbets ne udovletvoriaet usloviiu',10,13,'$' s db 7 dup(' '),'$' new db 10,13,'$' max db 8 len db ? s2 db 8 dup(?) mult10 dw 1 .code Nachalo mov cx,3 m2: push cx mov cx,3 m3: vivodc mas[bx] ochistka s add bx,2 loop m3 pop cx mov ah,9 lea dx,new int 21h loop m2 Vivod mes1 Vvodc num Vivod new mov di,0 mov si,0 mov cx,3 m8: mov di,0 mov ax,si mov bl,2 mul bl add di,ax push cx mov cx,3 m4: mov ax,mas[di] cmp ax,0 jge m5 neg ax m5: cmp ax,num jge m6 add di,6 loop m4 Nomer Vivod mes2 jmp m7 m6: Nomer Vivod mes3 m7: pop cx loop m8 Konets end
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д