0

我正在开发一个 x86 ASM 程序,其中部分输出是我在各个阶段一直在递增的数字。输出数字几乎不是我所期望的......无法追踪错误。

初始化如下:

SECTION .data
    ...
    numInc: db 0
    numDec: db 0
    numSum: db 0

增量如:

    inc     dword [numInc]
    inc     dword [numSum]
    push    stringOpt3
    call    printf
    add     esp, 4

打印如下:

    push    dword [numInc]
    push    dword [sum]
    push    dword [numDec]
    push    dword [sum]
    push    outputString
    call    printf
    add     esp,20

其中 outputString 是:(自然也在 .data 部分中)

    outputString: db `\nSet{1}: %5d/%d\nSet{2}: %5d/%d\n`,10,0

输出类似于:

Set{1}: 134521233/514
Set{2}: 134521233/131584

所以,我期待结果在 0/3 1/3 ... 附近!另外,考虑到 printf 的右==>左推模式,我希望分母是相同的。

我在带有 x86 处理器的 Linux 上,使用 nasm 进行组装和 gcc 进行链接。

4

2 回答 2

2

改变

numInc: db 0
numDec: db 0
numSum: db 0

numInc: dd 0
numDec: dd 0
numSum: dd 0

如果你要增加它们:

inc     dword [numInc]

通过将db更改为dd,您可以使numInc和朋友占用四个字节而不是一个。当您以后inc数据作为dwords(4 字节)推送时,操作的大小和数据的大小必须匹配。

否则,当您增加一个仅将一个字节作为dword的numInc时,如果numInc为 255,您将破坏它后面的字节。当您将一个字节numInc作为dword推送时,您实际上是在推送它后面的三个字节也是。

打印结果时,C 代码:

printf(outputString, numDec, sum, numInc, sum);

应该翻译成:

push    dword [sum]
push    dword [numInc]
push    dword [sum]
push    dword [numDec]
push    outputString
call    printf
add     esp,20

我假设这就是您期望获得 0/3, 1/3 作为输出的方式,因为两个“3”来自sum

于 2013-05-13T20:50:26.483 回答
1

您的一些变量(例如numInc)是字节(db),但您使用它们就像它们是双字一样。

当你做类似push dword [numInc]的事情时,你实际上推动的是它的值numInc和它后面的 3 个字节(numDecnumSum和其他任何东西)。

要么将变量声明为双字,要么对它们执行字节操作。

于 2013-05-13T20:50:38.187 回答