两个十六进制内存地址之间的区域中的字节数

问题描述

我目前正在阅读一本关于大型机汇编(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 个字节)。

既然你在学习汇编编程,你最好学习十六进制算术。