【问题标题】:Getting offset of STRUC member in assembly在装配中获取 STRUCT 成员的偏移量
【发布时间】:2015-02-23 13:07:02
【问题描述】:

所以,我有这样的结构:

String STRUC
   max_length       db  254
   real_length      db  ?
   buffer           db  255  dup(?)
String ENDS

在数据段中,我定义了我的 «String» 类型的变量:

source_str          String <>

在代码段中,我试图获取结构成员 «buffer» 的偏移量:

mov     bx, offset source_str           ; in BX we have the offset of structure
lea     dx, [bx].buffer                 ; OK, the right offset in DX
mov     ax, offset [source_str].buffer  ; this works fine too
mov     dx, offset [bx].buffer          ; but this gets _wrong_ offset, according to td

我是初学者,这就是我的想法:我们有一个偏移量(在寄存器中或作为标签) - 地址,将其放在 [] 之间并获取值 - 这就像 C/C++ 中的指针取消引用。

我的问题是:为什么最后一个命令不能像我认为的那样工作?有没有办法在 BX 寄存器中使用“mov”和偏移量来做到这一点?

【问题讨论】:

  • 由于您显然想要实际地址而不是结构中的偏移量,因此您需要添加 bxmov 不能这样做。如您所见,您需要lea
  • @Jester 我得到的不是结构内的偏移量,而是完全错误的值。例如: «buffer» 的偏移量是 0003,结构内的偏移量是 2 个字节,但我得到的是 6558。
  • @nyagod - source_str 的偏移量是多少?我想知道是不是6556?

标签: assembly tasm


【解决方案1】:

对于 masm 6.11,需要包含结构名称:

        lea     dx, (String ptr [bx]).buffer

对于另一个问题,您不能将偏移量与基址寄存器一起使用:

        mov     dx, offset (String ptr [bx]).buffer  ; invalid

你可以使用 add,但是 lea 用一条指令做同样的事情:

        mov     dx, bx
        add     dx, offset (String ptr ds:0).buffer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多