Q1. Yes. Q2.
  1. 248 (0xF8) 有同學答 51*3+11*2+4*3+4*3*6+1=153+22+12+72+1=260, 把 macro definition 也算進來, 是不對的. Macro definition 在展開後並不會存在 assembly program 中.
  2. 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來做說明:

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
Q7.
  1. 92及183行的USE CDATA改為USE
  2. 252 及 253 行刪掉
  3. 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:

  1. 0065+61=00C6
  2. 77100004+00C6=771000CA
Q9. 請大家用 gcc 跑一次看看:
  1. printf("ABSDIFF(3-1, 9+3)" "= %d\n", 3-1 > 9+3 ? 3-1 - 9+3 : 9+3 - 3-1);
  2. ABSDIFF(3-1, 9+3)= 8
Q10.
  1. Assembler
  2. Macro processor
  3. Assembler
  4. None
若對任一題有疑問,盡快通知老師