大会中的单词大小mul

时间:2013-08-06 14:47:10

标签: assembly word nasm

我正在为一个因子操作做一个子程序。我的所有局部变量都是字大小的,因为我使用堆栈来传递值。

[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

1 个答案:

答案 0 :(得分:2)

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