360 汇编/360 架构
360 架构是 32 位机器(z/System 为 64 位),其中标准字长为 32 位(z/System 为 64 位)。在使用 32 位指令时,根据寻址模式,许多指令不使用所有 32 位,而可能只使用地址、寄存器或内存的低 24 位或 31 位。360 支持高达 16 兆字节(2^24 或 16*1024^3)的内存和 24 位寻址。370 和 390 支持高达 2 吉字节(2^31)的内存和 31 位寻址。z/System 支持高达 16 艾字节(2^64)的内存和 64 位寻址。
360 架构具有:-
- 16 个通用 32 位寄存器(z/System 上为 64 位),编号为 0 到 15(通常等效于标签“R0”到“R15”)
- 如果启用了访问模式(PSW 的位 16 和 17 设置为 X'01'),则有 16 个 32 位访问寄存器,编号为 0 到 15(360 上没有访问寄存器)。
- 16 个特权 32 位控制寄存器,0 到 15,用于控制计算机的各种操作(360 上不可用)
- 4 个浮点 64 位寄存器,编号为 0、2、4 和 6,而 370、390 和 z/System 则拥有完整的 15 个浮点寄存器,以及
- 一个 64 位(z/System 上为 128 位)的程序状态字 (PSW)。程序状态字由特权位、程序计数器和内存保护密钥以及其他标志位组成。
PSW 的特权位 (15) 指示当前执行的程序的状态。有两种状态,问题状态 (0) 和管理状态 (1)。如果特权位设置,则程序处于“管理状态”,如果特权位清除,则程序处于“问题状态”。
- 问题状态是所有用户软件运行的地方。问题状态应用程序(“问题程序”)有诸多限制,包括内存读写限制,并且不能直接发出 I/O 指令。
- 管理状态为操作系统及其所有组件保留。某些操作系统允许程序被标记为“授权”,在这种情况下,该程序可以在管理状态下运行。
内存保护密钥(位 8-11)为 4 位,决定特定程序可以访问哪些内存区域。计算机内存的页面被标记为特定的保护密钥,只有运行具有相同密钥(或密钥为零)的程序才能写入特定内存部分。某些版本的硬件也具有读保护功能。
370 及更高版本支持“动态地址转换”,其中程序可以加载到虚拟地址,并且虚拟地址由硬件直接自动转换为真实地址。多个程序可以映射到比机器实际拥有的内存更多的虚拟内存,从而允许比实际内存容量更多的程序同时运行,或允许比实际可用内存更大的程序运行。操作系统可以将页面写入磁盘空间并从磁盘空间读取页面,以便在程序未执行时或未使用所有内存时存储程序。
由于程序并不总是正常工作,或者可能需要操作系统代表他们执行某些操作,因此 360 系列支持各种异常来指示事件的发生。某些异常指示错误,可能的违反安全行为,普通的系统请求或机器损坏。以下是许多可用异常中比较常见的异常:
- 寻址 - 引用不存在的内存。虽然这通常是编程错误,但如果程序访问未交换进来的虚拟内存,则会合法地发生此异常,在这种情况下不是错误条件。
- 时钟 - 计时器已发出信号,表明已经过去了另一秒。这不是错误条件。
- 数据 - 打包算术中的无效十进制数据值,某些算术或陷阱指令中的超出范围的值,
- 十进制除法 - 十进制算术指令中的除以 0。
- 十进制溢出 - 结果过大而无法容纳在提供的区域内时,会丢失数字。
- 外部中断 - 连接到计算机的设备已发出中断信号。这不是错误条件。
- 执行 - 尝试对带有执行操作码的指令使用执行指令 (EX)。
- 定点除法 - 二进制算术指令中的除以 0。
- 定点溢出 - 结果超过允许的最大值
- 浮点除法 - 浮点算术指令中的除以 0
- 浮点有效性 - 分数变为零
- 浮点平方根 - 值小于零
- I/O 中断 - 输入或输出设备(打印机、键盘、以太网)已发出信号,表明它已完成处理发送给它的数据或命令,或者有输入可用
- 机器检查 - 硬件的某一部分发生了故障。
- 监控 - 监控调用指令中的标记值被使用。
- 操作数 - 给 I/O 指令提供的某些值不正确。
- 操作 - 尝试执行无效的操作码。
- 页面转换 - 要引用的内存页面的地址表被标记为无效(这并不一定错误,可能意味着操作系统已将该页面交换出去,需要恢复它)
- 主要权限 - 给程序转移 (PT) 指令提供不正确或无效的值。
- 特权操作 - 问题程序试图执行特权指令。
- 保护 - 访问无效、不存在或未经授权的内存。
- 规格 - 尝试在奇数地址执行(或将控制权转移到)指令;在某些浮点算术指令中使用不正确的浮点寄存器;在指令中使用不在正确地址边界(半字、字、双字)上的内存地址。
- 管理调用 - 程序已发出管理调用 (SVC) 指令。这不是错误条件。
- 计时器中断 - 中断计时器已发出信号,表明时间限制已到。这不是错误条件。
- 转换 - 给程序调用 (PC) 指令提供无效的代码。
360 上的某些寄存器是“保留”的,要么是硬件要求,要么是约定(操作系统使用或通用做法)。请注意,这些仅仅是约定或一般做法,因为从技术上讲,没有一个通用寄存器被保留用于任何特定用途。
寄存器 0 通常在许多指令中用作占位符,表示没有操作。许多指令将使用寄存器 0 视为具有推定的零值或等效于内存中的地址 X'00000000'(在 64 位模型上为 X'0000000000000000')。根据操作系统以及地址 0 是真实地址 0 还是虚拟地址,该区域可能受到读、写或读写保护(除非当前任务在管理状态或存储密钥 0 下运行)。
寄存器 1 按照约定用于指向传递给被调用子程序的参数列表(32 位地址),以及用于传递操作系统调用 (SVC) 的参数。它也由翻译和测试指令 TRT 特别使用。
寄存器 2 可能被某些操作系统或某些指令用于其他参数或返回值,但通常可用于通用用途。
寄存器 3 到 寄存器 12 可用于通用用途(除了 Linux 中编号低于 7 的寄存器可用于管理调用的参数)。
寄存器 13 按照约定用于指向被调用子程序用于存储传递寄存器的保存区域。它在具有堆栈的处理器上等效于“堆栈指针”。作为独立应用程序运行且不调用任何子程序的程序可以使用该寄存器用于任何目的,但不建议这样做,除非在源代码中放置警告,表明正在这样做,因为这是非标准的,并且可能会被以后维护该应用程序的任何人忽略。
寄存器 14 按照约定用于提供被调用子程序返回到调用者的地址。
寄存器 15,按照惯例,用来提供被调用子程序的入口地址,并为子程序提供初始基址寄存器。如果子程序很短(并且它本身不调用更低级的子程序或发出更改寄存器 15 的 Supervisor Call),子程序可以继续使用寄存器 15 作为其基址寄存器;或者,更典型的情况是,它会立即将此寄存器(以及其他寄存器)保存在寄存器 13 提供的保存区域中,并使用不同的寄存器(或一组寄存器)作为基址。此外,寄存器 15 可能会被某些操作系统用来提供一些参数(或从 SVC 返回一些值)。它用于此目的与某些小型机和微型机上的程序计数器寄存器有一些相似之处。按照惯例,寄存器 15 也经常用作从被调用子程序返回的值,通常设置为索引值(0、4、8、12 等),适合在返回后直接用在分支表中。
当程序在 Linux 操作系统上运行时,Supervisor Calls 会分别在寄存器 1 到 6 中传递最多 6 个值。当程序在 OS/VS1 或 z/OS 上运行时,Supervisor Calls 会在寄存器 0、1 中传递值,如果超过 2 个,则在寄存器 1 指向的列表中传递值。
程序状态字
[edit | edit source]程序状态字 (PSW) 是一个 64 位(在 IBM 360、370、ESA/390、Univac 和 Fujitsu 上)或 128 位(在 IBM z/System 上)的 privileged 寄存器,它包含有关机器当前状态的信息(位 12 决定它是一个 64 位还是 128 位寄存器)。与通用寄存器不同,PSW 不能直接访问读或写。privileged 程序可以通过 privileged LPSW(在 360/370/390 系列上)或 LPSWE(在 z/System 上)指令更改整个 PSW 的内容。非 privileged 程序可以通过执行比较指令、测试指令和 SVC 指令,或通过某些算术和比较指令,以及通过分支指令,更改 PSW 中的某些位。PSW 中具有固定值的区域在下面的表格中以绿色显示。
注意,IBM 大型机对位编号的约定与常用的约定相反。位 0 是最高有效位;位 64(或 64 位系统上的 128 位)是最低有效位。
64 位 | Func | 0 | R | 000 | T | I O |
E X |
Key | Type | M | W | P | AS | CC | Prog Mask |
00000000 | A | 指令地址 |
位 # | 0 | 1 | 2-4 | 5 | 6 | 7 | 8-11 | 12 | 13 | 14 | 15 | 16-17 | 18-19 | 20-23 | 24-31 | 32 | 33-63 |
128 位 | Func | 0 | R | 000 | T | I O |
E X |
Key | Type | M | W | P | A S |
CC | Prog Mask |
R I |
000000 | E A |
位 # | 0 | 1 | 2-4 | 5 | 6 | 7 | 8-11 | 12 | 13 | 14 | 15 | 16-17 | 18-19 | 20-23 | 24 | 25-30 | 31 | |
Func | B A |
0000000000000000000000000000000 | 指令地址 | |||||||||||||||
位 # | 32 | 33-63 (31 位) | 64-127 (64 位) |
以下是 PSW 中字段的解释。
- (R) - 位 1:如果控制寄存器 9 中的某些 PER 事件掩码位被设置,则设置为(值 1)以允许程序事件记录 (PER) 中断。
- (T) - 位 5:如果动态地址转换 (DAT) 已启用,则设置为;这允许虚拟化地址;如果清除,则寄存器中使用的所有地址都是真实地址。
- (IO) - 位 6:如果允许发生输入/输出 (IO) 中断,则设置为,由控制寄存器 6 中的位控制。
- (EX) - 位 7:如果允许发生外部中断,则设置为。
- (Key) - 位 8-11:包含当前正在运行任务的存储密钥。此密钥对于 privileged 任务为 0。任务只能写入标记有相同密钥的内存区域,除非其密钥为 0。某些型号可能允许或禁止读取标记有不同密钥的内存(对于没有以 0 为密钥运行的任务),具体取决于操作系统选择了什么。某些操作系统允许(只读)访问 X'1000' 以下的位置,以允许用户程序读取指向系统表的指针。(这假设用户程序不在虚拟地址 0 处运行)。
- (Type) - 位 12:对于 64 位 PSW 设置;如果为 128 位 PSW,则清除。
- (M) - 位 13:如果允许在检测到损坏的情况下发生机器检查中断,则设置为。受控制寄存器 14 中设置的掩码位的影响。
- (W) - 位 14:如果机器处于等待状态,则设置为;如果机器正在运行,则清除。
- (P) - 位 15:如果机器处于 supervisor 状态,则设置为;如果机器处于 problem 状态,则清除。
- (AS)- 位 16 和 17:与 T 位结合使用以控制如何执行地址转换。
位 5 | 位 16 | 位 17 | 地址处理 | |
指令 | 逻辑 | |||
0 | 任何值 | 真实模式(但是,如果位 16-17 为 X'01',则访问寄存器用于地址或值,而不是通用寄存器) | ||
1 | 0 | 0 | 主 | 主 |
0 | 1 | 主 | 地址寄存器 | |
1 | 0 | 主 | 辅助 | |
1 | 1 | Home | Home |
- (CC)- 位 18 和 19:条件代码,用于指示算术、比较、测试或逻辑指令的结果。
条件 | 符号 | PSW 中的条件代码 |
---|---|---|
结果为零或相等 | Z | 0 |
结果为负数 | N | 1 |
结果为正数 | P | 2 |
结果溢出 | O | 3 |
- (Prog Mask) - 位 20-23:指示是否屏蔽某些算术异常以防止导致中断。这些位可以通过 SPM 指令设置或清除。这些掩码是
- 位 20 - 整数溢出
- 位 21 - 十进制溢出
- 位 22 - 浮点下溢
- 位 23 - 浮点溢出
- (RI) (128 位 PSW) - 位 24:为 IBM 保留。
- (A) (64 位 PSW) - 位 32:如果启用了 31 位寻址,则设置为;如果使用 24 位寻址,则清除。
- (指令地址) 正在执行的当前指令的地址
- (64 位 PSW) - 位 33-63:24 位地址(或如果 A 位被设置,则为 31 位)。
- (128 位 PSW) - 位 64-127:64 位地址。
- {EA} 和 (BA) - 位 31 和 32 (128 位 PSW) : 控制寻址模式。如果 EA 和 BA 为零;则采用 24 位寻址。如果 EA 为 0,BA 为 1,则采用 31 位寻址。如果两者都为 1,则采用 64 位寻址。如果 EA 为 1,BA 为 0,则会抛出规范异常。
360 汇编语言 | |
360 系列 | 简介 · 基本常见问题解答 · 360 系列 · 360 架构 |
---|---|
360 指令集 | 360 指令 · 分支指令 · 数据传输指令 · 控制流指令 · 算术指令 · 逻辑指令 · 移位和旋转指令 · privileged 指令 · 其他指令 |
语法和汇编器 | 360 汇编器· 伪指令 |
指令扩展 | 浮点 · 高级语言 |