计算机内存以字节为单位,(通常)从零开始编号。您可以用十进制计数,或者更常见的是用十六进制计数。处理器指令对单个字节和多个字节进行操作。字节数可以是固定数字,也可以是可变数字。
术语 Halfword、Fullword、Doubleword、Quadword 是固定数量的字节单元的术语,并且取决于术语 word 的定义。一个字字节可能包含 2、4 或 8 个连续的内存字节。
在 IBM z/Architecture(以及它的前身回到 IBM S/360)中,一个 单词 由 4 个字节组成。 A *Fullword”(下图中的“FW”)与“Word”相同。A Halfword(下图中的“HW”)是半个字,所以是2个字节。A Doubleword(“DW”)是2个字,所以是8个字节。最后,一个Quadword是4个字,所以是16个字节。
请注意,某些处理器指令要求操作数位于半字、全字、双字甚至四字边界上。这意味着最低编号字节的地址或编号必须分别被 2、4、8 或 16 整除。这创造了术语“*半字对齐”、“全字对齐”等。
其他指令对半字、全字等操作数进行操作,无论它们是否对齐。因此,通常这些术语表示特定数量的连续内存字节数。
下图说明了这些术语:
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
| B | B | B | B | B | B | B | B | B | B | B | B | B | B | B | B | B | B |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 decimal
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 hexadecimal
+-------+-------+-------+-------+-------+-------+-------+-------+-------+---
| HW | HW | HW | HW | HW | HW | HW | HW | HW |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+---
00 02 04 06 08 10 12 14 16 18 decimal
00 02 04 06 08 0A 0C 0E 10 12 hexadecimal
+---------------+---------------+---------------+---------------+-----------
| FW | FW | FW | FW | FW
+---------------+---------------+---------------+---------------+-----------
00 04 08 12 16 decimal
00 04 08 0C 10 hexadecimal
+-------------------------------+-------------------------------+-----------
| DW | DW | DW
+-------------------------------+-------------------------------+-----------
00 08 16 decimal
00 08 10 hexadecimal
+---------------------------------------------------------------+-----------
| QW | QW
+---------------------------------------------------------------+-----------
00 16 decimal
00 10 hexadecimal
B = 字节,HW = 半字,FW = 全字,DW = 双字,QW = 四字
最后,回到你的问题。第一个字节是字节号 2EC9(以十六进制表示),最后一个字节是字节号 30A6。两个数之差加 1 等于字节数。 30A6 - 2EC9 + 1 = 1DE(十六进制)或 478(十进制)。
如果我们忽略对齐,则有 478 / 2 = 239 个半字、478 / 4 = 119 个全字(剩下 2 个字节)、478 / 8 = 59 个双字(剩下 6 个字节)和 478 / 16 = 29 个四字(还剩 14 个字节)。
另一方面,如果我们坚持对齐,首先,我们需要找到从 2EC9 开始的下一个半字、全字、双字和四字边界。这分别是 2ECA、2ECC、2ED0 和 2ED0。其次,我们需要找到 HW、FW、DW 或 QW 可能开始的最后一个地址,最后一个字节仍低于或等于地址 30A6。分别是 30A4、30A0、3098 和 3090。
结果是 238 个半字(还剩 2 个字节)、118 个全字(还剩 6 个字节)、58 个双字(还剩 14 个字节),最后是 29 个四字(还剩 14 个字节)。
既然你正在学习汇编程序,你最好学习十六进制算术。