1 / 40

本節介紹支援 SIC/XE 機器架構的組譯程式設計。 SIC/XE 機器的組合語言範例程式及對應的目的碼請見 Figure 2.6(p. 58) 。

本節介紹支援 SIC/XE 機器架構的組譯程式設計。 SIC/XE 機器的組合語言範例程式及對應的目的碼請見 Figure 2.6(p. 58) 。 此程式是將 Figure 2.2 的程式以 SIC/XE 機器的指令改寫而成。 此程式大量的使用 register-to-register 指令來替代原本的 register-to-memory 的指令。 將指令大量改寫為立即定址法的指令。. 2.2 與機器相關的組譯程式特性. 在 SIC/XE 機器的組合語言程式中,「間接定址」指令是在運算元之前加一個「 @ 」符號來表示。

ross
Télécharger la présentation

本節介紹支援 SIC/XE 機器架構的組譯程式設計。 SIC/XE 機器的組合語言範例程式及對應的目的碼請見 Figure 2.6(p. 58) 。

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 本節介紹支援SIC/XE機器架構的組譯程式設計。 • SIC/XE機器的組合語言範例程式及對應的目的碼請見 Figure 2.6(p. 58)。 • 此程式是將Figure 2.2的程式以SIC/XE機器的指令改寫而成。 • 此程式大量的使用 register-to-register 指令來替代原本的register-to-memory的指令。 • 將指令大量改寫為立即定址法的指令。 2.2 與機器相關的組譯程式特性

  2. 在SIC/XE機器的組合語言程式中,「間接定址」指令是在運算元之前加一個「@」符號來表示。 • 70 J @RETADR • … • 95 RETADR RESW 1 2.2 與機器相關的組譯程式特性

  3. 在SIC/XE機器的組合語言程式中,「立即定址」指令則前置一個「#」符號來表示。在SIC/XE機器的組合語言程式中,「立即定址」指令則前置一個「#」符號來表示。 • 12 LDB #LENGTH • 25 COMP #0 • 55 LDA #3 • 133 +LDT #4096 2.2 與機器相關的組譯程式特性

  4. 一般來說,需要存取主記憶體(register-to-memory)的指令會被嘗試組譯成程式計數器相對定址或基底暫存器相對定址的方式(格式三的指令)。一般來說,需要存取主記憶體(register-to-memory)的指令會被嘗試組譯成程式計數器相對定址或基底暫存器相對定址的方式(格式三的指令)。 • 當指令被組譯成基底暫存器相對定址,則必須搭配使用組譯程式指引:BASE。 • 若使用這兩種定址模式仍無法組譯成功,則指令必須被組譯成格式四(使用絕對位址)。 2.2 與機器相關的組譯程式特性

  5. 第2.2.1小節介紹為了支援SIC/XE機器上不同指令格式及定址模式,對組譯程式所造成的差異(相較於SIC標準版機器)。第2.2.1小節介紹為了支援SIC/XE機器上不同指令格式及定址模式,對組譯程式所造成的差異(相較於SIC標準版機器)。 • 第2.2.2小節介紹為了在SIC/XE機器上支援 multiprogramming,組譯程式所必須提供的額外功能(如何提供額外的資訊以支援載入重定位)。 • SIC/XE的機器上有較大的可用記憶體空間。 • 當記憶體有空間時,我們需要能將之(從不同的位址)載入,而非載入至固定位址。 2.2 與機器相關的組譯程式特性

  6. 會被組譯成格式一的指令,例如: FIX(C416), FLOAT (C016), HIO(F416), TIO(F816)等指令。組譯程式查閱OPTAB後,即可以很容易地完成組譯。(範例程式未使用到此類指令)。 格式一: 2.2.1 指令格式及定址模式 OP 8

  7. 會被組譯成格式二的指令,都是屬於register-to-register的指令,例如: CLEAR(B416), COMPR(A016) 。 • 組譯程式查閱OPTAB及暫存器的代碼後,即可以很容易地完成組譯。 • 125 RDREC CLEARX • 130 CLEARA • 132 CLEARS • 150 COMPRA, S 2.2.1 指令格式及定址模式

  8. 各暫存器運算元的代碼可以在組譯前就預先載入SYMTAB或使用額外的表格來存放。各暫存器運算元的代碼可以在組譯前就預先載入SYMTAB或使用額外的表格來存放。 • A(016), X(116), L(216), PC(816), SW (916), B(316), S(416), T(516), F(616)。 • 格式二: 2.2.1 指令格式及定址模式 r1 OP r2 8 4 4

  9. 若是register-to-memory 的指令,則以下列的順序(定址模式或指令格式)來嘗試是否可被組譯成功: • 程式計數器相對定址模式 (PC) • 基底暫存器相對定址模式 (B) • 格式三: 2.2.1 指令格式及定址模式 OP n i x b p e disp 6 6 12

  10. 若嘗試程式計數器相對或基底暫存器相對定址模式都無法被組譯成功,則必須使用格式四。若嘗試程式計數器相對或基底暫存器相對定址模式都無法被組譯成功,則必須使用格式四。 • 格式四有20 bits的位址欄,可完全定址SIC/XE機器(可用主記憶體為1M bytes)當中任一個主記憶體空間。 • 使用格式四時,只需要在address欄填入運算元的絕對位址即可。 2.2.1 指令格式及定址模式

  11. 程式設計師必須自行判斷指令是否需要使用格式四,若需要,則必須自行在指令前加上 ‘+’符號。 • 若在指令前未加上 ‘+’符號,組譯器會試著以程式計數器相對或基底暫存器相對定址模式(格式三)來組譯。 • 若以格式三來組譯失敗,則此指令無法被正確組譯(組譯程式產生錯誤訊息)。 2.2.1 指令格式及定址模式

  12. 組譯成格式四的例子: LineLOCObject code 15 0006 +JSUB RDREC4B101036 …………. 125 1036REREC CLEAR X 註: JSUB = (48)16 • 格式四: 2.2.1 指令格式及定址模式 OP n i x b p e address 6 6 20

  13. 若是register-to-memory 的指令,如何判斷是否可以使用程式計數器相對或基底暫存器相對模式來組譯? • 先計算出偏差位址(disp)。 • 然後依據程式計數器相對或基底暫存器相對定址模式的disp有效範圍來決定。 2.2.1 指令格式及定址模式

  14. 使用程式計數器相對定址的例子(一): LineLOCObject code 10 0000 FIRST STL RETADR17202D …………. 95 0030RETADR RESW 1 Disp=(030)16-(003)16= (02D)16 在PC相對定址的disp有效範圍內 STL =(14)16 2.2.1 指令格式及定址模式

  15. 使用程式計數器相對定址的例子(二): LineLOCObject code 15 0006 CLOOP +JSUB RDREC …………. 40 0017J CLOOP 3F2FEC Disp=(006)16-(01A)16= (-14)16 在PC相對定址的disp有效範圍內 J =(3C)16 2.2.1 指令格式及定址模式

  16. 試寫出Line 20 的Object code: LineLOCObject code 20 000A LDA LENGTH ?????????? …………. 100 0033LENGTHRESW 1 註:LDA =(00)16 2.2.1 指令格式及定址模式

  17. 如何使用基底暫存器相對模式來組譯? • 計算出偏差位址(disp)及有效範圍的判定。 • 由於基底暫存器是在程式設計師的掌控之下,他必須使用組譯程式指引 BASE 以告知組譯程式執行此程式時基底暫存器的值,以便能算出正確的TA。 • 若以後基底暫存器另有其它用途(不想用於定址),則需使用組譯程式指引 NOBASE以告知組譯程式。 2.2.1 指令格式及定址模式

  18. 使用基底暫存器相對定址的例子(一): LineLOCObject code 12 0003 LDB #LENGTH69202D 13 BASE LENGTH 100 0033 LENGTH RESW 1 105 0036BUFFER RESB 4096 160 104E STCH BUFFER,X 57C003 Disp=(036)16-(033)16= (003)16 在B相對定址的disp有效範圍內 STCH =(54)16 2.2.1 指令格式及定址模式

  19. 使用基底暫存器相對定址的例子(二): LineLOCObject code 12 0003 LDB #LENGTH69202D 13 BASE LENGTH 100 0033 LENGTH RESW 1 175 104E EXIT STX LENGTH134000 Disp=(033)16-(033)16= (000)16 在B相對定址的disp有效範圍內 STX =(10)16 2.2.1 指令格式及定址模式

  20. 組譯立即定址的指令: LineLOCObject code 12 0003 LDB #LENGTH 69202D 55 0020 LDA #3 010003 133 103C +LDT #4096 75101000 100 0033 LENGTH RESW 1 LDA =(00)16 LDB =(68)16 LDT =(74)16 2.2.1 指令格式及定址模式

  21. 組譯間接定址的指令: LineLOCObject code 70 002A J @RETADR3E2003 ……………… 95 0030 RETADR RESW 1 J =(3C)16 2.2.1 指令格式及定址模式

  22. PROG1 START 0 LDS #3 +LDT #3072 CLEAR X ADDLP +LDA ALPHA,X +ADD BETA,X +STA GAMMA,X ADDR S,X COMPR X, T JLT ADDLP RSUB ALPHA RESW 1024 BETA RESW 1024 GAMA RESW 1024 END PROG1 試產生以下程式的目的碼

  23. PROG1 START 0 LDS #3 +LDT #3072 CLEAR X ADDLP +LDA ALPHA,X +ADD BETA,X +STA GAMMA,X ADDR S,X COMPR X, T JLT ADDLP RSUB ALPHA RESW 1024 BETA RESW 1024 GAMA RESW 1024 END PROG1 試產生以下程式的目的碼 LOC (0000)16 (0003)16 (0007)16 (0009)16 (000D)16 (0011)16 (0015)16 (0017)16 (0019)16 (001C)16 (001F)16 (0C1F)16 (181F)16

  24. PROG1 START 0 LDS #3 +LDT #3072 CLEARX ADDLP +LDA ALPHA,X +ADD BETA,X +STA GAMMA,X ADDRS,X COMPRX, T JLT ADDLP RSUB ALPHA RESW 1024 BETA RESW 1024 GAMA RESW 1024 END PROG1 試產生以下程式的目的碼 Object code (6D0003)16 (75100C00)16 (B410)16 (0390001F)16 (1B900C1F)16 (0F90181F)16 (9041)16 (A015)16 (3B2FED)16 (4F0000)16

  25. SUM START 0 FIRST LDX #0 LDA #0 +LDB #TABLE2 BASE TABLE2 LOOP ADD TABLE,X ADD TABLE2,X TIX COUNT JLT LOOP +STA TOTAL RSUB COUNT RESW 1 TABLE RESW 2000 TABLE2 RESW 2000 TOTAL RESW 1 END FIRST 試產生以下程式的目的碼

  26. SUM START 0 FIRSTLDX #0 LDA #0 +LDB #TABLE2 BASE TABLE2 LOOPADD TABLE,X ADD TABLE2,X TIX COUNT JLT LOOP +STA TOTAL RSUB COUNT RESW 1 TABLE RESW 2000 TABLE2 RESW 2000 TOTAL RESW 1 END FIRST 試產生以下程式的目的碼 LOC (0000)16 (0003)16 (0006)16 (000A)16 (000D)16 (0010)16 (0013)16 (0016)16 (001A)16 (001D)16 (0020)16 (1790)16 (2F00)16

  27. SUM START 0 FIRST LDX #0 LDA #0 +LDB #TABLE2 BASE TABLE2 LOOP ADD TABLE,X ADD TABLE2,X TIX COUNT JLT LOOP +STA TOTAL RSUB COUNT RESW 1 TABLE RESW 2000 TABLE2 RESW 2000 TOTAL RESW 1 END FIRST 試產生以下程式的目的碼 Object code (050000)16 (010000)16 (69101790)16 (1BA013)16 (1BC000)16 (2F200A)16 (3B2FF4)16 (0F102F00)16 (4F0000)16

  28. 試組譯以下程式(習題): 第2.2節範例程式, page 55 & 58 2.2.1 指令格式及定址模式

  29. 2.2.2 程式重定位 • 希望許多個程式能夠同時共享一部電腦的記憶體及其他資源(如I/O設備)。 • 此為多元程式(multiprogramming)的概念。 • 如果能夠事先知道那些程式會被同時載入記憶體等待執行,組譯程式(在組譯時)可以指派給這些程式適當的位址(使得這些程式的空間不會重疊也不會浪費空間)。 • 但組譯程式通常無法事先得知這樣的資訊。

  30. 2.2.2 程式重定位 • 組譯程式不可能知道程式的真實載入位址等資訊。 • 只有當程式被(載入程式)載入到主記憶體時,才能知道它的起始位址。 • 因此,程式通常只要能找到一個合適的空間就載入。

  31. 2.2.2 程式重定位 • 請參考Figure 2.6 (P. 58)。 • 試考慮若將此程式從位址 5000或7420開始載入的情況: • 5 0000 COPY START 0 • …. • 15 0006 CLOOP +JSUB RDREC(4B101036) • …. • 125 1036 RDREC CLEAR X (B410)

  32. 圖2.7 程式重定址的範例 1036+5000 1036+7420

  33. 2.2.2 程式重定位 • 無論程式載入的位址為何,RDREC都是離程式起始的位址1036個bytes。 • 組譯程式產生15 CLOOP +JSUB RDREC 的目的碼時,可以同時產生重定位資訊(修正記錄)給載入器,以修正目的碼。 • 重定位資訊(修正記錄)指示載入器將程式(COPY)的載入起始位址加到 的位址欄。 • 15 CLOOP +JSUB RDREC(4B101036)

  34. 2.2.2 程式重定位 • 組譯程式能知道目的程式的那些部份需要修改(依據真實的載入位址)。 • 組譯程式產生指令的目的碼時,同時產生重定位資訊(修正記錄)。 • 目的程式中同時包含目的碼及重定位資訊的程式被稱為可重定位程式(relocatable program)。 • 那些指令需要重定位修正? • 以”直接(絕對)位址”方式組譯的指令。

  35. 2.2.2 程式重定位 • 以”直接(絕對)位址”方式組譯的指令。 • SIC/XE的格式四且其運算元為記憶體標記。 • SIC 中RSUB除外的一般指令。 • 以SIC/XE範例程式(Figure 2.6, P. 58)來看,以下指令的目的碼需要實施重定位修正: • LineLocSource StatementObject code • 15 0006 CLOOP +JSUB RDREC 4B101036 • 40 0013 +JSUB WRREC 4B10105D • 65 0026 +JSUB WRREC 4B10105D

  36. 修正記錄 欄1 M 欄2-7 需要修改之位址欄的起始位址,此位址乃相對於程式的起始處(16進制) 欄8-9 需要修改之位址欄的長度,以半位元組表示(16進制) 以JSUB指令為例,其修改記錄如下: M00000705

  37. 圖2.8 對應圖2.6的目的程式

  38. 2.2.2 程式重定位 • 以SIC標準版的範例程式(Figure 2.2, P. 47)來看,若程式COPY不是從位址0的地方開始載入,那些指令的目的碼需要實施重定位修正? • 總共31個指令需要修正: • Line 10~70 • Line 125~175 • Line 210~240

  39. 運算元為記憶體標記的指令被以相對定址模式組譯的好處:運算元為記憶體標記的指令被以相對定址模式組譯的好處: • 不論程式真實被載入的位址為何,組譯程式不必為它產生對應的修正記錄(目的程式會較小)。 2.2.2程式重定位

More Related