X86彙編指令

來源:互聯網
上載者:User

標籤:style   ar   使用   sp   on   資料   div   art   問題   

8086CPU地址匯流排寬度為20, 也就是說一個記憶體物理地址是5位,記憶體位址空間為1Mb;資料匯流排為16位;寄存器為16位。

 

16位結構的CPU包括以下特性:

1,運算子最多處理16位元據。

2,寄存器最大寬度為16位。

3,寄存器與運算器之間的通路是16位。

 

這裡就出現了一個問題,如果由16位推出20位的物理地址呢?

所以就出現了段的概念:

一個物理地址由段地址和位移地址構成,即物理地址=段地址*16 + 位移地址

也可以說段地址左移4位,然後我們可以推出位移地址最大為2的16次方,即16Kb.

這裡我們要強調一個概念:

CPU是死的,一點都不智能,對於它本身而言,並不知道什麼段的概念,段只是用來讓我們編程者使用的,我們可以自己定義一個段的開始(定義CS或者DS),然後利用位移地址靈活執行我們寫的指令,這樣我們就可以避免指令在記憶體空間的互相掩蓋。

 

8086CPU不支援將一個資料直接寫到段寄存器中去。

 

8086的棧操作是以字為單位的,這裡我們還是要強調一個概念:

CPU是死的,它才不知道棧的概念呢,棧是我們編程者自己在資料區段裡開闢,然後我們用pop,push彙編指令操作,一切都是我們編程者操作出來的。

CPU是如何知道棧的地址呢?:

CPU才不會知道呢,是我們編程者自己首先定義好了一個棧段,然後我們將這個棧段地址賦值到SS棧段寄存器中去,同時初始化SP寄存器。這樣以後我們pop或者push一個字時,sp加2或者減2。還是那句話,都是我們編程者實現棧的功能,讓SS和SP永遠指向棧頂。

 

只有bx,si,di,bp這四個寄存器可以進行記憶體單元定址的,即[bx]這樣文法操作的,其中bx,bp這兩個寄存器不能同時出現,如[bx,bi],還有si,di這兩個寄存器也是不能同時出現的。

bp寄存器隱形的段地址是ss。如我們這樣操作[ba],那麼是通過SS段地址定址記憶體單元的。

 

寄存器定址幾種方式:

1,直接定址:[idata]    idata 為立即數

2,寄存器間接定址: [bx] , 預設段地址是DS

3,寄存器相對定址:[bx+idata] ,預設段地址是DS

4,基址變址定址:[bx+si], 預設段地址DS

5,相對基址變址定址:[bx+si+idata], SA是DS

 

指令要處理的資料長度問題:

對於這個問題,我們要根據編程者自己的選擇的編譯器而定,像我們在windows下用的都是Masm風格的彙編編程,在linux上則是使用AT&T風格的。

這裡是就masm風格而言,當我們操作一個寄存器時,我們根據寄存器的長度來確定資料的長度,比如:

mov ax, [0]; 這裡我們就是要操作的資料長度是16位的。

但是當沒有寄存器的時候,我們就要通過標記符來確定了。格式如下:

操作符 X ptr data, data; 這裡X ptr依據(X可以使word或者byte)來指定操作資料長度。

像push和pop就不需要指定了,他們兩預設的是一個字。

 

div除法指令:被除數一般預設在AX或者BX中,或者就是32位的儲存在AX,BX中,然後除完之後,餘數在DX中,商在AX中

 

偽指令:

db:定義一個位元組

dw:定義一個字

dd:double defined word 定義兩個位元組

dup:與db,dw,dd配合使用,表示複製的意思,比如: db 3 dup(0);

 

轉移指令:

修改CS,IP或者僅僅修改IP的指令統稱為轉移指令,比如:

jmp data,只修改ip

jmp SA:EA 修改cs和IP

 

offset操作符:

擷取一個標號的位移地址,比如:

start:

    mov ....

s:

    mov ax, offset s;   此時相當於(mov ax, 1)

 

jmp指令:

jmp idata; jmp sa:ea; jmp short 標號(在段內短跳轉);jmp far ptr 標號(段間跳轉);jmp reg; jmp word ptr 記憶體單元地址(這裡是將那個記憶體單元裡的值給IP,段內轉移); jmp dword ptr 記憶體單元地址(段間跳轉,以記憶體單元地址所存的兩個字的高地址為段地址,低地址為位移地址);

jcxz指令:

當cx=0 跳轉

 

loop指令:

相當於執行cx自減一,並前cx不等於0就跳轉,跳轉位移是8位,也就是說位移地址在-128~127之間。

 

ret 指令:

有兩條指令:ret,retf指令

ret指令相當於pop IP

retf    相當於連續執行    pop IP; pop CS 兩條指令

 

call指令:

格式如下:

call 標號;    將當前IP壓棧,然後跳到標號處執行(改變IP值)

call far ptr 標號;    段間轉移

call reg(16位);    跳到IP=寄存器中的內容

call word ptr 記憶體單元地址;    跳到記憶體單元給定的值

call dword ptr 記憶體單元地址;  相當於執行:push CS; push IP; jmp dword ptr 記憶體單元地址;

 

call 和 ret一般配合使用,相當於調用了一個子函數。

 

mul乘法指令:

和div一樣,用到AX,DX寄存器

 

標誌寄存器:

裡面儲存的資訊可以稱為PSW(程式狀態字),包括這些狀態:

第六位,ZF:標明執行結果是否為0;

第二位, PF:奇偶標誌位:執行結果中如果1的個數為偶數的話,則置1

第七位,SF:符號標誌位:結果為負數則為1

第零位,CF:進位借位標誌符:當最高有效位需要像更高位進位或者借位則置1(對於無符號位元)

第十一位,OF:溢出標誌位(對於有符號位元)

第十位:DF:方向標誌位:在串處理中,控制每次si,di的增減。DF為0,則每次si,di遞減

 

 

串傳送指令:

movsb;

相當於執行如下指令:mov es:[di], byte ptr ds:[si]; 如果DF=0 ,則後續為:inc si; inc di; 

如果DF=1,則後續為: dec si; dec di;

movsw;

每次傳送的是一個字

 

一般我們傳送一個串的話選擇這樣的命令:

rep movsb; 

相當於:

s: movsb;

loop s;  依據CX來判斷

 

 

pushf; popf;  將標誌寄存器壓棧或者彈出

 

 

 

 

 

 

 

條件轉移指令:

je: equal,如果等於了,則ZF=0,依ZF作為判斷                     jne:   no equal

jb: below,如果第一個數小於第二個數,則CF=1                     jnb; no below

ja: above                                                                              jna:

 

X86彙編指令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.