数字读取程序集的最小值和最大值

Min and max from numbers read assembly

我刚开始学习汇编,我只是想看看它是如何工作的

我有下面的代码,它应该读取 5 个数字并根据使用的助记符显示最小值或最大值 jgjl

我尝试实现它以读取 5 个数字,然后将最小值 最大值存储在某处,但我不太明白为什么我不能创建minmaxaux 等变量然后将 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 = $"