我正在开发一个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进行链接。
答案 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个字节(numDec
,numSum
等等其他人)。
将变量声明为dwords,或对它们执行字节操作。