Assembly GCD递归汇编语言X86 MASM

Assembly GCD递归汇编语言X86 MASM,assembly,recursion,masm,greatest-common-divisor,irvine32,Assembly,Recursion,Masm,Greatest Common Divisor,Irvine32,感谢大家的帮助,我做了一些非常好的更改,但现在它给我的答案是+4198498,而不是5,因为我知道第一组值是错误的。我是推错了还是没有正确弹出注册表?我使用ret 8清理了堆栈,它应该为下一次调用清理堆栈,对吗 以下是我到目前为止的情况: TITLE MASM GCD (GCD.asm) ; Description:GCD recursive ; ; Revision date: INCLUDE Irvine32.inc .data myMess

感谢大家的帮助,我做了一些非常好的更改,但现在它给我的答案是+4198498,而不是5,因为我知道第一组值是错误的。我是推错了还是没有正确弹出注册表?我使用ret 8清理了堆栈,它应该为下一次调用清理堆栈,对吗

以下是我到目前为止的情况:

TITLE MASM GCD                      (GCD.asm)


; Description:GCD recursive
; 
; Revision date:

INCLUDE Irvine32.inc
.data
myMessage BYTE "Assignment 7 GCD Recursive style",0dh,0ah,0
myMess2   BYTE "GCD = " ,0dh,0ah,0


;first set of nums
val1 DWORD  5
val2 DWORD  20

;second set of nums
val3 DWORD  24
val4 DWORD  18

;3rd set
val5 DWORD  11
val6 DWORD  7

;4th set
val7 DWORD  432
val8 DWORD  226

;5th set
val9 DWORD  26
val10 DWORD  13

.code
main PROC
    call Clrscr  

    mov  edx,offset myMessage
    call WriteString        ;write message
    call Crlf               ;new line
    push val1
    push val2
    call GCD

    exit
main ENDP

;------------------------------------------------
GCD PROC,
; This finds GCD
; Gets values from stored values
;returns NA

;------------------------------------------------

        xor edx,edx
        mov eax,dword ptr[esp+8] ;dividend
        mov ebx,dword ptr[esp+4] ;divisor
        div ebx              ;eax/ebx
        cmp  edx,0           ;remainder in edx
        je   L1              ;yes: quit
        call GCD             ;no: call GCD agian
    L1:
        mov eax,ebx          ;move the divisor into eax for printing i.e GCD    
        mov  edx,offset myMess2
        call WriteString
        call WriteInt        ;Display GCD WriteInt uses EAX = qutent
        call crlf
        ret 8                ;clean up the stack
GCD ENDP

END main

我看到了一些忽略计算是否正确的事情:

    mov edx,dividend            ;this is value 1    
    mov ebx,divisor         ;this is the divider make sure its smaller number!    
    div ebx                  ;divide int1 by int2
DIV ebx将EDX:EAX除以ebx,因此您应该将股息移动到EAX并清除EDX

您在哪里设置此呼叫的参数

  L1:
    mov eax,ebx          ;EAX = GCD
这里用除数覆盖商,这是故意的吗

    pop edx
    pop ebx

我看不出你把这些寄存器放在哪里了。这是由MASM自动完成的吗?如果没有,您需要推送它们。

首先,我看到一些错误和坏习惯:

GCD PROC,
    dividend:DWORD,
    divisor:DWORD
在我看来,为您的过程声明局部变量是一个坏习惯。来自高级语言的结果

您需要将其放在数据段中。此外,还有一个语法错误,DWORD未初始化,因此您应该这样声明它们:

.DATA ?
dividend  dword ?
divisor dword ?
div指令的寄存器也有问题:

xor edx,edx
mov eax,xxx ;dividend
mov ebx,yyy ;divisor
div ebx     ;eax/ebx
cmp  edx,0  ;remainder in edx
现在,要使用您的值集并对其进行分割,您有不同的选择:

1-在寄存器中手动逐1移动它们

mov eax,dword ptr[val01] ;dividend
mov ebx,dword ptr[val02] ;divisor
2-将它们直接推送到堆栈上,就像函数参数一样

push val01
push val02
call GDC

;in GDC proc
mov eax,dword ptr[esp+8]
mov ebx,dword ptr[esp+4]
3-将它们放在一个数组中,并在其中循环

exercise for you
exercise for you