跳轉至內容

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/9Univac 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 彙編器· 偽指令
指令擴充套件 浮點數 · 高階語言
華夏公益教科書