我有点困惑。我无法在汇编语言中找到偏移运算符的确切目的,因为我是这种语言的新手。根据理论,OFFSET运算符返回标签距数据段开头的距离(以字节为单位),对应相对模式(Real / Protected)。但是当我运行以下代码时
.data
bVal BYTE ?
wVal WORD ?
dVal DWORD ?
dVal2 DWORD ?
dValArray DWORD 5 DUP(?)
.code
mov esi,OFFSET bVal ; ESI = 00404000
call DumpRegs
mov esi,OFFSET wVal ; ESI = 00404001
call DumpRegs
mov esi,OFFSET dVal ; ESI = 00404003
call DumpRegs
mov esi,OFFSET dVal2 ; ESI = 00404007
call DumpRegs
mov esi,OFFSET dValArray ; ESI = 0040400B
call DumpRegs
我得到了评论中给出的输出 这个输出是什么意思? 这是标签的起始地址还是起始地址和最终地址之间的位移或我不知道的任何其他内容。如果有人帮助我理解这个概念,我将感激不尽。
答案 0 :(得分:0)
对于Windows XP,大多数程序的数据部分从高于十六进制400000开始。在这种情况下,您的数据似乎从十六进制404000开始。其他版本的Windows也可能以相同的一般方式启动数据位置,虽然Windows 7和8可能会稍微改变地址,以保护程序免受简单类型的攻击。</ p>
答案 1 :(得分:0)
用于显示数据地址:
00404000 BYTE ? ; bVal
00404001 WORD ? ; wVal
00404002
00404003 DWORD ? ; dVal
00404004
00404005
00404006
00404007 DWORD ? ; dVal2
00404008
00404009
0040400A
0040400B DWORD 5 DUP(?) ; dValArray
0040400C
0040400D
0040400E
0040400F
00404010
00404011
00404012
00404013
00404014
00404015
00404016
00404017
00404018
00404019
0040401A
0040401B
0040401C
0040401D
0040401E
(但是这种安排完全失败了数据对齐。简单的解决方案:在第一个字节之后放置第二个字节。)