【发布时间】:2013-06-02 21:36:45
【问题描述】:
我想写一个程序,你输入两个数字并得到最大公约数 使用以下伪代码:
Euclid(a, b)
while (b != 0)
{
r = a mod b
a = b
b = r
}
return a
这是我当前的版本,它给了我一个错误:52:操作码和操作数的无效组合。
%include "asm_io.inc"
segment .data
prompt1 db "Enter a number: ", 0
prompt2 db "Enter another number: ", 0
segment .bss
input1 resd 1
input2 resd 1
segment .text
global asm_main
asm_main:
enter 0,0 ; setup routine
pusha
mov eax, prompt1
call print_string
call read_int
push eax
mov eax, prompt2
call print_string
call read_int
push eax
call euclid
call print_int
popa
mov eax, 0 ; return back to C
leave
ret
; Function euclid
euclid:
push ebp
mov ebp, esp
mov ebx, [ebp+8]
mov ecx, [ebp+12]
_while:
div ecx,ebx
mov ebx,ecx
mov ecx,edx
cmp ecx,0
jz _end
jmp _while
_end:
mov eax,ebx
pop ebp
ret
我对汇编和 nasm 完全陌生,希望您能帮助我找出错误或错误的语法。
【问题讨论】:
-
在问题本身中发布相关代码。另外,您对装配的哪个部分有问题?
-
好吧,我猜它是 while 循环,也许是堆栈
-
您需要更加具体。堆栈有什么问题?您推送 2 个项目,然后将它们放入寄存器中。如果您要与
0进行比较,那么您会希望对0有所减少。我在_while的任何地方都看不到DEC。 :) -
好吧,我虽然在运行循环时 ecx 在某个时候得到 0
-
我的 asm 有点生锈,但看起来你的
euclid例程计算了答案,将其放入eax,然后当它返回时,调用例程用popa破坏答案在任何地方使用或保存之前。
标签: assembly nasm greatest-common-divisor