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

5us2dqdw  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(119)

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

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

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

0pizxfdo

0pizxfdo1#

使用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段。
假设代码长度为10 k,则需要三个寄存器。代码可能如下所示:

...
         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

相关问题