輔助彙編學習記錄(二)之美

2021-09-26 12:08:30 字數 3761 閱讀 7189

通用暫存器

eax,ebx,ecx,edx,esi,edi,esp,ebp, 它 們 的低 16 位就是 8086 的

ax,bx,cx,dx,si,di,sp,bp,它們的含義如下:

eax:累加器

ebx:基址暫存器(base)

ecx:計數器

edx:資料暫存器(data)

ebp:基址指標暫存器(base)

esp:堆疊指標暫存器(stack)

32位系統前面多了『e』,16位系統沒有『e』。

ax的高8位ah,低8位al

dx的高8位dh,低8位dl

2.pushf及popf

pushf壓入標誌暫存器,popf彈出並存入標誌暫存器

pusha及popa

pusha壓入所有一般用途暫存器,popa彈出並存入所有一般用途暫存器

pushad及popad

pushad壓入所有擴充套件暫存器,popad彈出並存入所有擴充套件暫存器

3.mov ax,[1234h]   表示將0x1234位址處的內容存入ax暫存器

mov [1234h],word 2*33   將2*33存入記憶體0x1234位址處

lea  ax, total         將total的偏移位址傳送到ax

4.push  ax          壓入16位的暫存器ax

push  eax           壓入32位的暫存器eax        

push  word [total]    壓入16位的記憶體total內容

push  dword [total]   壓入32位的記憶體total內容

push  byte  12       壓入8位的立即數12

push  word 1234h    壓入16位的立即數1234h

push  dword  12345678h   壓入32位的立即數12345678h

5.int  8位立即數    int指令執行軟體中斷

依標誌及cx的條件轉移指令表:

jz     當zf=1時轉移

jnz    當zf=0時轉移

js     當sf=1時轉移

jns    當sf=0時轉移

jo     當of=1時轉移

jno    當of=0時轉移

jc     當cf=1時轉移

jnc     當cf=0時轉移

jp(jpe)      當pf=1時轉移

jnp(jpo)    當pf=0時轉移

jcxz       當cx=0時轉移

6.cmp命令:

cmp  ax, bx      暫存器ax與暫存器bx比較

cmp  ax, [total]    暫存器ax與變數total比較

cmp  ax, 0         暫存器ax與立即數0比較

cmp  [total], dx     變數total與暫存器dx比較

cmp  [total], 0       變數total與立即數0比較

有符號整數比較的條件轉移指令表:

jl(jnge)            小於時轉移

jg(jnle)            大於時轉移

jle(jng)            小於或等於時轉移

jge(jnl)            大於或等於時轉移

je                  等於時轉移

jne                不等於時轉移

無符號整數比較的條件轉移指令表:

jb(jnae)            低於時轉移

ja(jnbe)                   高於時轉移

jbe(jna)                    低於或等於時轉移

jae(jnb)                    高於或等於時轉移

je                               等於時轉移

jne                             不等於時轉移

7.無條件轉移指令jmp

jmp  label

jmp  short label

跳至指定位址開始執行程式

迴圈指令loop:

label:

;需要迴圈執行的指令

loop label

8.label:

dec  cx

jg  label

將cx的值減去1,如果cx的值大於0,則跳轉到label執行

9.加減法:

add 第一運算元,第二運算元      加法

sub  第一運算元, 第二運算元      減法

add al, byte[b]    將變數b的內容加入暫存器al

sub  al, byte[b]   將暫存器al減去變數b的值

dec 運算元         對運算元減一

inc  運算元         對運算元加一

乘法:mul 運算元    mul針對無符號整數的相乘

imul運算元    imul針對帶符號整數的相乘

8位運算元的值與al相乘後其乘積存入ax中。

16位運算元的值與ax相乘後其乘積存入dx:ax中。

32位運算元的值與eax相乘後其乘積存入edx:eax中。

除法:div 運算元

idiv運算元

ax的值除以8位運算元的值,其商存在al上,其餘數存於ah中。

dx:ax的值除以16位運算元的值,其商存於ax中,其餘數存於dx中。

edx:eax的值除以32位運算元的值,其商存於eax,其餘數存於edx中。

10. 每次cpu執行都要先讀取eip暫存器的值,然後定位eip指向的記憶體位址,並且讀取彙編指令,最後執行。執行後 eip的值=後面要跳轉的位址。

11. 彙編過程引數傳遞的方式:暫存器,變數,堆疊,利用call後續區四種方式傳參。

test   eax,   eax

je   00401083  

test指令操作是目的運算元和源運算元按位邏輯「與「

運算結果不送回目的運算元

然後根據結果設定sf、zf、和pf標誌位,並將cf和of

標誌位清零。

而je是當zf=1時跳轉。

即,當eax的值等於0時跳轉。

因此說,這裡的test就是檢測eax的值是不是0

12. xor eax,eax和mov eax,0兩者的作用沒有區別,都是讓eax的值為0,但是xor eax,eax 指令為2位元組,mov eax,0 指令為5個位元組。相比而言,前面指令更能節省空間。

xor eax,eax是讓eax與eax進行異或操作。

13.彙編過程末尾ret 4*n的含義:先執行ret,將堆疊頂函式返回位址取出存入eip,執行函式返回操作,然後將過程的n個引數彈出堆疊,esp=esp+4*n,堆疊指標恢復到呼叫call之前的狀態。

14.位運算:

and 第一運算元,第二運算元

or  第一運算元,第二運算元

xor 第一運算元,第二運算元

not 運算元

test第一運算元,第二運算元

test指令檢查第一運算元,看看某個指定的位是否被開啟。test的結果不會改變任何運算元的值,與and的操作結果相同,只是沒有將結果存回第一運算元而已。

15.改變位位置:

shl  左移

shr  右移

sal  算術左移

sar  算術右移

rol  迴圈左移

ror  迴圈右移

rcl  帶進製迴圈左移

rcr  帶進製迴圈右移

彙編學習記錄之六

1.源程式例子 assume cs codesg codesg segment start mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end start在組合語言源程式中,包含兩種指令...

彙編學習記錄之八

1.機器指令處理的資料所在位置 絕大部分機器指令都是進行資料處理的指令,處理大致可以分為三類 讀取 寫入 運算。在機器指令這一層來講,並不關心資料的值是多少,而關心指令執行前一刻,它將要處理的資料的所在位置。指令執行前,所要處理的資料可以在三個地方 cpu內部 記憶體 埠。2.組合語言中資料位置的表...

彙編學習記錄之十

1.轉移指令的原理 可以修改ip,或者同時修改cs和ip的指令統稱為轉移指令。概括地講,轉移指令就是可以控制cpu執行記憶體中某處的 的指令。8086cpu的轉移行為有以下幾類 1.1 只修改ip時,稱為段內轉移,比如 jmp ax 1.2 同時修改cs和ip時,稱為段間轉移,比如 jmp 1000...