感谢大家的帮助,我已经做了一些非常好的改变,但是现在它给了我+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
答案 0 :(得分:0)
我看到的一些事情(忽略计算是否正确):
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
。
cmp edx,0 ;does remainder = 0 ?
je L1 ;yes: quit
call GCD ;no: call GCD agian
您在哪里设置此通话的参数?
L1:
mov eax,ebx ;EAX = GCD
在这里你用除数覆盖商是故意的吗?
pop edx
pop ebx
我看不到你推动这些寄存器的位置。这是由MASM自动完成的吗?如果不是,你需要推它们。
答案 1 :(得分:0)
首先,我看到一些错误和坏习惯:
GCD PROC,
dividend:DWORD,
divisor:DWORD
在我看来,为你的程序声明局部变量是一个坏习惯 。 (高级语言的结果)
您需要将其放入数据段。另外还有一个语法错误,dwords是未初始化的,因此您应该像这样声明它们:
.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 - 在寄存器中逐个移动它们
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