如何在c ++中获取eax寄存器的结构

Posted

技术标签:

【中文标题】如何在c ++中获取eax寄存器的结构【英文标题】:how to acquire a structure of eax register in c++ 【发布时间】:2021-09-21 13:15:23 【问题描述】:

如果我使用 struct,它将占用内存,这与实际寄存器不同,其中 al 和 ah 一起构成 ax 寄存器,并且 eax 寄存器与 ax 寄存器合并。如果我使用联合,al 和 ah 值将在同一个地方,实际上它们是 2 个单独的寄存器。我怎样才能获得eax寄存器的结构?我注意到在 dos.h 标头(在 c 中)有“union regs”,它具有我需要的结构。但在我的机器上,没有这样的“工会规则”。到目前为止,我已经尝试过:-

struct regs 
    uint32 eax, ebx, ecx, edx, esi, edi, esp, ebp;
    uint16 ax, bx, cx, dx;
    uint8 ah, al, bh, bl, ch, cl, dh, dl;
;

【问题讨论】:

如果你想要一个可以写ax 和读ah 的联合,那无论如何都是C++ 中的undefined behavior。 不,我只是想要一个类似于 eax 寄存器结构的结构 你想达到什么目的?有什么你需要它的例子吗? 在eax寄存器中,16个lsb是ax寄存器,那个寄存器的8个msb是ah寄存器,另外8位是al寄存器。我想要在 C++ 中这样的结构。 假设C++没有这样的数据结构。你需要它做什么?也许这件事可以通过不同的方式来实现。 【参考方案1】:

@Sebastian 提到我应该结合结构和联合来获得这种架构。我不确定嵌套结构和联合是否会,但我试过了,它奏效了:-

union int32 eax; union int16 ax; struct int8 ah, al;;; reg_eax;

请注意,只要同一级别的不同成员没有相同的名称,就可以使用不带名称的结构或联合。

【讨论】:

请注意匿名 struct 是标准 C l,但仅支持作为 C++ 上的一些编译器的非标准扩展。而且,使用union 强制转换对象在低级编程中很常见,但由于别名规则,这是未定义的行为。因此它可以停止使用其他编译标志或其他编译器。

以上是关于如何在c ++中获取eax寄存器的结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中获取树结构中的数据? [复制]

如何从c中的sock结构中获取IP地址?

如何从 QByteArray 获取结构

如何在 C 语言中获取字符在字母表中的位置?

如何从 CGO 返回结构

如何在 Qt 中显示 C 结构