Assembly 装配最大和最小程序未产生预期结果

Assembly 装配最大和最小程序未产生预期结果,assembly,x86,nasm,Assembly,X86,Nasm,我正在尝试编写一个汇编程序,使用max_min过程查找数组的最小值和最大值。数组以零结尾,告诉程序数组的结尾已经到达 结果如下: 对于数字DW 3,4,5,2,6,0 最高:6 最小:2 然而,我收到的结果是 最多6个: 最小0: Lp2-循环2应该找到最小值,结果应该是2。但是,它没有,结果是0。如何更正此问题,使我得到2作为最小值 %include "io.mac" .STACK 100H .DATA Numbers DW 3,4,5,2,6,0 msg1 db "Max"

我正在尝试编写一个汇编程序,使用max_min过程查找数组的最小值和最大值。数组以零结尾,告诉程序数组的结尾已经到达

结果如下: 对于数字DW 3,4,5,2,6,0 最高:6 最小:2

然而,我收到的结果是 最多6个: 最小0:

Lp2-循环2应该找到最小值,结果应该是2。但是,它没有,结果是0。如何更正此问题,使我得到2作为最小值

%include "io.mac"
.STACK 100H 

.DATA
   Numbers DW 3,4,5,2,6,0
   msg1  db "Max",0
   msg2  db "Min",0

.CODE
.STARTUP
    call max_min

    nwln
    PutStr msg1
    nwln
    PutInt ax
    nwln
    PutStr msg2
    nwln
    PutInt bx
    done:
.EXIT

max_min:
    mov si, Numbers ;point to array
    mov ax, si
lp1:
    cmp word [si],0  
    je next
    add si,2
    cmp ax, [si]        
    jl max

continue:
    jmp lp1

next:
    mov si, Numbers ;point to array
    mov bx, si
lp2:
    cmp word [si],0  
    je complete
    add si,2
    cmp bx, [si]        
    jg min
go:
    jmp lp2

max:
    mov ax, [si]  ;keep track of max
    jmp continue

min:
    mov bx, [si]  ;keep track of min
    PutInt[si]
    jmp go

complete:
    ret     

我在这里犯了一个严重的错误——在没有编译/组装或测试的情况下,盲目地编写我较弱的汇编语言之一。请参考我的上述评论,即如何以更易于理解和维护的格式组织代码。即使这里有bug,它也展示了将代码分解成可管理的块并使用注释来解释发生了什么的想法。编辑注:x86汇编程序很难看!我想要回我的ARM代码:


max_min:
    mov si, Numbers ;point to array

    ; Set Min/Max to first array entry and exit if value is 0
    mov ax, [si]
    mov bx, [si]
    cmp word [si],0  
    je  done

    ; Increment to next value
    add si,2

main_loop:
    ; if number is 0, we are done
    cmp word [si],0  
    je done

    ; if number is greater than or equal to max, don't assign to ax
    cmp ax, [si]        
    jge not_max

    mov ax, [si]

not_max:
    ; if number is less than or equal to min, don't assign to bx
    cmp bx, [si]        
    jle not_min

    mov bx, [si]

not_min:
    ; Next array entry and loop
    add si,2
    jmp main_loop

done:
    ret     

根据您编写的逻辑,它应该返回0。您可以通过编写代码来更正它,该代码会搜索数组中的最小值。这里有很多问题。您太频繁地检查0,并且通常在有趣的位置检查旧数据。在进入下一个和Max时,您也会抛出AX/BX值。第一次通过代码应该将ax/bx建立到数字数组的第一个条目,如果为0,则退出,否则递增数组。之后,主循环应该检查0、检查最小值、检查最大值、增量数组。如果希望进入和退出最小/最大检入代码,请使用调用或直接跳转。