问题描述
我目前正在阅读一本关于大型机汇编(System Z 的汇编语言编程)的书
在第一章的其中一章中,我遇到了以下问题:
3.1.1.(2)+ 为数据保留的内存区域从地址 X'2EC9' 开始,以地址 X'30A6' 结束(包括开始和结束) 字节!)。区域中有多少字节,有多少个半字, 字,双字可以存储在该区域吗?
我理解它们的意思,但我不确定如何思考如何找出这些十六进制地址之间的字节数。
解决方法
计算机内存以字节为单位,(通常)从零向上编号。您可以用十进制或更常见的十六进制来计数。处理器指令对单个字节和多个字节进行操作。字节数可以是固定数,也可以是变化数。
术语半字、全字、双字、四字是固定字节单元数的术语,并且取决于术语词的定义。一个字字节可能包含 2、4 或 8 个连续的内存字节。
在 IBM z/Architecture(及其前身回到 IBM S/360)中,词由 4 个字节组成。 A *Fullword(下图中的“FW”)与“Word”相同。一个Halfword(下面的“HW”)是半个字,所以它是2个字节。一个双字(“DW”)是2个字,所以是8个字节。最后,一个四字是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 个字节)。
既然你在学习汇编编程,你最好学习十六进制算术。