操作系统真象还原第1.5章 NASM汇编学习
第二章有使用 NASM 匯編寫主引導記錄 MBR 的內容。
在寫第二章的代碼前,每天晚上下班后花一些時間簡單地回顧了 NASM 匯編的內容,只復習了最簡單的語法,之后寫 OS 時再邊寫邊查資料。
指令
-  mov 數據傳送指令。 mov eax, 1 ; eax = 1 mov ebx, 2 ; ebx = 2 mov ecx, eax ; ecx = eax
-  add 加法指令。 add eax, 2 ; eax = eax + 2 add ebx, eax ; ebx = ebx + eax
-  ret 返回指令。用于函數調用后的返回。 
-  sub 減法指令。 sub eax, 1 ; eax = eax - 1 sub eax, ecx ; eax = eax - ecx
寄存器
-  通用寄存器 eax, ebx, ecx, edx
-  其它寄存器 esi, edi, ebp
內存
將寄存器的數據放到內存。eax 是 16 位的,編號 0x5566,0x5567,0x5568,0x5569這四個字節都會被 eax 的內容覆蓋掉。
mov [0x5566], eax
將內存的數據放到寄存器。把 0x0699 這個地址對應的內存區域的后四個字節取出來放到 eax 里面去。
mov eax, [0x0699]
流程控制
eip 寄存器保存下一條指令在內存中的地址。
C 語言中的 goto 語句,在編譯后就是一條 jmp 指令。jmp 在 CPU 內部發生的作用就是修改 eip。
條件語句:
-  C 語言: int main() {int a = 50;if(a > 10) {a = a - 10}return a; }
-  匯編語言: global mainmain:mov eax, 50cmp eax, 10jle xiaoyu_dengyu_shisub eax, 10 xiaoyu_dengyu_shi:ret
C 語言和匯編語言中的條件判斷,其組織思路是剛好相反的:
- C 語言中:a 大于 10 的時候,進入 if 塊中執行減法
- 匯編語言中:eax 小于等于 10 的時候,跳過中間的減法
跳轉指令:
ja 大于時跳轉
jae 大于等于
jb 小于
jbe 小于等于
je 相等
jna 不大于
jnae 不大于或者等于
jnb 不小于
jnbe 不小于或等于
jne 不等于
jg 大于(有符號)
jge 大于等于(有符號)
jl 小于(有符號)
jle 小于等于(有符號)
jng 不大于(有符號)
jnge 不大于等于(有符號)
jnl 不小于
jnle 不小于等于
jns 無符號
jnz 非零
js 如果帶符號
jz 如果為零
跳轉指令中字母含義:
- a: above
- e: equal
- b: below
- n: not
- g: greater
- l: lower
- s: signed
- z: zero
eflags 是標志寄存器,作用是記住一些特殊的 CPU 狀態。后續的跳轉指令就是根據 eflags 寄存器中的狀態來決定是否要進行跳轉的。
cmp 指令實際上是在對兩個操作數進行減法,減法后的一些狀態最終就會反映到 eflags 寄存器中。
循環語句:
-  C 語言: int sum = 0; int i = 1; while(i <= 10) {sum = sum + i;i = i + 1; }
-  匯編語言 global mainmain:mov eax, 0mov ebx, 1 _start:cmp ebx, 10jg _end_of_blockadd eax, ebxadd ebx, 1jmp _start_end_of_block:ret
函數調用
call 是函數調用指令。
jmp 和 call 都能修改 CPU 的 eip 寄存器,區別是:
jmp 跳過去就不知道怎么回來了。call 跳過去后可以通過 ret 指令回來。
在 call 指令執行的時候,CPU 在跳轉前會把 eip 寄存器的值保存起來。當遇到 ret 指令時,就把上一次 call 保存起來的 eip 值恢復。
內存中的棧是在程序啟動之前,由操作系統指定的一片內存區域,每一次函數調用后的返回地址都存放在棧里面。
esp 寄存器保存棧頂地址。在 x86 環境下,棧朝著低地址方向伸長。
入棧與出棧指令:
push eax ; 將 eax 的值保存到堆棧中去 pop ebx ; 將堆棧頂的值取出并存放到 ebx 中函數調用前,將返回地址和參數保存在棧中,函數返回前,從棧中恢復參數和返回地址。
總結
以上是生活随笔為你收集整理的操作系统真象还原第1.5章 NASM汇编学习的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: js根据文字(保存大小,字体)计算文字长
- 下一篇: php基础 快速入门文档,快速入门 -
