360 汇编/360 指令/SVC
SVC — 监控调用 — 操作码 0A / 十进制 10 — 2 字节 RR 指令.
格式
[编辑源代码]- SVC number (其中 number 为 0-255 十进制或 X'00' 到 X'FF')
- SVC 11
RR 指令(2 字节) | |||
字节 1 位 (0-7) |
字节 2 位 (8-15) |
||
(以十六进制表示) | 操作码 0A |
立即值 0..FF / (dec 0..255) |
- 参数是 0 到 255(X'0' 到 X'FF')之间的立即值。
可用性
[编辑源代码]SVC 指令在所有型号上均可用,包括 360、370 和 z/System。
此指令用于允许程序调用操作系统以请求服务。操作数是监控调用号,范围在 0 到 255(十进制)之间。操作数的值取决于操作系统。通常,在将某些机器寄存器加载特定值后执行监控调用。监控调用可能会也可能不会返回信息。它们可能会在寄存器中返回信息,或在原始调用中传递的特定字段中返回信息。
在某些情况下,监控调用将永远不会返回。有几种可能的原因
- SVC 号码(第二个字节)无效,因为操作系统或本地例程都没有处理该 SVC 号码,并且程序没有建立恢复例程(错误处理程序),因此程序/任务被终止。
- 该 SVC 号码不允许此类程序使用,并且程序没有建立错误恢复例程,因此程序/任务被终止。
- 该 SVC 号码可能被此类程序使用,但操作它的用户缺乏使用它的权限,程序没有建立错误恢复例程,因此程序/任务被终止。
- 上述情况之一发生并且建立了恢复例程,并且将其交给控制。
- 该调用实际上是操作系统调用以终止程序。
- 该调用是到将控制权转移到另一个程序的例程。
- 该调用是注销用户(尽管这可能被视为程序终止的一种类型)。
- 该调用是到导致机器关闭的例程。
一些操作系统有特权 SVC,这些 SVC 不可用于用户程序,并非所有操作系统都使用所有 SVC 值。
通常,监控调用用作操作系统宏的一部分。例如,在 MVS、VS/1 和 z/OS 下,WTO 宏会发出 SVC 35。一些操作系统会通过使用“特权”监控调用为其自身的各个部分提供服务。监控调用在技术上并非特权指令,而是操作系统不允许非特权程序使用该特定监控调用,并且会根据监控调用管理器被编程执行的操作,要么使程序出错,要么返回错误。
例如,许多操作系统都有一个宏调用,供用户程序请求(和释放)自身的内存。IBM OS/VS 使用“GETMAIN”/“FREEMAIN”宏,而 Univac 的 VS/9 和 Fujitsu 的 BS2000 使用“REQM”/“RELM”,而 Linux 使用与 C 语言中的“malloc”函数等效的函数。但是,如果操作系统需要将信息存储在操作系统自己的内存中,例如关于任务的信息,用户程序不应访问这些信息,那么需要执行此操作的操作系统例程可以“重新发明轮子”通过重写内存分配代码,这可能会引入错误;它可以创建一个固定表,这将限制此目的的可用“插槽”数量,或者,如果操作系统是一个庞大的程序,它可以在固定地址调用内存分配例程。所有这些的另一种选择是,操作系统只需对其本身发出 SVC 指令以请求特权内存(或指向特权内存的指针)。这将消除始终在内存中驻留整个操作系统的必要性,并允许操作系统根据需要动态加载。试图使用此“特权”SVC 的非特权程序要么会收到错误代码,要么会被视为程序错误,要么转移到恢复例程,要么终止有问题的任务。
当发生监控调用指令时,程序计数器增加 2,PSW 存储在“监控调用旧 PSW 地址”中,监控调用号存储在“中断号地址”中,新的 PSW 从“监控调用新 PSW 地址”加载,所有这些都因型号而异。执行从监控调用新 PSW 中检索的程序计数器值处继续。
使用的 SVC 地址(十进制) | |||
机器 | SVC 旧 PSW | 中断号 | SVC 新 PSW |
360 系列 | 032-039 | 096-103 | |
370 系列和 z/System | 320-335 | 136-139 [1] | 448-463 |
- [1] 字节 137 的位 5 和 6 设置为 012,除非 SVC 是 EXECUTE 指令的结果,在这种情况下它们被设置为 102;其余位被清除。字节 139 包含 SVC 号码;字节 136-139 中的所有其他内容都被清零。
监控调用例程可以访问调用例程的内存和寄存器,并且可以使用它们来检索参数和/或返回值。使用的寄存器因操作系统而异,例如 OS/VS1、MVS 和 VM 通常会使用寄存器 0 和 1(在极少数情况下还会使用寄存器 2),有时还会使用 14 或 15;VS/9 在 Univac 90/60、90/70 和 90/80 大型机上的操作系统也是如此,而 Linux 在 S/390 上会使用寄存器 0 到 6(具体取决于参数数量),并且在某些情况下可能会使用 14 或 15。监控调用的寄存器使用是通过普遍使用建立的约定,而不是由硬件强制执行。
监控调用例程通常会通过从监控调用旧 PSW 地址的地址使用 LPSW 指令退出,以返回到 SVC 指令后的调用程序中的指令。SVC 返回信息的机制可能是通过寄存器或内存中的更改,用户通过寄存器或寄存器中的参数列表指向这些更改。结果和值取决于操作系统。
条件码更改为存储在监控调用新 PSW 地址处存储的 PSW 的条件码位中的条件码值。从监控调用返回时,操作系统中的监控例程可以选择更改任何条件码作为其操作的结果。否则,返回到发出 SVC 的程序时的条件码将与调用时相同。
监控调用是非特权指令,不会导致程序异常。用于任何特定服务的特定 SVC 号码由程序运行的操作系统分配,如果错误,操作系统可能不会产生明显的结果、意外或不希望的结果、终止程序或将控制权转移到异常例程。
上一条指令 BCR |
360 汇编指令 | 下一条指令 BSM |
上一条操作码 09 |
下一条操作码 0B |
360 汇编语言 | |
360 系列 | 简介 · 基本常见问题解答 · 360 系列 · 360 架构 |
---|---|
360 指令集 | 360 指令 · 分支指令 · 数据传输指令 · 控制流指令 · 算术指令 · 逻辑指令 · 移位和旋转指令 · 特权指令 · 其他指令 |
语法和汇编器 | 360 汇编器· 伪指令 |
指令扩展 | 浮点数 · 高级语言 |