Skip to content
yucing edited this page May 7, 2022 · 13 revisions

第五週筆記

講解程式

  • c6.c

GCC

  • -w : 忽略所有警告
  • -W : 顯示警告

C6

  • ./c6.exe -s test/--.c : 印出組合語言

hello.c

1: #include <stdio.h>
2:
3: int main()
4: {
5:   printf("hello, world\n");
    1:A30054     ENT  0           --> 沒有參數不用保留區域變數所以為 0
    3:A3005C     ADDR 0:A70058    --> A70058 : 字串"hello, world"位置
    5:A30064     PSH              --> 將字串推到堆疊裡面
    6:A30068     PRTF             --> 印出
    7:A3006C     ADJ  1           --> 將參數清掉還原
6: }
    9:A30074     LEV              --> 離開

sum.c

1: #include <stdio.h>
2: 
3: // sum(n) = 1+2+...+n
4: int sum(int n) {
5:   int s;
6:   int i;
7:   s=0;                 --> sum(10)
    1:A70054     ENT  2
    3:A7005C     LEA  -1
    5:A70064     PSH
    6:A70068     IMM  0
    8:A70070     SI
8:   i=1;
    9:A70074     LEA  -2
   11:A7007C     PSH
   12:A70080     IMM  1
   14:A70088     SI
9:   while (i <= n) {
   15:A7008C     LEA  -2
   17:A70094     LI
   18:A70098     PSH
   19:A7009C     LEA  2
   21:A700A4     LI
   22:A700A8     LE
   23:A700AC     BZ  0?
10:     s = s + i;
   25:A700B4     LEA  -1
   27:A700BC     PSH
   28:A700C0     LEA  -1
   30:A700C8     LI
   31:A700CC     PSH
   32:A700D0     LEA  -2
   34:A700D8     LI
   35:A700DC     ADD
   36:A700E0     SI
11:     i ++;
   37:A700E4     LEA  -2
   39:A700EC     PSH
   40:A700F0     LI
   41:A700F4     PSH
   42:A700F8     IMM  1
   44:A70100     ADD
   45:A70104     SI
   46:A70108     PSH
   47:A7010C     IMM  1
   49:A70114     SUB
12:   }
13:   return s;
   50:A70118     JMP  15:A7008C
   52:A70120     LEA  -1
   54:A70128     LI
   55:A7012C     LEV
14: }
   56:A70130     LEV             --> 離開
15:
16: int main() {
17:   printf("sum(10)=%d\n", sum(10));
   57:A70134     ENT  0           --> 沒有參數不保留區域變數
   59:A7013C     ADDR 0:AB0058    --> 字串 sum(10) 的放置位置放到 a 裡面
   61:A70144     PSH              --> 推入堆疊
   62:A70148     IMM  10
   64:A70150     PSH              -->  10 推入堆疊
   65:A70154     JSR  1:A70054    -->  1 個指令跳到 A70054跳到第 7 (跳到副程式)
/*------------------從副程式 7 開始跑到 14 離開後,繼續執行------------------*/
   67:A7015C     ADJ  1           --> 
   69:A70164     PSH
   70:A70168     PRTF
   71:A7016C     ADJ  2
18:   return 0;
   73:A70174     IMM  0
   75:A7017C     LEV
19: }
   76:A70180     LEV

c6 虛擬機組合語言

  • LEA : 載入區域變數
  • IMM : 載入立即值
  • ADDR: 載入位址
  • JMP : 跳躍指令
  • JSR : 跳到副程式
  • BZ : 等於 0 時,跳 if (a==0) goto m[pc]
  • BNZ : 不等於 0 時,跳 if(a!=0) goto m[pc]
  • ENT : 進入副程式
  • ADJ : 調整堆疊
  • LEV : 離開副程式
  • LI : 載入整數
  • LC : 載入字元
  • SI : 儲存整數
  • SC : 儲存字元
  • PSH : 推入堆疊

上課內容

Clone this wiki locally