assembly 在IBM Z(s390x)上,超过4K(页面大小)的指令如何以基址+偏移量的方式寻址?

txu3uszq  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(158)

我们知道每条指令都转换为基址+偏移量,并且偏移量最大大小设置为4K(4096),如果程序大小超过4K怎么办?

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

当指令超出页面大小4096时,如何像基址+偏移量一样寻址第x行?
从第X行开始的指令是如何汇编的?我们是否需要将基址更改为保存该指令的下一页的起始地址?

ws51t4hk

ws51t4hk1#

使用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,则需要3个寄存器,代码如下所示:

...
         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;如果偏移量是8192 - 12287,它将使用R7

使用z/Architecture处理器寻址

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

IBM z/体系结构描述

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

相关问题