X86匯編語言總結
下載地址:點擊打開下載鏈接
- AX、BX、CX、DX一般用來存放數據
- [BX]、[BP]、[SI]、[DI]中一般存放著某個段寄存器的偏移地址,默認情況下,[BX]中存放著數據段(DS)的偏移地址,[BP]中存放著棧段(SS)的偏移地址(功能和SP類似),其中BX隻能和SI、DI組合,BP隻能和SI、DI組合,SI、DI間是不能組合的
- Loop指令一般搭配著CX寄存器使用,每循環一次,CX寄存器中的值減少1
- 執行PUSH指令時,SP-2,執行POP時,SP+2
- 個人的一點總結:壓棧時,先減後壓;出棧時,先出後加
- dw:表示define word,即定義字,有16位
- db:表示define byte,即定義字節,有8位
- dd:表示double world,即定義雙字,有32位
- ptr來指定程序操作的內存的具體的大小
- 例如:
mov wordptr ds:[0],1 表示將1存放到大小為一個字(兩個字節)的內存單元中
mov byte ptrds:[0], 1 表示將1存放到大小為一個字節的內存單元中
- div:除法指令;inc:++指令;
- dup:是一個操作符,在匯編語言中同db、dw、dd等一樣,也是由編譯器識別處理的符號(偽指令)。Dup通常和db、dw、dd配合起來使用。dup示例如下:
db 3 dup(0) ------à定義了3個字節,它們的值都是0,相當於db 0,0,0
db 3 dup(0, 1, 2)-----à定義了9個字節,它們是:0、1、2、0、1、2、0、1、2
- offset:在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。
- NOP:空操作指令,功能: 本指令不產生任何結果,僅消耗幾個時鍾周期的時間,接著執行後續指令,常用於程序的延時等。
- Jmp short ptr 標號
Ø 8位位移=“標號”處的地址-jmp指令後的第一個字節的地址;
Ø Short ptr指明此處的位移為8位位移,進行的是段內短轉移
Ø 8位位移的範圍是:-127 ~ 12,用補碼表示
Ø 8位位移由編譯器在編譯時算出。
- Jmp near ptr 標號
Ø 16位位移=“標號”處的地址-jmp指令後的第一個字節的地址
Ø Near ptr指明此處的位移為16位位移,進行的是段內近轉移
Ø 16位位移的範圍是:-32769 ~ 32767,用補碼表示
Ø 16位位移由編譯器在編譯時算出。
- Jmp far ptr 標號
Ø 實現的是段間轉移,又稱為遠轉移。
Ø Far ptr指明了指令用標號的段地址和偏移地址修改CS和IP。
- Jmp word ptr 內存單元地址(段內轉移)
Ø 內存單元地址開始處存放著一個字,是轉移的目的地址。
Ø 內存單元地址可用尋址方式的任一格式給出。
- Jmp dword ptr 內存單元地址(段間轉移)
Ø 從內存單元地址處開始存放著兩個字(四字節),高地址處的字是轉移的目的段地址,低地址處是轉移的母的偏移地址。
(CS) = (內存單元地址+2)
(IP) = (內存單元地址)
Ø 內存單元地址可用尋址方式的任一格式給出。
- Jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改範圍都為-128 ~ 127。
Ø 指令格式:jcxz 標號(如果(CX) = 0,則轉移到標號處執行)
Ø 當(cx)= 0時,(IP)=(IP)+ 8位位移
- Ret指令用棧中的數據,修改IP的內容,從而實現近轉移!
Ø CPU執行ret指令時,進行下麵兩步操作:
(1)(IP) = ((SS) * 16 + (SP))
(2)(SP) = (SP) +2
- Retf指令用棧中的數據,修改CS和IP的內容,從而實現遠轉移
Ø CPU執行retf指令時,進行下麵兩步操作:
(1) (IP) = ((SS) * 16 + (SP))
(SP) = (SP) + 2
(2) (CS) = ((SS) * 16 + (SP))
(SP) = (SP) + 2
- Call指令經常跟ret指令配合使用。
Ø 一次CPU執行call指令,進行如下兩步操作:
(1)將當前的IP或CS和IP壓入棧中;
(2)轉移(jmp)
Ø Call指令不能實現短轉移,除此之外,call指令實現轉移的方法和jmp指令的原理相同。
Ø Call 標號(將當前的IP壓棧後,轉移到標號處執行指令.)。
Ø CPU執行此種格式的call指令時,進行如下的操作:
(1)(SP) = (SP) – 2
((SS) * 16 + (SP)) = (IP)
(2)(IP) = (IP) + 16位位移
² 16位位移 = “標號”處地址 – call指令後的第一個字節的地址;
² 16位位移的範圍為-32768 ~ 32767,用補碼表示;
² 16位位移由編譯器在編譯時算出。
- Call far ptr 標號指令的操作:
Ø (1) (SP) = (SP) – 2
((SS) * 16 + (SP)) = (CS)
(SP) = (SP) – 2
((SS) * 16 + (SP)) = (IP)
(2)(CS) = 標號所在的段地址
(IP) = 標號所在的偏移地址
- Call 16位寄存器
Ø 操作過程:
(SP) = (SP) – 2
((SS) * 16 + (SP)) = (IP)
(IP) = (16位寄存器)
- 轉移地址在內存中的call指令格式:
Ø (1)call word ptr內存單元地址
call dword ptr內存單元地址
- Mul:乘法指令,若乘數位8位則乘積默認保存在AX中,若乘數位16位在乘積保存在DX和AX中。
- Int():描述性運算符,取商,例如:int(38/10) = 3
- Rem():描述性運算符,取餘數,例如:rem(38/10) = 8
- 標誌寄存器:
Ø ZF:零標誌位(第6位)-à運算結果為零,則此位為1
Ø PF:奇偶標誌位(第2位)---à運算結果中含1的個數是偶數,則此位為1
Ø SF:符號標誌位(第7位)---à運算結果為負,則此位為1
Ø CF:進位標誌位(第0位)--à無符號數運算若產生進位或借位,則此位為1
Ø OF:溢出標誌位(第1位)--à有符號數運算若產生溢出,則此位為1
Ø DF:方向標誌位(第10位)àDF = 0每次操作後si,di遞增;DF = 1每次操作後si,di遞減
- Adc 操作對象1,操作對象2 是帶進位加法指令
Ø 功能:操作對象1 = 操作對象1 + 操作對象2 +CF
- Sbb 操作對象1,操作對象2 是帶借位的減法指令
Ø 功能:操作對象1 = 操作對象1 – 操作對象2 – CF
- Cmp指令
Ø 格式:cmp操作對象1,操作對象2
Ø 功能:計算操作對象1 – 操作對象2但並不保存結果,僅僅根據計算結果對標誌寄存器進行設置。
- 檢測比較結果的條件轉移指令
Ø 條件轉移指令小結
指令
含義
檢測的相關標誌位
Je
等於則轉移
ZF = 1
Jue
不等於則轉移
ZF = 0
Jb
低於則轉移
CF = 1
Jnb
不低於則轉移
CF = 0
Ja
高於則轉移
CF = 0, ZF = 0
Jna
不高於則轉移
CF = 1或ZF = 1
- Movsb指令
Ø 功能:(以字節為單位傳送)
(1)((ES) * 16 + (DI)) = ((DS) *16 +(SI))
(2)如果DF = 0,則:(si) = (si) + 1
(di) = (di) + 1
如果DF = 1,則:(si) = (si) – 1
(di) = (di) – 1
- Movsw指令
Ø 功能:(以字為單位傳送)
(1)((ES) * 16 + (DI)) = ((DS) * 16 + (SI))
(2)如果DF = 0,則:(si) = (si) + 2
(di) = (di) + 2
如果DF = 1,則:(si) = (si) – 2
(di) = (di) – 2
Ø Movsb和movsw一般都是和rep指令配合使用的。
² 格式:rep movsb或 repmovsw
² Rep的作用是根據cx的值,重複執行後麵的串傳送指令
- cld指令:將標誌寄存器的DF位設置為0
- std指令:將標誌寄存器的DF位設置為1
- pushf指令:將標誌寄存器的值壓棧
- popf指令:從棧中彈出數據送入標誌寄存器中
- 8086CPU中斷過程:
Ø (1)取得中斷類型碼N
(2)pushf ==========è 將標誌寄存器的值壓入棧中,保護標誌寄存器中的數據
(3)TF = 0,IF = 0 ===è 設置標誌寄存器的第8位TF和第9位IF設置為0
(4)push CS ========è 將此處的代碼段的段地址壓入棧中
(5)push IP ========è 將此處的代碼段的偏移地址壓入棧中
(6)(IP)= (N * 4) , (CS) = (N * 4 + 2) è根據中斷類型碼計算中斷處理程序的入口地址
- Iret指令:通常和硬件自動完成的中斷過程配合使用
Ø Iret功能描述(匯編語言描述): pop IP
pop CS
popf
Ø Iret的出棧順序:IP、CS、標誌寄存器
- 匯編編譯器是識別“+”、“-”、“*”、“/”的。
Ø Mov ax, (5 + 3) * 5 / 10就等效於mov ax, 4
- 中斷向量表:
Ø 中斷向量表存儲在內存中的0 ~3FFh(即0 ~ 1023,這1024個字節空間中)的內存中
Ø 在中斷向量表中,每4個字節確定一個中斷類型
Ø 每個中斷類型都有一個中斷類型碼,用來唯一標示該中斷類型
Ø 每個中斷類型的4個字節指向中斷處理程序的入口地址,其中前2個字節用來存儲中斷處理程序的偏移地址(即IP),後2個字節用來存儲中斷處理程序的段地址(即CS)
Ø 每個中斷類型的4個字節的存儲工作都是程序員通過代碼來實現
- 單步中斷(中斷類型碼為1)
Ø CPU在執行完一條指令之後,如果檢測到標誌寄存器的TF位為1,則產生單步中斷,引發中斷過程。
Ø 單步中斷的中斷類型碼為1,他所引發的中斷過程如下:
² (1)取得中斷類型碼1
(2)標誌寄存器入棧,TF、IF設置為0
(3)CS、IP入棧
(4)(IP) = (1 * 4), (CS) = (1 * 4 + 2)
- Int指令
Ø 格式:int n ====èn為中斷類型碼。它的功能是引發中斷過程
Ø CPU執行int n指令,相當於引發一個n號中斷的中斷過程,執行如下:
² (1)取中斷類型碼n ;
(2)標誌寄存器入棧,IF = 0,TF = 0 ;
(3)CS、IP入棧;
(4)(IP) = (n * 4), (CS) = (n * 4 + 2)
最後更新:2017-04-03 05:39:37