[英]C: How do I simulate 8086 registers?
Ohai, I'm currently trying to implement an 8086 ASM debugger for learning purposes. Ohai,我目前正在尝试实现8086 ASM调试器以用于学习目的。 Until now, I tried to simulate the 8 and 16 bit registers with char arrays but this approach is driving me nuts, when working with AX, AL and AH. 到目前为止,我试图用char数组模拟8位和16位寄存器,但这种方法让我疯狂,在使用AX,AL和AH时。
#define setAL() { int i; for (i = 0; i < 8; i++) AL[i] = AX[i]; }
char AX[16] = {0, 1, 1, 1, 1 ,1 ,1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char AL[8] = {0, 0, 0, 0, 0, 0, 0, 0};
Does anyone has any good idea (or something like 'best practice') how to simulate those registers? 有没有人有任何好主意(或类似'最佳实践')如何模拟这些寄存器?
I don't think there's a 'best practice' way of doing this, but one approach you could take that may drive you nuts less is to use a union to overlay the 8 and 16 bit portions: 我不认为有这样做的“最佳实践”方法,但你可以采取的一种方法可能会让你更少疯狂,就是使用一个联合覆盖8位和16位部分:
struct RegByte {
unsigned char low;
unsigned char high;
};
struct RegWord {
unsigned short value;
};
union Reg {
struct RegWord word;
struct RegByte bytes;
};
Alternatively given you're explicitly targeting just 8086 you could have one structure containing all the 16 bit registers and one containing all of the byte portions. 或者,如果你明确地只针对8086,你可以有一个包含所有16位寄存器的结构,一个包含所有字节部分的结构。 eg 例如
struct RegByte {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};
struct RegWord {
unsigned short ax, bx, cx, dx;
/* nothing stopping you from continuing with si, di, etc even though
* they don't have addressable high and low bytes */
};
union Reg {
struct RegWord word;
struct RegByte byte;
};
I'd abstract the structure away and use accessor functions. 我将结构抽象出来并使用访问器函数。
struct registry_file_t;
uint16_t get_al(registry_file_t * r);
void set_al(registry_file_t * r, uint16_t value);
With inlining enabled, this approach will be no less performant than using a union. 启用内联后,这种方法的性能不会低于使用联合。
In case it might be useful for someone, I put the one I wrote here. 如果它可能对某人有用,我把我在这里写的那个。
typedef struct cpu_8086_s cpu_t;
struct cpu_8086_s
{
struct
{
union
{
uint16_t ax;
struct
{
uint8_t al;
uint8_t ah;
};
};
union
{
uint16_t cx;
struct
{
uint8_t cl;
uint8_t ch;
};
};
union
{
uint16_t dx;
struct
{
uint8_t dl;
uint8_t dh;
};
};
union
{
uint16_t bx;
struct
{
uint8_t bl;
uint8_t bh;
};
};
uint16_t sp;
uint16_t bp;
uint16_t si;
uint16_t di;
};
struct
{
uint16_t es;
uint16_t cs;
uint16_t ss;
uint16_t ds;
};
uint16_t ip;
union
{
uint16_t flags;
struct
{
uint8_t c: 1;
uint8_t : 1;
uint8_t p: 1;
uint8_t : 1;
uint8_t a: 1;
uint8_t : 1;
uint8_t z: 1;
uint8_t s: 1;
uint8_t t: 1;
uint8_t i: 1;
uint8_t d: 1;
uint8_t o: 1;
};
};
};
Why not use structure
and union
like this: 为什么不像这样使用structure
和union
:
union AX_R {
AX_R() {
AX = 0;
}
unsigned __int16 AX;
struct {
unsigned __int8 AL;
unsigned __int8 AH;
} _AX_R;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.