我已经得到了下一个定义(实际问题的一部分):
Turkey: mov ebx, Ygg
call foo
foo: ;;Does something
Dra: dd 0xffff, Sil, Sil, Sil
Ygg: dd 0x11, Dra, Sil Dra
Sil: dd 3, 0, 0
现在我不明白我该如何记住这个。
我的意思是,ebx,会得到一个地址到Ygg的开头[我猜错点是什么?],但那我该如何导航?
下一个字节有什么用? Dra,Sil和Dra的地址再次发送?
Ygg: dd 0x11, Dra, Sil, Dra
但是当我做类似的事情时会发生什么:
mov ebx, [ebx+4]
我知道我的问题有点不集中,但这是因为我无法看到""它在内存中的表现如何。
答案 0 :(得分:1)
下一个字节有什么用? Dra,Sil和Dra的地址再次发送?
是。每个地址存储为4个字节
mov ebx,[ebx + 4]
从ebx + 4计算地址。从该地址读取4个字节并复制到ebx。
将“地址”视为特殊的东西可能会有所帮助。它们也只是数字。您恰好能够读取或写入该位置,对应于这些数字的值。
答案 1 :(得分:1)
示例,如果“Dra”的内存位置从数据段中的偏移量0x0000开始:
mov ebx,Ygg ; ebx = 0x00000010
mov ebx,[ebx+4] ; ebx = 0x00000000 (second dword of DS:Ygg)
数据段以偏移量0x0000开始:
0x0000 Dra dd 0x0000ffff, 0x00000020, 0x00000020, 0x00000020
0x0010 Ygg dd 0x00000011, 0x00000000, 0x00000020, 0x00000000
0x0020 Sil dd 0x00000003, 0x00000000, 0x00000000