递增整数值,输出意外

时间:2013-05-13 20:33:18

标签: assembly x86

我正在开发一个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的正确==>左推模式,我希望分母是相同的。

我在Linux上使用x86处理器,使用nasm进行汇编,使用gcc进行链接。

2 个答案:

答案 0 :(得分: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 ,并且朋友会占用4个字节而不是1个字节。当您稍后 inc 推送数据为 dwords (4个字节)时,操作的大小和数据的大小必须匹配。< / p>

否则,当你增加 numInc 只需要一个字节作为 dword 时,如果 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”来自总和

答案 1 :(得分:1)

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

当您执行push dword [numInc]之类的操作时,您实际推送的是numInc的值及其后的3个字节(numDecnumSum等等其他人)。

将变量声明为dwords,或对它们执行字节操作。