gpt4 book ai didi

assembly - 超出 4K(页面大小)的指令如何以 base + offset 样式处理?

转载 作者:行者123 更新时间:2023-12-05 00:51:00 26 4
gpt4 key购买 nike

我们知道每条指令都转换为base + offset,并且offset max size设置为4K(4096)。如果我的程序大小超过 4k 怎么办?

Line 1 : Base  + 1 , 
Line 2 : Base + 5 ,
.
.
.
.,
Line x : base + 4090

当指令超出页面大小 4096 时,如何像 Base + offset 一样寻址第 x 行?

如何汇编第 X 行以后的指令?我们是否需要将基地址更改为保存指令的下一页的开头?

最佳答案

使用 IBM 大型机处理器寻址

今天的 z/Architecture(IBM 大型机)处理器的祖先确实只提供基本偏移寻址。您必须将基址加载到寄存器中,然后指定该基址寄存器加上 12 位偏移量,即 0 到 4095 字节来寻址某些存储。

使用 S390/架构处理器寻址

汇编器提供了 USING 指令来帮助你。您在程序中指定一个标签和一个寄存器,它将在运行时保存该标签指令的地址。然后,汇编器将为您计算偏移量。

例子

         ...
LA R5,SUB01
BALR R4,R5
...
SUB01 DS 0H
USING SUB01,R5
...
B SUB01A
...
SUB01A DS 0H

说明:在你的程序中,你需要调用子程序SUB01。您将其地址加载到寄存器 5 (R5),然后在将返回地址保存到寄存器 4 (R4) 的同时进行分支。这就是 LA R5,SUB01BALR R4,R5 指令的作用。

在您的子例程中,您告诉汇编器 R5 使用 USING SUB01,R5 指向地址 SUB01。汇编器使用此信息构建分支指令B SUB01A。它计算从 SUB01SUB01A 的偏移量。

如果从 SUB01 开始的代码长于 4096 字节,最大偏移量,则需要第二、第三、第四等寄存器,每个寄存器指向下一个 4k 段。

假设代码长 10k,则需要三个寄存器。代码可能如下所示:

         ...
LA R5,SUB01
BALR R4,R5
...
SUB01 DS 0H
LA R6,4095(,R5)
LA R6,1(,R6)
LA R7,4095(,R6)
LA R7,1(,R7)
USING SUB01,R5,R6,R7
...
B SUB01A
...
SUB01A DS 0H

说明:进入 SUB01 后,您就知道 R5 指向该标签。您需要用 R5 + 4096 加载 R6,用 R5 + 8192 加载 R7。有不同的方法可以实现这一目标。我展示的是使用加载地址 LA 指令的指令,它的最大偏移量为 4095(架构限制)。

你告诉汇编器寄存器 R5R6R7 可用于计算偏移量。如果偏移量是 0-4095,它将使用 R5,如果偏移量是 4096-8191,它将使用 R6,并且偏移量的 R7 是 8192- 12287.

使用 z/Architecture 处理器寻址

通过 z/Architecture,IBM 引入了一组使用 20 位有符号位移的新指令。这些指令使用带符号的偏移量,即它们可以在基址寄存器中的地址之后寻址存储,也可以在该地址之前存储。 20 位带符号的偏移量可提供超出基地址位置最多 524,287 字节或在其之前最多 524,288 字节的相对寻址。

您可以使用单个基址寄存器通过这些指令寻址更大的区域。

IBM z/架构描述

IBM 在名为 z/Architecture Principles of Operation 的手册中记录了其 z/架构

关于assembly - 超出 4K(页面大小)的指令如何以 base + offset 样式处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73267881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com