【问题标题】:C++ Getting class/struct address in 8086C ++在8086中获取类/结构地址
【发布时间】:2014-01-24 13:34:49
【问题描述】:

我试图弄清楚如何使用 Borland C++ 编译器在 8086 架构中获取和存储结构/类对象的地址。

尝试做类似的事情:

    struct Data{
         unsigned int a; // +0
         unsigned int b; // +2
         unsigned int c; // +4
         unsigned int d; // +6
    };

    int main() {
    Data* r = new Data();
    unsigned int temp; 
    asm {
      mov temp, bx
      mov bx, r
      mov bx[0], ax
      mov bx[4], cx
      mov bx[6], dx 
    }
    r->b = temp;
    // write registry values on screen and check with actual register values
    }

现在我尝试了很多方法来制作:

mov bx, r

线路工作(使用 FP_OFF 和 FP_SEG)但没有成功。 Atm 我只是将寄存器值移动到临时变量中,然后将这些变量写入结构中,例如:

    struct Data{
         unsigned int a; // +0
         unsigned int b; // +2
         unsigned int c; // +4
         unsigned int d; // +6
    };

    int main() {
    Data* r = new Data();
    unsigned int ta, tb, tc, td; 
    asm {
      mov ta, ax
      mov tb, bx
      mov tc, cx
      mov td, dx
    }
    r->a = ax;
    r->b = bx;
    r->c = cx;
    r->d = dx;
    // write registry values on screen and check with actual register values
    }

但我想知道如何使用对象的地址来做这件事,这样我就可以减少使用的变量数量并减少代码混乱。

更新

我想我找到了正确的方法:

    struct Data{
         unsigned int a; // +0
         unsigned int b; // +2
         unsigned int c; // +4
         unsigned int d; // +6
    };

    int main() {
    Data* r = new Data();
    unsigned int dataOff, dataSeg;
    dataOff = FP_OFF(r);
    dataSeg = FP_SEG(r);
    asm {
      push ds
      push bx

      mov bx, dataOff
      mov ds, dataSeg

      mov bx[0], ax
      mov bx[4], cx
      mov bx[6], dx 
      pop WORD PTR bx[2]
      pop ds
    }
    // write registry values on screen and check with actual register values
    }

我忘记更改 DS(数据段)寄存器以匹配对象内存位置的段值。 如果有人验证这是正确的方法,那就太好了。

【问题讨论】:

  • 您使用的是哪种型号?
  • 您可以将 TASM 用于装配部分。它具有强大的 STRUCT 定义,可以为您计算偏移量。
  • 我正在使用 HUGE 内存模型。
  • 在 c99 中,结构的地址是它的第一个成员的地址,如果有帮助的话:)
  • 是的,我知道,我将偏移量放在结构成员旁边的 cmets 中。还是谢谢。

标签: c++ assembly cpu-registers x86-16


【解决方案1】:

您可以像这样指定结构名称和字段:

mov [bx+Data.a], ax
mov [bx+Data.c], cx
mov [bx+Data.d], dx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多