Q1. Yes.
- 題目中已經說明巨集都被擴展開來,所以接下來是 assembler 的工作, 與
macro processor 無關. 有同學花了很大的篇幅說明在 macro 中沒有再定義
macro 云云, 其實和本題所問是無關的.
- 這個程式的 data item 都放在程式的最前面 (如同 Figure 2.18),
因此只剩下少數的 forward jump. 使用 Figure 2.19 的方式, 1-pass assembler
很容易可以組譯這個程式.
- 而巨集PRINT的裡的label
loop前面加上了'$'此符號,
則代表每expand一次,字元$會自動以$XX替換 (如 $AA $AB $AC),
不會產生duplicate label definition的問題。
- 題目要稍微修正一下, 前兩次呼叫 macro PRINT 時, 傳入的參數應該只有
32, 42, 前面沒有 "#" (因為 "#" 在 macro definition 中會自動加).
如果有同學指出會有語法錯誤的話,這題也算答對。
- 至於組合語言中寫 32, 42, 都是十進位; 很多同學把它當成 16 進位,
就各扣一分. 注意 "#" 絕非影響十進位十六進位的符號, 它只是標示 immediate
mode 而已.
Q2.
- 248 (0xF8)
- 51個3bytes
- 11個2bytes (RMO*3, COMPR*4, TIXR*4)
- 1個1bytes (OUTDEV)
- 12bytes (MACRO~MEND)巨集展開6次
有同學答 51*3+11*2+4*3+4*3*6+1=153+22+12+72+1=260, 把 macro definition
也算進來, 是不對的. Macro definition 在展開後並不會存在 assembly program
中.
- Header record:
HXMAS 0010000000F8
Q3.
*
***
*****
***
*****
*******
*****
*******
*********
*******
*********
***********
***
***
***
***
這題如果真要跑組合語言不容易. 比較好的解法是找出程式中的迴圈結構,
依它的控制變數改寫成高階語言, 就容易些了:
#define HEIGHT 4
#define MARGIN 5
main() {
int i,j,x;
for (i=1; i<=HEIGHT; i++) {
for (j=i; j<=i+2; j++) {
for (x=1; x<= MARGIN+1-j; x++) printf(" ");
for (x=1; x<= 2*j-1; x++) printf("*");
printf("\n");
}
}
for (i=1; i<=HEIGHT; i++) {
for (x=1; x<= MARGIN-1; x++) printf(" ");
for (x=1; x<= 3; x++) printf("*");
printf("\n");
}
}
Q4.
HREF 00100000003F
T001000150220120F201502200F0E200903200C0E20064F0000
T00101E1B0100010F20150100030F201201200C0F2FE50120090F2FE24B2FC7
E00101E
End record 要注意, 不是從 1000 開始.
Q5.
以Register A跟P1來做說明:
- 在main program
此兩動作把1 的值存到I裡。 接下來呼叫 subroutine 前
此兩動作把變數I的記憶體位址(也就是 0x1039)存進變數P1。接下來呼叫EXCH
會以 indirect mode, 把P1的值 (0x1039) 抓出來,再當成記憶體位置,
去 0x1039 (也就是變數 I 的位置)抓出數值 000001, load 進 Register A,
再存進TEMP.
而此程式將會完成 I, J 兩個變數值的交換。
Q6. 改為 Format 4 後,指令長度加一。刪掉 LTORG, 所以 literal 會擺在
整個 OBJFILE 的最後面。刪掉 line 185, 後面所有程式會往前一個 byte.
Literal Pool
| address | value
|
=c'EOF' | 1073 | 454F46
|
=x'F1' | 1076 | F1
|
=x'05' | 1077 | 05
|
- line 45: 03101073 (Format 4)
- line 135: E32035 (035=1076-1041)
- line 145: DB202F (02F=1076-1047)
- line 215: E32015 (015=1077-1062)
- line 230: DF200C (00C=1077-106B)
Q7.
- 92及183行的USE CDATA改為USE
- 252 及 253 行刪掉
-
block name | block number | address | length
|
---|
default | 0 | 0000 | 0071
|
CBLKS | 1 | 0071 | 1000
|
Q8. 這可以說是「計算機組織」的題目。有了 R 這個 register 後,relocation
更容易了。你不需要有 modification record; 每支程式都以為自己被載入到
0000, SIC/XE 執行時會自動把 R 的值加上來以計算 target address.
指令變為 Format 4 後長度增加,所以
Control section | Symbol name | Address | Length
|
---|
PROGA | | 0000 | 0065
|
| LISTA | 0042
|
| ENDA | 0056
|
PROGB | | 0065 | 0080
|
| LISTB | 00C6
|
| ENDB | 00D6
|
PROGC | | 00E5 | 0051
|
| LISTC | 0115
|
| ENDC | 0127
|
Ans:
- 0065+61=00C6
- 77100004+00C6=771000CA
Q9. 請大家用 gcc 跑一次看看:
-
printf("ABSDIFF(3-1, 9+3)" "= %d\n", 3-1 > 9+3 ? 3-1 - 9+3 : 9+3 - 3-1);
-
ABSDIFF(3-1, 9+3)= 8
Q10.
- Assembler
- will complain that the value is not a legal hexidecimal number.
- Macro processor
- will detect that there are too many arguments.
- Assembler
- will complain about a syntax error on line 75 "STCH ,X".
- Note that a macro processor simply replaces "&BUBADR" with an
empty string. See the example in Figure 4.8(a).
- None
- Synax is correct, but there will be a run-time error.
若對任一題有疑問,盡快通知老師。