Одномерный массив - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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