2013-05-13 97 views
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的右推模式,我希望分母是相同的。

我在Linux上使用一个x86处理器使用nasm来汇编和gcc链接。

回答

2

变化

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

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

如果你要与来增加他们:

inc  dword [numInc] 

通过改变分贝DD你做numInc和朋友占用四个字节而不是一个。当你以后公司数据为dword(4字节)操作的大小和数据的大小必须匹配。

否则,当你增加一个numInc只需要一个字节为DWORD你就要揍字节以下,如果numInc是255。当你把一个字节numIncdword,你实际上也在推动它后面的三个字节。

当打印结果,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”分别来自

+0

谢谢,已经工作得更好!关于印刷输出的任何想法“misordering”? – d0rmLife 2013-05-13 20:53:38

+0

@ d0rmLife,排序实际上看起来和我预期的一样。推入顺序:numInc,sum,numDec,将“sum”映射到格式字符串中的两个“%5d”。 – scottt 2013-05-13 20:58:02

+0

是的,我同意,但出于某种原因,我必须扭转输出的四个顺序的顺序,以达到预期的效果......! – d0rmLife 2013-05-13 21:00:49

1

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

当你做这样的事情push dword [numInc],你实际上是推的numInc的价值和它后面的3个字节(numDecnumSum,和任何其他)。

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

+0

如何只推送变量内容? (通过'printf'来打印) – d0rmLife 2013-05-13 20:54:56

+0

@ d0rmLifem,可以通过使变量占用4个字节(将“db”更改为“dd”)并按下4个字节(推入双字)来“推送变量内容”。即数据和操作的大小必须匹配。 – scottt 2013-05-13 21:05:24

+0

或者像@ d0rmLife所说的那样,或者使用像'movzx eax,byte ptr [numInc]'''push push eax' – Michael 2013-05-14 05:08:49