Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
系統程式 第 3 章 -- 組合語言
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
陳鍾誠
April 14, 2022
Education
460
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
系統程式 第 3 章 -- 組合語言
陳鍾誠
April 14, 2022
More Decks by 陳鍾誠
See All by 陳鍾誠
第 6 章、巨集處理器
ccckmit
0
140
第 7 章、高階語言
ccckmit
0
220
第 9 章、虛擬機器
ccckmit
0
150
第 8 章、編譯器
ccckmit
0
260
數學、程式和機器
ccckmit
2
850
語言處理技術
ccckmit
0
230
微積分
ccckmit
1
540
系統程式 第 1 章 -- 系統軟體
ccckmit
0
600
系統程式 第 2 章 -- 電腦的硬體結構
ccckmit
0
580
Other Decks in Education
See All in Education
AWS Certified Generative AI Developer - Professional Beta 不合格体験記
amarelo_n24
1
320
Why the humanities may be your best career bet
figarospeech
0
200
Examen de Selectividad. Geografía junio 2026 (Convocatoria Ordinaria). UCLM
juanmartin2026
0
120
事業紹介資料(トレーナー養成講座)
kentaro1981
0
440
教育現場から見た Ruby on Rails
yasslab
PRO
0
170
AI進化史:LLMからAIエージェントへ
mickey_kubo
0
190
AIには考えられないことを考えられる人になるために
iqbocchi
1
150
Πλουτοκρατία: Η Τυραννία του Μαμμωνά και η Μεταανθρώπινη Δουλεία
amethyst1
0
260
アラムコSTEAMチャレンジ 実践報告書
codeforeveryone
0
140
[2026前期火5] 論理学(京都大学文学部 前期 第8回)「正規化定理の証明」
yatabe
0
140
「機械学習と因果推論」入門① 因果効果とは
masakat0
0
1.8k
自己紹介 / who-am-i
yasulab
6
6.9k
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Chasing Engaging Ingredients in Design
codingconduct
0
220
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
610
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Between Models and Reality
mayunak
4
330
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
420
A Tale of Four Properties
chriscoyier
163
24k
The Language of Interfaces
destraynor
162
27k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
Transcript
第 3 章、組合語言 作者:陳鍾誠 旗標出版社
第 3 章、組合語言 3.1 基本範例 3.2 陣列存取
3.3 副程式呼叫 3.4 進階語法 3.5 實務案例:IA32 的組合語言
CPU0 的組合語言 前置表示法 CPU0 的組合語言一律採用目標在前的撰寫方式。 範例
ADD R1, R2, R3 相當於 R1 = R2 + R3
3.1 基本範例 資料移動 基本數學運算 模擬條件判斷 模擬迴圈
一個完整範例 -- 從 1 加到 10
資料移動 C 語言 組合語言 以組合語言移動記憶體資料
基本數學運算
模擬條件判斷
模擬迴圈
一個完整範例 - 從 1 加到 10
3.2 陣列存取 字串複製 (指標版) 字串複製 (索引版) 整數陣列的複製
字串複製 (指標版)
字串複製 (索引版)
整數陣列的複製
3.3 副程式呼叫 單層次的副程式呼叫 參數的傳遞方法 – 使用暫存器 多層次的副程式呼叫
參數的傳遞方法– 使用堆疊
單層次的副程式呼叫 參數的傳遞方法 – 使用暫存器
指令 CALL [0x30] 的執行過程 (1) PC=PC + 4; 在指令擷取之後 PC
從 28 變為 2C。 (2) LR = PC; 將 PC 存入到連結暫存器 LR 中。 (3) PC=PC + 30 記憶體 =CALL [0x30] 2B 00 00 30 ALU (加法運算) 暫存器 IR = 2B 00 00 30 (CALL [0x30]) PC = 00 00 00 2C 00 00 00 5C (3) LR = 00 00 00 2C (2) (1) 0028 002C 005C 圖 3.1 指令CALL [0x30] 的執行過程
指令 RET 的執行過程 記憶體 0028 CALL [0x30] 2B 00 00
30 PC=0070 ALU (加法器…) 暫存器 IR = 2C 00 00 00 (RET) PC =00 00 00 70 LR = 00 00 00 2C 將 LR 放回 PC 2C 00 00 00 PC=002C … RET … 圖 3.2 指令RET 的執行過程
多層次的副程式呼叫 參數的傳遞方法– 使用堆疊 避免上下層函數用到同一個暫存器,所產生的覆蓋現象。 將 LR 儲存到堆疊中,以免在下一層
CALL 返回位址被覆蓋掉。 f1: POP R2 取得堆疊中的參數 PUSH LR 保存 LR ST R2, t LD R3, pt PUSH R3 CALL f2 ST R1, b ADD R1, R1, R1 POP LR 恢復 LR RET 返回 t: RESW 1 b: RESW 1 pt: WORD t int f1(int t) { int b = f2(&t); return b+b; } 範例 3.12 的片段
None
3.4 進階語法 定址範圍的問題 初始值 Literal : 值接將常數嵌入到指令中
假指令 LTORG : 以 LTORG 提早展開 Literal EQU : 符號定義 ORG : 重設位址 運算式 分段
定址範圍的問題 避免將巨大陣列放在中間,應該放在最後面,或者 用指標的方式解決巨大陣列的問題。
初始值 範例 3.14 中的 EOF, oDev 等變數都具有初始值。
Literal – 直接將常數嵌入到指令中
以 LTORG 提早展開 Literal 的範例
EQU 假指令 EQU 是 (Equal)『等於』的意思 我們可以使用 EQU
定義常數,如範例 3.17 所示
使用 EQU 模擬 struct 結構 在範例 3.18 (a) 中,我們將
name 定義為 person 的位址 age 定義為 person 的位址 + 20 因而模擬了類似 3.18 (b) 當中的功能。
錢字號 ($) 錢字號 ($) $ 在組合語言中通常代表目前位址 (有些組譯器用星號
*)
使用 EQU 模擬 struct 結構
ORG 假指令 ORG 的功能是用來重新設定組譯器的目前位址
運算式
分段假指令 一個組合語言程式通常可分為 程式段 (.text) 資料段 (.data)
有時會將未設初值的資料放入 BSS 段 (.bss) 中。
3.5 實務案例:IA32 的組合語言 IA32 是目前 IBM PC 上最常用的處理器
IBM PC 的組合語言相當複雜,尤其是輸出入部分 使用 BIOS 中斷進行輸出入 使用 DOS 中斷呼叫進行輸出入 使用 Windows 系統呼叫進行輸出入 為了避開輸出入的問題,在本節中, 我們將採用 C 與組合語言連結的方式
IA32 的組譯器 在 IA32 處理器上, 目前常見的組譯器有 微軟的 MASM
(採用 Intel 語法) GNU 的 as 或 gcc (採用 AT&T 語法) 開放原始碼的 NASM (採用 Intel 語法) 在本節中,我們將使用 GNU 的 gcc 為開發工具 您可以選用 Dev C++ 中的 gcc – (Dev C++ 為本書的主要示範平台) Cygwin 中的 gcc Linux 平台中的 gcc
Intel 語法 v.s. AT&T 語法
C 與組合語言的完整連結範例 (一)
範例 3.25 的執行結果
C 與組合語言的完整連結範例 (二)
範例 3.27 的執行結果
習題 1. 請寫出一個 CPU0 的組合語言程式,可以計算 a=b*3+c-d 的算式。 2. 請寫出一個 CPU0
的組合語言副程式 swap,可以將暫存器 R1 與 R2 的內容 交換。 3. 請寫出一個 CPU0 的組合語言副程式 isPrime,可以判斷暫存器 R2當中的值 是否為質數,如果是就將 R1 設為 1 傳回,否則就將 R1 設為 0。 4. 請寫出一個 CPU0 的組合語言程式,可以計算出 2*2+4*4…+100*100 的結果, 並將結果儲存在變數 sum 當中。 5. 請以圖解的方式,說明在IA32處理器的 eax 暫存器中,為何會有 eax, ax, ah, al 等不同名稱,這些名稱代表的是哪個部分? 6. 請寫出一個 IA32 的組合語言副程式 swap,可以將暫存器 R1 與 R2 的內容交 換。 7. 請寫出一個 IA32 的組合語言副程式 isPrime,可以判斷暫存器 R2當中的值是 否為質數,如果是就將 R1 設為 1 傳回,否則就將 R1 設為 0。 8. 請撰寫一個 IA32 的組合語言程式,可以計算 2*2+4*4…+100*100 的結果後 傳回,然後仿照3.5.1節的作法,使用 GNU 的 gcc 編譯連結該程式,並且執 行看看結果是否正確。