数字读取程序集的最小值和最大值
Min and max from numbers read assembly
我刚开始学习汇编,我只是想看看它是如何工作的
我有下面的代码,它应该读取 5 个数字并根据使用的助记符显示最小值或最大值 jg
或 jl
我尝试实现它以读取 5 个数字,然后将最小值 和 最大值存储在某处,但我不太明白为什么我不能创建min
、max
和 aux
等变量然后将 ax
寄存器中的最后一个值存储在 aux
中,并将其与 [=17 中的新值进行比较=] 等等
我这样想是因为这是我会在 C program
中使用的方法
#include <stdio.h>
int main(){
int min,max,aux;
scanf("%d%d",&min,&max);
if(min>max){
aux=min;
min=max;
max=min;
}
for(int i=0;i<4;i++){
scanf("%d",&aux);
if(max<aux) max=aux;
if(min>aux) min=aux;
}
printf("%d %d",max,min);
}
但是我不能像我想的那样分配 mov max,ax
我遇到的另一个问题是我无法创建一个函数来调用它进行比较,它只会给出不需要的输出
代码读取5个数字然后开始比较它们并将max/min
值保存在ax
寄存器中然后打印出来
我使用 si
寄存器作为 aux
变量,因为我找不到另一个解决方案(si
寄存器是完全随机选择的)
.model small
.stack 100h
.data
msg1 db "Number 1:$"
msg2 db "Number 2:$"
msg3 db "Number 3:$"
msg4 db "Number 4:$"
msg5 db "Number 5:$"
max db "Max :$"
num1 db ?
num2 db ?
num3 db ?
num4 db ?
num5 db ?
; num6 db ?
.code
mov bl, 00h
mov bh, 9fh
start:
mov ax, @data
mov ds, ax
;nr1
mov dx, offset msg1
mov ah, 09h
int 21h
call readNr
push dx
mov num1,al
;nr2
mov dx, offset msg2
mov ah, 09h
int 21h
call readNr
push dx
mov num2,al
;nr3
mov dx, offset msg3
mov ah, 09h
int 21h
call readNr
push dx
mov num3,al
;nr4
mov dx, offset msg4
mov ah, 09h
int 21h
call readNr
push dx
mov num4,al
;nr5
mov dx, offset msg5
mov ah, 09h
int 21h
call readNr
push dx
mov num5,al
;max
mov dx, offset max
mov ah, 09h
int 21h
; ;compar:
pop ax
pop dx
mov si,dx
cmp ax,si
jg exit
jmp maxim
max:
mov ax,si
;jmp exit
exit:
mov ax,ax
;loop compar
xor si,si
pop dx
mov si,dx
cmp ax,si
jg exit1
jmp maxim1
maxim1:
mov ax,si
;jmp exit
exit1:
mov ax,ax
;loop compar
xor si,si
pop dx
mov si,dx
cmp ax,si
jg exit2
jmp maxim2
maxim2:
mov ax,si
;jmp exit
exit2:
mov ax,ax
xor si,si
pop dx
mov si,dx
cmp ax,si
jg exit3
jmp maxim3
maxim3:
mov ax,si
;jmp exit
exit3:
mov ax,ax
call displayNr
jmp skipProceduri
readNr proc ;number will be created in dx
xor bx, bx
xor dx, dx
xor cx, cx
mov cx, 10
readCf:
mov ah, 01h
int 21h
cmp al, 13
je finish
sub al, 48
mov bl, al
mov ax, dx
mul cx
add ax, bx
mov dx, ax
jmp readCf
finish:
ret
endp
displayNr proc
mov bx, 10
xor cx, cx
descNr:
xor dx, dx
div bx
inc cx
push dx
cmp ax, 0
je displaynr
jmp descNr
displaynr:
pop dx
add dl, 48
mov ah, 02h
int 21h
loop displaynr
ret
endp
skipProceduri:
mov ah, 4ch
int 21h
end start
你的汇编代码似乎是正确的!不过它确实包含很多冗余指令。
你的解决方案从压入堆栈的 5 个数字开始工作,值得一个 循环:
pop ax ; Consider 5th number as current max
mov cx, 4
TheLoop:
pop dx ; 4th, 3rd, 2nd, and 1st number
cmp dx, ax
jng NotGreater
mov ax, dx ; Set new max
NotGreater:
loop TheLoop
call displayNr
使用基于内存的变量
But I can't assign as I thought like mov max,ax
当您像 max db ?
那样定义 max 变量时,汇编程序会抱怨大小不匹配。只需将所有变量定义为单词:
max dw ?
min dw ?
aux dw ?
注意您如何定义标签!该代码已经有一个 max 标签来表示一些消息 (max db "Max :$"
)。在下面的代码片段中查看我是如何解决这个问题的。
可以从一个循环中同时获得最大值和最小值。
下一段代码还演示了基于内存的变量的使用,尽管从寄存器工作会更有效(避免使用缓慢的 LOOP
指令)!
mov cx, 5
TheLoop:
pop ax ; 5th, 4th, 3rd, 2nd, and 1st number
cmp ax, max
jng NotGreater
mov max, ax ; Set new maximum
NotGreater:
cmp ax, min
jnl NotLess
mov min, ax ; Set new minimum
NotLess:
loop TheLoop
mov dx, offset msgMax
mov ah, 09h
int 21h
max ax, max
call displayNr
mov dx, offset msgMin
mov ah, 09h
int 21h
max ax, min
call displayNr
...
max dw -32768 ; Smallest word integer
min dw 32767 ; Biggest word integer
msgMax db "Max = $"
msgMin db 13, 10, "Min = $"
我刚开始学习汇编,我只是想看看它是如何工作的
我有下面的代码,它应该读取 5 个数字并根据使用的助记符显示最小值或最大值 jg
或 jl
我尝试实现它以读取 5 个数字,然后将最小值 和 最大值存储在某处,但我不太明白为什么我不能创建min
、max
和 aux
等变量然后将 ax
寄存器中的最后一个值存储在 aux
中,并将其与 [=17 中的新值进行比较=] 等等
我这样想是因为这是我会在 C program
#include <stdio.h>
int main(){
int min,max,aux;
scanf("%d%d",&min,&max);
if(min>max){
aux=min;
min=max;
max=min;
}
for(int i=0;i<4;i++){
scanf("%d",&aux);
if(max<aux) max=aux;
if(min>aux) min=aux;
}
printf("%d %d",max,min);
}
但是我不能像我想的那样分配 mov max,ax
我遇到的另一个问题是我无法创建一个函数来调用它进行比较,它只会给出不需要的输出
代码读取5个数字然后开始比较它们并将max/min
值保存在ax
寄存器中然后打印出来
我使用 si
寄存器作为 aux
变量,因为我找不到另一个解决方案(si
寄存器是完全随机选择的)
.model small
.stack 100h
.data
msg1 db "Number 1:$"
msg2 db "Number 2:$"
msg3 db "Number 3:$"
msg4 db "Number 4:$"
msg5 db "Number 5:$"
max db "Max :$"
num1 db ?
num2 db ?
num3 db ?
num4 db ?
num5 db ?
; num6 db ?
.code
mov bl, 00h
mov bh, 9fh
start:
mov ax, @data
mov ds, ax
;nr1
mov dx, offset msg1
mov ah, 09h
int 21h
call readNr
push dx
mov num1,al
;nr2
mov dx, offset msg2
mov ah, 09h
int 21h
call readNr
push dx
mov num2,al
;nr3
mov dx, offset msg3
mov ah, 09h
int 21h
call readNr
push dx
mov num3,al
;nr4
mov dx, offset msg4
mov ah, 09h
int 21h
call readNr
push dx
mov num4,al
;nr5
mov dx, offset msg5
mov ah, 09h
int 21h
call readNr
push dx
mov num5,al
;max
mov dx, offset max
mov ah, 09h
int 21h
; ;compar:
pop ax
pop dx
mov si,dx
cmp ax,si
jg exit
jmp maxim
max:
mov ax,si
;jmp exit
exit:
mov ax,ax
;loop compar
xor si,si
pop dx
mov si,dx
cmp ax,si
jg exit1
jmp maxim1
maxim1:
mov ax,si
;jmp exit
exit1:
mov ax,ax
;loop compar
xor si,si
pop dx
mov si,dx
cmp ax,si
jg exit2
jmp maxim2
maxim2:
mov ax,si
;jmp exit
exit2:
mov ax,ax
xor si,si
pop dx
mov si,dx
cmp ax,si
jg exit3
jmp maxim3
maxim3:
mov ax,si
;jmp exit
exit3:
mov ax,ax
call displayNr
jmp skipProceduri
readNr proc ;number will be created in dx
xor bx, bx
xor dx, dx
xor cx, cx
mov cx, 10
readCf:
mov ah, 01h
int 21h
cmp al, 13
je finish
sub al, 48
mov bl, al
mov ax, dx
mul cx
add ax, bx
mov dx, ax
jmp readCf
finish:
ret
endp
displayNr proc
mov bx, 10
xor cx, cx
descNr:
xor dx, dx
div bx
inc cx
push dx
cmp ax, 0
je displaynr
jmp descNr
displaynr:
pop dx
add dl, 48
mov ah, 02h
int 21h
loop displaynr
ret
endp
skipProceduri:
mov ah, 4ch
int 21h
end start
你的汇编代码似乎是正确的!不过它确实包含很多冗余指令。
你的解决方案从压入堆栈的 5 个数字开始工作,值得一个 循环:
pop ax ; Consider 5th number as current max
mov cx, 4
TheLoop:
pop dx ; 4th, 3rd, 2nd, and 1st number
cmp dx, ax
jng NotGreater
mov ax, dx ; Set new max
NotGreater:
loop TheLoop
call displayNr
使用基于内存的变量
But I can't assign as I thought like
mov max,ax
当您像 max db ?
那样定义 max 变量时,汇编程序会抱怨大小不匹配。只需将所有变量定义为单词:
max dw ?
min dw ?
aux dw ?
注意您如何定义标签!该代码已经有一个 max 标签来表示一些消息 (max db "Max :$"
)。在下面的代码片段中查看我是如何解决这个问题的。
可以从一个循环中同时获得最大值和最小值。
下一段代码还演示了基于内存的变量的使用,尽管从寄存器工作会更有效(避免使用缓慢的 LOOP
指令)!
mov cx, 5
TheLoop:
pop ax ; 5th, 4th, 3rd, 2nd, and 1st number
cmp ax, max
jng NotGreater
mov max, ax ; Set new maximum
NotGreater:
cmp ax, min
jnl NotLess
mov min, ax ; Set new minimum
NotLess:
loop TheLoop
mov dx, offset msgMax
mov ah, 09h
int 21h
max ax, max
call displayNr
mov dx, offset msgMin
mov ah, 09h
int 21h
max ax, min
call displayNr
...
max dw -32768 ; Smallest word integer
min dw 32767 ; Biggest word integer
msgMax db "Max = $"
msgMin db 13, 10, "Min = $"