日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统真象还原第1.5章 NASM汇编学习

發布時間:2023/12/15 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统真象还原第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汇编学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。