0

我正在为阶乘运算制作子程序。我所有的局部变量都是字长,因为我使用堆栈进行值传递。

[ebp+4] is the counter/decrementing multiplier
[ebp-2] is the multiplicand

目前,我有这样的代码块:

while1:

    cmp byte[ebp+4], 1
    je exit1
    dec word[ebp+4]
    mov ax, [ebp-2]
    mov dx, 0
    mul byte[ebp+4]
    mov word[ebp-2], ax

    jmp while1

它具有以下输入和输出结果:

1 -> 02561
2 -> 2
3 -> 6
4 -> 24
5 -> 120
6 -> 208
7 -> 176
8 -> 128

仅从 2 到 5 是正确的。我意识到我正在做一个字节大小的乘法,因为mul byte[ebp+4],因此阻碍了 6 的结果!= 720。所以我mul byte[ebp+4]改为mul word[ebp+4]

while1:

    cmp byte[ebp+4], 1
    je exit1
    dec word[ebp+4]
    mov ax, [ebp-2]
    mov dx, 0
    mul word[ebp+4]
    mov word[ebp-2], ax

    jmp while1

然后它具有以下输入和输出结果:

1 -> 02561
2 -> 07682
3 -> 28166
4 -> 62488
5 -> 46200
6 -> 60112
7 -> 35760
8 -> 15744

我究竟做错了什么?我在mul操作之前已经在dx中清除了,但为什么它不能正常工作?

注意:我有正确的打印例程,将字长变量打印为 ASCII 中的 5 个字符以用于标准输出。另外,我有一个特例 0!在迭代代码块之前在cmp中完成。

我使用的是 Ubuntu 13 x86 和 NASM。


更新。这是while1顶部的代码块:

fact: 

    mov ebp, esp
    sub esp, 2
    mov ax, [ebp+4]
    mov word[ebp-2], ax

    ; checks if num is zero
    cmp byte[ebp+4], 0
    je one
4

1 回答 1

2

如果cmp word[ebp+4], 1不起作用,则表明 word[ebp+4] 中的内容可能不是您所期望的或应该是的。字的高字节显然不是0。改用字节比较在某处掩盖了一个问题。因此,您需要检查该位置的单词发生了什么。

于 2013-08-06T15:33:21.677 回答