閱讀878 返回首頁    go 阿裏雲 go 技術社區[雲棲]


X86匯編語言總結

下載地址:點擊打開下載鏈接

  • AX、BXCXDX一般用來存放數據

  • [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

Ø  Movsbmovsw一般都是和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的出棧順序:IPCS、標誌寄存器

  • 匯編編譯器是識別“+”、“-”、“*”、“/”的。

Ø  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

  上一篇:go Atom介紹和安裝步驟
  下一篇:go 【算法小總結】拓撲排序+例題解析