当您说“失去寻址字节的能力”时,我假设您的意思是“位八位字节”,而不是“字符”。可移植代码应该只假设CHAR_BIT >= 8
. 在实践中,没有字节寻址的架构通常会定义CHAR_BIT == 8
,并让编译器生成访问字节的指令。
我实际上不同意答案建议:CHAR_BIT == 16
作为一个不错的选择。我更喜欢:CHAR_BIT == 8
,与sizeof(short) == 2
. 编译器可以处理移位/屏蔽,就像它对许多 RISC 架构所做的那样,在这种情况下进行字节访问。
我想 Notch 会进一步修改和澄清 DCPU-16 规范;已经有中断机制的请求和进一步的说明。这是游戏的美学背景,所以我怀疑很快就会有官方的 ABI 规范。也就是说,有人会努力的!
编辑:
考虑一个 C 中的数组char
。编译器在每个本机 16 位word
DCPU 内存中打包 2 个字节。因此,如果我们访问第 10 个元素(索引9
),则获取单词 # [9 / 2] = 4,并提取字节 # [9 % 2] = 1。
设“X”为数组的起始地址,“I”为索引:
SET J, I
SHR J, 1 ; J = I / 2
ADD J, X ; J holds word address
SET A, [J] ; A holds word
AND I, 0x1 ; I = I % 2 {0 or 1}
MUL I, 8 ; I = {0 or 8} ; could use: SHL I, 3
SHR A, I ; right shift by I bits for hi or lo byte.
寄存器A
保存“字节” - 它是一个 16 位寄存器,因此可以忽略上半部分。或者,上半部分可以归零:
AND A, 0xff ; mask lo byte.
这不是优化的,但它传达了这个想法。