问题描述
我正在查看 line 272 源代码的 8086tiny。有
// regs16 and reg8 point to F000:0,the start of memory-mapped registers. CS is initialised to F000
regs16 = (unsigned short *)(regs8 = mem + REGS_BASE);
而 REGS_BASE
是
#define RAM_SIZE 0x10FFF0
#define REGS_BASE 0xF0000
Line 158 & 159 将 mem
、regs8
和 regs16
定义为
unsigned char mem[RAM_SIZE],*regs8;
unsigned short *regs16;
所以我的问题是:regs8 = mem + REGS_BASE
行有什么作用?如何添加一个数组(mem
)和一个常量(REGS_BASE
)?感谢您的帮助!
解决方法
数组名代表第一个元素地址。
unsigned char mem[RAM_SIZE];
mem
等于 &mem[0]
Becides:(n 是常数)
mem[n] = *(mem + n)
mem + n
是一个地址,您可以将其分配给适当的指针。
这一行如何添加带有常量的数组?
C 标准说(复制自 ISO/IEC 9899:201x 委员会草案 — 2011 年 4 月 12 日 N1570):
除非它是 sizeof 运算符、_Alignof 运算符或 一元 & 运算符,或者是用于初始化数组的字符串文字,该表达式具有 类型“类型数组”被转换为一个类型为“指向类型的指针”的表达式,它指向 到数组对象的初始元素...
所以当使用一个数组,即 mem
时,在 mem + ...
形式的表达式中,mem
被转换为 指向数组第一个元素的指针强>.
此外,标准说:
当一个整数类型的表达式被添加到一个指针或从一个指针中减去时, 结果具有指针操作数的类型。如果指针操作数指向一个元素 一个数组对象,并且数组足够大,结果指向一个元素偏移量 原始元素使得结果和原始的下标的差异 数组元素等于整数表达式。换句话说,如果表达式 P 指向 数组对象的第 i 个元素,表达式 (P)+N(等价于 N+(P))和 (P)-N(其中 N 的值为 n)分别指向第 i+n 个和第 i-n 个元素 数组对象,前提是它们存在。
因此,将整数 N 添加到指向数组元素的指针将得到一个指向元素的指针,该指针指向原始指针指向的元素之后的 N 个位置。
就您而言,这意味着:
Pointer to first element (aka pointer to mem[0])
|
| Integer
| |
/-\ /-------\
mem + REGS_BASE
\-------------/
|
Pointer to the REGS_BASE'th element (aka pointer to mem[REGS_BASE])
在您的代码中,此指针同时分配给 reg8
和 - 在转换后 - 分配给 reg16
。