【问题标题】:offset operator in assembly language汇编语言中的偏移运算符
【发布时间】:2014-09-18 08:09:14
【问题描述】:

我有点困惑。我无法在汇编语言中找到偏移运算符的确切用途,因为我是这种语言的新手。根据理论,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

我得到了 cmets 中给出的输出 这个输出是什么意思? 这是标签的起始地址还是起始地址和最终地址之间的位移或其他我不知道的地址。如果有人帮助我理解这个概念,我将不胜感激。

【问题讨论】:

    标签: assembly


    【解决方案1】:

    用于显示数据地址:

    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
    

    (但是这种排列对于数据对齐完全失败。简单的解决方案:在第一个字节之后放置第二个字节。)

    【讨论】:

      【解决方案2】:

      在 Windows XP 的情况下,大多数程序的数据部分从十六进制 400000 以上开始。在这种情况下,您的数据似乎从十六进制 404000 开始。其他版本的 Windows 也可能以相同的一般开始数据位置,尽管 Windows 7 和 8 可能会稍微改变地址以保护程序免受简单类型的黑客攻击。

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        相关资源
        最近更新 更多