跳轉至內容

軟體工程師手冊/語言詞典/DEC PDP-11

來自華夏公益教科書

注意:所有組合語言示例程式碼都取決於開發環境彙編程式和作業系統。

數字裝置公司 PDP-11

[編輯 | 編輯原始碼]

以下是 維基百科詞條

CISC

執行入口點

[編輯 | 編輯原始碼]

在 Unix 上,程式執行將從第一個字開始。Unix 的“a.out”格式(彙編程式輸出)有一個頭,頭的第一個字,八進位制 407,是一個繞過頭部的其餘部分的分支。到第五版 Unix,頭實際上沒有載入到執行映像中,因此八進位制 407 不必執行;然而,“魔數” 0407(八進位制)仍然是 a.out 格式的一部分,即使該格式移動到其他計算機體系結構。

暫存器

[編輯 | 編輯原始碼]

有八個 16 位暫存器,透過指令中定址模式的三個位進行定址。暫存器 7 是程式計數器,暫存器 6 是堆疊指標。暫存器 0 到 5 是通用暫存器。堆疊向下增長。

定址模式包括後增量和前減量。一個流行的神話假設這些是 C 中增量和減量運算子的來源,但實際上這些是從 B 繼承來的,B 在 PDP-11 存在之前就已經實現了。

PC 被定址為一個普通暫存器,以及後增量定址模式的包含,導致你可以將一個字面值載入到一個暫存器中(或者將其傳送到記憶體,因為那樣會發生)。透過在記憶體中將指令後面的字面值。

       mov (PC)+, R5
       177265

將把八進位制 177265 放入暫存器 5 中。在彙編程式中(這裡使用 Unix 彙編程式語法),你可以將其縮寫為

       mov $177265, R5

通用語法

[編輯 | 編輯原始碼]

在 Unix 彙編程式中,一個冒號緊跟在每個標籤之後。

foo:   mov -(PC), -(PC)   / copy this instruction to the previous
                          / location and branch there
       br foo             / branch to foo

當然,在上面的例子中,跳轉到 foo 不必執行,因為前一條指令本身就是一個(糟糕的)迴圈。

指令欄位從低位側開始,以三位為界,因此很容易記住一些指令和定址模式,以便從前面板開關進行二進位制程式設計。例如,

       mov -(PC), -(PC)

的機器語言是八進位制 01x7x7,我忘記 x 是什麼了,但它表示定址模式,前減量,每個 7 表示 PC,01 是 move 的操作碼(表示複製)。然而,這些欄位邊界對於分支指令並不適用。

至少有一個彙編程式(DEC?)允許用分號分隔的註釋一直持續到行尾。在 Unix 彙編程式中,使用字元“/”代替。 [1]

處理器狀態字(PSW)在特定記憶體對映位置(-2,我相信)進行定址。中斷向量位於低記憶體中。中斷將返回地址壓入堆疊,以及其他內容,因為中斷的格式與子程式呼叫的格式不同,因為有一個與正常返回(從子程式)指令不同的返回中斷指令。

條件語句

[編輯 | 編輯原始碼]

有分支,它們跳轉到短的相對地址,以及跳轉指令,它們可以跳轉到使用任何定址模式的任何地址。只有分支可以是條件的,在這種情況下,它們將取決於前一個比較或算術指令設定的條件程式碼。我不記得是否有一個“永遠分支”。有一個“等待”,它將在下一個中斷到來之前等待,還有一個“停止”,它將在核心模式下或在沒有保護的機器上執行時將控制權交給控制檯。

      cmp r0, (r1)        / compare the contents of register R0 to
                          / what R1 points to in memory (two-byte word)
      bne foo             / branch not equal, to foo

輸入/輸出

[編輯 | 編輯原始碼]

裝置在高地址進行記憶體對映。你可以使用中斷或輪詢來知道它們何時就緒。有幾個級別的中斷(或匯流排請求)。

在光柵圖形成為de rigeur之前,有一臺名為 GT40 的圖形計算機。它有一個計算處理器,即 PDP-11,以及一個協處理器來執行向量圖形。圖形處理器有自己的跳轉指令,並將被放置在一個迴圈中以保持螢幕重新整理。有很棒的登月艙和太空戰爭程式。

當然,Unix 上的使用者程式使用系統呼叫進行 I/O,系統呼叫是陷阱指令。

stdout = 1
.data
msg:   <Hello, world.\n>
.code
       sys write; stdout; msg; 14.   / is the length
       / don't bother checking for error or a write of less than
       / the full buffer.
       sys exit; 0                   / exit with an OK status

我不確定退出狀態是否遵循上面的“sys exit”,或者是否在 r0 中。

       clr r0
       sys exit

由於系統呼叫的引數通常在記憶體中的陷阱指令之後,引數通常應該是可變的,並且如果你在可執行程式碼中混合了變數,你無法編寫可重入程式碼,所以 Unix 提供了“sys indir”呼叫,該呼叫可以指向資料空間中的系統呼叫,Unix 將解釋它就像它是在內聯執行一樣。

間接定址

[編輯 | 編輯原始碼]

<允許多少層地址間接定址?顯示示例程式碼。>

一層間接定址,由指令決定。你可以透過指令後面的字面值進行索引。

物理結構

[編輯 | 編輯原始碼]

<描述檔案、庫和部件通常是如何劃分和排列的。它們在各種形式中是否有典型的副檔名?>

在 Unix 上,組合語言通常使用 .s 副檔名(表示“原始碼”)。彙編的結果稱為 a.out,除非你告訴彙編程式使用其他名稱,在這種情況下,慣例是使用 .o 字尾(表示“物件”)。通常,連結器“ld”(表示“載入器”)將在多個 .o 檔案上執行以生成新的 a.out,然後你可以透過鍵入其名稱來執行它。

有用命令

[編輯 | 編輯原始碼]

<列出此組合語言中特別有用的命令的程式碼和描述。>

在 Unix 和 DEC 彙編器中,都存在臨時標籤。與其為每個需要的標籤都起一個名字,你只需使用一個數字,並在本地訪問它。

1:    cmp r3, r4           / hit size limit yet?
      bge 2f
      mov (r0)+, (r1)+
      inc r3
      br 1b
2:

在 Unix 彙編器中,2f 代表 2 個前向 (下一個 "2:"),1b 代表 1 個後向,以此類推。

跳轉可以跳到比分支更遠的地方,但會佔用兩個字,因此如果可能,分支更可取。彙編器提供了一種方式,如果分支能夠到達就編碼分支,否則就編碼跳轉。你可以有條件地編寫它,在這種情況下,彙編器會根據需要輸出一個圍繞跳轉的分支(當然,會反轉條件)。

     jle foo                 / jump to foo if less or equal
     jbr bar                 / jump or branch to bar

PDP-11 是最早的微型計算機之一。它被廣泛用於各種用途,從分時系統到嵌入式控制,以及一些桌面應用。PDP-11 本身不是一種語言,但 PDP-11 彙編是彙編的一種變體。這臺早期機器的架構影響了後來的微處理器,因為它影響了機器原生程式碼的設計,也影響了更高層次的語言。

後遞增定址也應用到了摩托羅拉 6800 中。

你唯一想學習 PDP-11 組合語言的原因是,你已經獲得了一臺可用的 PDP-11 機器,並且想要編寫或修改在其上執行的程式。這臺機器,PDP-11,以及所有執行它的原生機器都已過時。

<你可以在哪裡獲取此組合語言的彙編器、交叉彙編器和模擬器?>

網路參考資料

[編輯 | 編輯原始碼]

<列出網路上的其他參考資料。請說明參考資料適合哪些級別的讀者。(初學者/中級/高階)

程式碼集在網路上的位置?>

書籍和文章

[編輯 | 編輯原始碼]

PDP-11 程式設計師手冊,數字裝置公司

  1. 關於 UNIX 第 6 版的萊昂斯評註,第 2 章 - Unix 彙編器
華夏公益教科書