forked from ccccourse1/sp110b
-
Notifications
You must be signed in to change notification settings - Fork 0
w5.md
yucing edited this page May 7, 2022
·
13 revisions
- c6.c
- -w : 忽略所有警告
- -W : 顯示警告
- ./c6.exe -s test/--.c : 印出組合語言
- ./c6 test/--.c -o test/--.o : 產生目的檔
- ./c6 -u test/--.o : 列印目的檔
- ./c6 -r test/--.o : 執行目的檔
- ./c6 -d -r test/hello.o : 執行並印出過程
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 --> 離開
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 --> 將堆疊調整為 1
69:A70164 PSH --> 將 55 推入堆疊
70:A70168 PRTF --> 印出
71:A7016C ADJ 2 --> 指標回復
18: return 0;
73:A70174 IMM 0
75:A7017C LEV
19: }
76:A70180 LEV
- 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 : 推入堆疊