2010-03-15 76 views
1

我知道这有点迟钝,但我无法弄清楚。我正在调试这个:grdb不工作变量

xor eax,eax 

mov ah,[var1] 
mov al,[var2] 

call addition 

stop: jmp stop 

var1: db 5 
var2: db 6 

addition: 
add ah,al 
ret 

我在地址var1和var2上找到的数字是0x0E和0x07。我知道它没有分割,但这不是它做这样的冒险的理由,因为加法调用工作得很好。你能向我解释我的错误在哪里?


我看到问题,不知道如何解决它虽然。事情是,由于某种原因,指令指针从0x100开始,所有的段寄存器在0x1628。为了解决使用的组合的指令,我猜[cs:ip](片段寄存器和指令指针之一)。偏移到Var1为0x10的(因为它是为了在0x10th字节代码的开头可能),我试图检查内存和我得到的是:

1628:100 8 bytes 
1628:108 8 bytes 
1628:110 <- wtf? (assume another 8 bytes) 
1628:118 ... 

什么招数都存在于存储器[ cs:var1]指向别处,而不是在我的代码中,这可能是标签.data通常用于处理ds的地方....可能..我不知道1628应该是什么:10


好的,我发现了什么导致了屁股,并浪费了我整个他妈的一天。上述行为是正确的,代码是完全正常的。我不知道的是grdb调试器由于某种原因将开始地址设置为0x100 ......溶剂是在第一行插入指令ORG 0x100,这就是整个事情。代码正在工作,因为指令指针对第一条指令有正确的地址并且一个接一个地执行,但是你的汇编程序不知道你的程序存储了什么有效地址,所以它相对于代码的第一行仍然相当多,这意味着所有变量(如果不使用数据段的标签)将保持指向,就像它从0x0开始一样。这当然不适用于DOS。 grdb显然模拟了一些DOS功能...为语言而努力,为每个人努力,希望如果出现同样的问题,这将会让别人的时间空余...

heheh ..至少现在我知道为什么要使用.data部分:))))

+0

我不明白“escapade”发生了什么?你没有描述这个问题:你看到了什么你期望的。 – Andrey 2010-03-15 17:18:48

+0

我认为[var1]和[var2] – Pyjong 2010-03-15 17:21:37

+0

的值为5和6,所以尝试var1而不是[var1] – Andrey 2010-03-15 17:25:15

回答

2

假设是x86程序集,var1var2必须位于.data部分。


说明:我不打算解释的可执行文件究竟是如何结构化(更何况这是特定于平台的),但这里的,为什么你在做什么是一个总体思路不工作。

由于每个数据段直接(或几乎直接)对应于二进制/可执行文件的特定部分,所以汇编代码必须分成数据段。所有全局变量必须在.data部分中定义,因为它们在全局数据所在的二进制文件中具有相应的位置。

在代码段中定义一个全局变量(或全局访问的部分内存)将导致未定义的行为。一些x86汇编程序甚至可能会在此上抛出一个错误。

+0

这是x86汇编。我知道它应该在数据部分,但交易是什么,如果数据没有与指令混合,这应该没有关系。为什么标签指向其他地方? – Pyjong 2010-03-15 17:20:23

+0

它**确实很重要,汇编指令的位置对于它们在可执行文件上的位置至关重要。 – 2010-03-15 17:22:22

+0

我以为ELF是不是真的有必要,如果你只是把你的机会阅读没有符号的代码...我使用Windows btw ... – Pyjong 2010-03-15 17:25:30