小编Sta*_*fly的帖子

C 中操作位域的汇编代码在 QEMU 中表现得很奇怪

我在做 2018 版本 MIT 6.828 时遇到了一些奇怪的事情,该实验室在模拟 80386 CPU 的 QEMU 上运行:

我想做的是初始化 INTEL 82540EM 芯片(也称为 E1000)的接收过程。我基本上只是将一些字节写入设备的寄存器。

首先我定义了一个带有位域的结构,因为它实际上是硬件中的寄存器:


struct rx_addr_reg {
    // low 32 bit
    unsigned ral : 32;  // 0 - 31
    // high 32 bit
    unsigned rah : 16;  // 0 -15
    unsigned as  : 2;   // 16 - 17
    unsigned rs  : 13;  // 18 - 30
    unsigned av  : 1;   // 31
};

Run Code Online (Sandbox Code Playgroud)

我决定通过 C 宏使用它:


#define E1000_RA       0x05400  /* Receive Address - RW Array */
#define …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc gdb qemu

2
推荐指数
1
解决办法
80
查看次数

标签 统计

assembly ×1

c ×1

gcc ×1

gdb ×1

qemu ×1