我们知道每个指令都是转换为base + offset,并且offset最大大小设置为4K(4096)。如果我的程序大小超过4K怎么办?
Line 1 : Base + 1 , Line 2 : Base + 5 , . . . ., Line x : base + 4090
当指令超出页面大小4096时,如何像基址+偏移量一样寻址x行?从第X行开始的指令是如何汇编的?我们是否需要将基址更改为保存指令的下一页的起始地址?
0pizxfdo1#
今天的z/Architecture(IBM大型机)处理器的祖先确实只提供基址偏移寻址。你必须将一个基址加载到一个寄存器中,然后指定这个基址寄存器加上一个12位偏移,即0到4095字节来寻址一些存储。
汇编程序提供了USING指令来帮助你。你在程序中指定一个标签和一个寄存器,它将在运行时保存该标签指令的地址。汇编程序将为你计算偏移量。范例
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,SUB01和BALR R4,R5指令的作用。在子例程中,您告诉汇编程序R5正指向带有USING SUB01,R5的地址SUB01。汇编程序使用此信息构建分支指令B SUB01A。它计算从SUB01到SUB01A的偏移量。如果从SUB01开始的代码长度超过4096字节(最大偏移量),则需要第二个、第三个、第四个等寄存器,每个寄存器指向下一个4k段。假设代码长度为10 k,则需要三个寄存器。代码可能如下所示:
SUB01
R5
R4
LA R5,SUB01
BALR R4,R5
USING SUB01,R5
B SUB01A
SUB01A
... 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(架构限制)。然后告诉汇编程序可以使用寄存器R5、R6和R7来计算偏移量。如果偏移量为0-4095,则汇编程序将使用R5;如果偏移量为4096-8191,则汇编程序将使用R6;如果偏移量为8192-12287,则汇编程序将使用R7。
R5 + 4096
R6
R5 + 8192
R7
LA
在z/Architecture中,IBM引入了一组使用20位 * 有符号位移 * 的新指令。这些指令使用有符号偏移量,即它们可以寻址基址寄存器中地址 * 之后 * 的存储,也可以寻址该地址 * 之前 * 的存储。20位有符号偏移量提供了基址位置之外最多524,287字节或最多524字节的相对寻址。在它之前288个字节。您可以使用单个基址寄存器通过这些指令寻址更大的区域。
IBM在名为z/Architecture Principles of Operation的手册中记录了其z/Architecture
1条答案
按热度按时间0pizxfdo1#
使用IBM大型机处理器寻址
今天的z/Architecture(IBM大型机)处理器的祖先确实只提供基址偏移寻址。你必须将一个基址加载到一个寄存器中,然后指定这个基址寄存器加上一个12位偏移,即0到4095字节来寻址一些存储。
使用S390/架构处理器寻址
汇编程序提供了
USING
指令来帮助你。你在程序中指定一个标签和一个寄存器,它将在运行时保存该标签指令的地址。汇编程序将为你计算偏移量。范例
说明:在程序中,你需要调用子例程
SUB01
,把它的地址加载到寄存器5(R5
)中,然后进行分支,同时把返回地址保存到寄存器4(R4
)中,这就是LA R5,SUB01
和BALR R4,R5
指令的作用。在子例程中,您告诉汇编程序
R5
正指向带有USING SUB01,R5
的地址SUB01
。汇编程序使用此信息构建分支指令B SUB01A
。它计算从SUB01
到SUB01A
的偏移量。如果从
SUB01
开始的代码长度超过4096字节(最大偏移量),则需要第二个、第三个、第四个等寄存器,每个寄存器指向下一个4k段。假设代码长度为10 k,则需要三个寄存器。代码可能如下所示:
说明:当进入
SUB01
时,你知道R5
指向那个标签。你需要用R5 + 4096
加载R6
,用R5 + 8192
加载R7
。有不同的方法可以实现这一点。我展示的是使用加载地址LA
指令的方法,它的最大偏移量为4095(架构限制)。然后告诉汇编程序可以使用寄存器
R5
、R6
和R7
来计算偏移量。如果偏移量为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