王爽《彙編語言》 複習資料

X86彙編語言總結

轉載自http://blog.csdn.net/cto_51/article/details/8827862

  • 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

Jne

不等於則轉移

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 movsbrepmovsw

²  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)

 

 

16位彙編語言複習

轉載自:http://blog.csdn.net/leocfyb/article/details/8565066

寄存器

reg寄存器

AH&AL=AX(accumulator):累加寄存器 

BH&BL=BX(base):基址寄存器 

CH&CL=CX(count):計數寄存器 

DH&DL=DX(data):數據寄存器 

SP(Stack Pointer):堆棧指針寄存器 

BP(Base Pointer):基址指針寄存器 

SI(Source Index):源變址寄存器 

DI(Destination Index):目的變址寄存器 

IP(Instruction Pointer):指令指針寄存器

sreg段寄存器

CS(Code Segment)代碼段寄存器 

DS(Data Segment):數據段寄存器 

SS(Stack Segment):堆棧段寄存器 

ES(Extra Segment):附加段寄存


邏輯運算指令:

AND   與運算.
OR      或運算.
XOR   異或運算.
NOT   取反.
TEST  測試.(兩操作數作與運算,僅修改標誌位,不回送結果).
SHL    邏輯左移.
SAL    算術左移.(=SHL)
SHR    邏輯右移.
SAR    算術右移.(=SHR)
ROL    循環左移.
ROR    循環右移.
RCL    通過進位的循環左移.
RCR    通過進位的循環右移.

XOR指令對兩個操作數執行。按位的邏輯異或運算:即相“異或”的兩位不相同時,結果就是1;否則,“異或”的結果爲0。XOR指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義。XOR可用於求反某些位,而不影響其他位。要求求反的位同“1”異或,維持不變的位同“0”異或。XOR指令經常給寄存器清0,同時使CF也清0。

OR指令對兩個操作數執行按位的邏輯或運算:即只要相“或”的兩位有一位是1,結果就是1;否則,“或”的結果爲0。OR指令可用於置位某些位,而不影響其他位。這時只需將要置1的位同“1”或,維持不變的位同“0”或即可。OR指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義。

AND指令對兩個操作數執行按位的邏輯與運算:即只有相“與”的兩位都是1,結果纔是1;否則,“與”的結果爲0。AND指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義。AND指令可用於復位某些位,但不影響其他位。這時只需將要置0的位同“0”與,而維持不變的位同“1”與就可以了。

NOT指令對操作數按位取反:即原來爲0的位變成1,原來爲1的位變成0。注意,NOT 指令不影響標誌位。

TEST指令對兩個操作數執行按位的邏輯與運算,但結果不回到目的操作數。TEST指令執行的操作與AND指令相同,但不保存執行結果,只根據結果來設置狀態標誌。TEST指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義。TEST指令通常用於檢測一些條件是否滿足,但又不希望改變原操作數的情況。這條指令之後,一般都是條件轉移指令,目的是利用測試條件轉向不同的程序段。TEST指令用於測試某一(幾)位是否(同時)爲0或爲1。


第一章 基礎知識

1、彙編語言由3類指令組成 

    彙編指令:機器碼的助記符,有對應機器碼。 

    僞指令:沒有對應機器碼,由編譯器執行,計算機並不執行 

    其他符號:如+-*/,由編譯器識別,沒有對應機器碼 

2、一個CPU有n根地址線,則可以所這個CPU的地址線寬度爲n,這樣的CPU最多可以尋找2的n次方個內存單元。

3、1K=2^10B 1M=2^20B 1G=2^30B 

4、8086 CPU地址總線寬度爲20,尋址範圍爲00000~FFFFF 

    00000~9FFFF 主存儲器地址空間(RAM) 

    A0000~BFFFF 顯存地址空間 

    C0000~FFFFF 各類ROM地址空間   


第二章 寄存器(CPU工作原理) 

1、16位結構描述了一個CPU具有下面幾個方面的結構特性 運算器一次最多可以處理16位的數據 寄存器的最大寬度爲16位 寄存器和運算器之間的通路爲16位 

2、8086有20位地址總線,可以傳送20位地址,達到1M的尋址能力。採用在內部用兩個16位地址合成的方法來形成一個20位的物理地址 

3、物理地址 = 段地址 × 16 + 偏移地址 

4、在編程是可以根據需要,將若干地址連續的內存單元看作一個段,用段地址×16定位段的起始地址(基礎地址),用偏移地址定位段中的內存單元。段地址×16必然是16的倍數,所以一個段的起始地址也一定是16的倍數;偏移地址位16位,16位地址的尋址能力爲64KB,所以一個段的長度最大爲64KB 

5、8086有四個段寄存器 CS、DS、SS、ES 

6、CS爲代碼段寄存器,IP爲指令指針寄存器。任意時刻,設CS中內容爲M、IP中內容爲N,8086CPU從內存M×16+N讀取一條指令執行 

7、不能用mov修改CS、IP,因爲8086CPU沒有提供這樣功能,可用指令JMP 段地址:偏移地址。JMP 2AE3:3 JMP AX 修改IP   


第三章 寄存器(內存訪問)

1、DS數據段寄存器。不能將數據直接送入段寄存器,所以『MOV DS, 1』不正確 

2、字在存儲時要兩個連續的內存單元,低位在低地址,高位在高地址 

3、[address]表示一個偏移地址爲address的內存單元 

4、SS:SP指向棧頂元素 

5、PUSH AX:(1)SP = SP - 2;(2)AX送入SS:SP 

6、POP AX:(1)SS:SP送入AX;(2)SP = SP + 2 

7、PUSH/POP 寄存器 PUSH/POP 段寄存器 PUSH/POP 內存單元   


第四章 第1個程序 

1、可執行文件包含兩部分:程序和數據,相關的描述信息 

2、程序加載後, ds中存放這程序所在內存區的段地址,這個內存區的偏移地址爲0,策程序所在的內存區的地址爲ds:0;這個內存區的前256個字節中存放的是PSP,dos用來和程序進行通信。從256字節處向後的空間存放的是程序


第五章 [BX]和loop指令 

1、[BX]表示一個內存單元,它的段地址在ds中,偏移地址在bx中。MOV AX,[BX] MOV AL,[BX] MOV [BX],AX ◎loop要進行兩步操作,CX=CX-1;判斷cx中值,不爲零則轉至標號處執行程序,爲零則向下執行。 

2、masm將指令 mov ax,[0] 當作 mov ax,0 處理 解決方法可以爲 mov bx,0 使用寄存器 mov ax,[bx] 或 mov ax,ds:[0] 直接給出段地址所在的段寄存器 

3、loop中不可使用 mov [cx],cx   


第六章 包含多個段的程序 

1、dw 定義字型數據 

2、end 標號 定義程序入口點 

3、定義多個段,同定義代碼段相同。定義僅僅是爲了程序閱讀方便 

4、assume cs:code,ds:data,ss:stack是僞指令,將定義的具有一定用途的段和相關的寄存器聯繫起來 

5、對於段,如果數據佔N個字節,則程序加載後實際佔有空間爲:(N/16+1)*16,N的16整數   


第七章 更靈活的定位內存地址的方法 

1、and 按位與 and al, 0EFh 

2、or 按位或 or al, 20h 

3、字母大小寫轉換: 

    大寫(xx0x xxxx) and al, 0EFh 

    小寫(xx1x xxxx) or al, 20h

4、mov ax,[200+bx] == mov ax,[bx+200] == mov ax,200[bx] == mov ax,[bx].200 段地址爲ds,偏移地址爲bx+200 

5、si和di示8086CPU中和bx功能相近的寄存器,si和di不能分成兩個8位寄存器來使用 

6、一般來說,在需要暫存數據的時候,都應該使用棧   


第八章 數據處理的兩個基本問題 

1、bx,si,di,bp 

      (1)在8086CPU中,只有這4個寄存器可以用在[...]中來進行內存單元的尋址 正確:mov ax,[bx]  mov ax,[bp] 錯誤:mov ax,[cx]    mov ax,[dx]    mov ax,[ax]   mov ax,[ds] 

      (2)在[...]中,這4個寄存器可以單個出現,或只能以四種組合出現:bx和si、bx和di、bp和si、bp和di 錯誤:mov ax,[bx+bp]     mov ax,[si+di] 

      (3)只要在[...]中使用寄存器bp,而指令中沒有顯性地給出段地址,段地址就默認在ss中 mov ax,[bp] ax=ss*16+bp(取地址值) 

2、在沒有寄存器名存在的情況下,用操作符 X ptr 指明內存單元的長度,X在彙編指令中可以位word或byte:

    mov word ptr ds:[0],1

    add word ptr [bx]

    inc byte ptr ds:[2]

3、div,除法指令

      (1)除數8位     被除數16位   AX                                            商-AL   餘數-AH

      (2)除數16位   被除數32位  DX->高16位   AX->低16位    商-AX  餘數-DX

4、dd 僞指令,定義雙字dword

5、dup 僞指令,用來進行數據的重複 

    db 3 dup (0) == db 0,0,0 

    db 3 dup (0,1,2) == db 0,1,2,0,1,2,0,1,2 

    db 3 dup ('ab','CD') == db 'abCDabCDabCD'  


第九章轉移指令的原理

1、可以修改ip,或同時修改csip的指令統稱爲轉移指令

2、8086CPU的轉移行爲有一下幾類:

      只修改ip時,稱爲段內轉移,如jmp ax

      同時修改csip時,稱爲段間轉移,如jmp es:[dx]

   由於轉移指令對ip的修改範圍不同,段內轉移又分爲:短轉移和近轉移

      短轉移ip的修改範圍爲 -128~127

      近轉移ip的修改範圍爲 -32768~32767

       8086CPU的轉移指令分爲以下幾類:

      無條件轉移指令(如jmp

      條件轉移指令

      循環指令(如loop

      過程

      中斷

3、offset取得標號的偏移地址

4、jmp short標號實現段內短轉移,對ip的修改範圍爲 -128~127對應機器碼中包含轉移的位移 EB地址

5、jmp near ptr標號實現段內近轉移,對ip的修改範圍爲 -32768~32767對應機器碼包含轉移的位移

6、jmp far ptr標號實現段間轉移對應機器碼中高地址爲段地址,低地址爲偏移地址 EA偏移地址段地址

7、jmp word ptr內存單元地址(段內轉移)

8、jmp dword ptr內存單元地址(段間轉移)

     高地址存放目的段地址,低地址存放目的偏移地址

9、jcxz標號 cx0時跳轉

     所有有條件跳轉指令都是短轉移,對ip的修改範圍都爲 -128~127

10、loop標號

     所有循環指令都是短轉移,對ip修改範圍都爲 -128~127


80×25彩色字符顯示模式顯示緩衝區結構:

內存地址空間中,B8000h~BFFFFFh32KB的空間,爲80×25彩色顯示緩衝區。向這個地址寫入數據,寫入的內容將立即出現在顯示器上。

80×25彩色字符模式下,顯示器可以顯示25行,每行80個字符,每個字符可以有256種屬性。一個字符在緩衝區佔兩個字節,一屏內容共佔4000個字節。顯示緩衝區分8頁,每頁4KB,顯示器可以顯示任意一頁的內容,一般顯示第0頁,即B8000h~B8F9Fh

在一行中,一個字符佔兩個字節的存儲空間,低位字節存儲字符的ASCII碼,高位字節存儲字符的屬性,一行80字符,佔160字節

屬性字節的格式:

  7                6 5 4               3               2 1 0

BL(閃爍) RGB(背景) I(高亮) RGB(前景)

顯示在 M N列的字符爲 B800:[160*M + 2*N] 



第十章 callret指令

1、ret用棧中數據修改ip,實現近轉移

        (ip) = ((ss) * 16 + (sp))

        (sp) = (sp) + 2

    相當於:

        POP ip

2、retf用棧中數據修改csip,實現遠轉移

    (ip) = ((ss) * 16 + (sp))

        (sp) = (sp) + 2

        (cs) = ((ss) * 16 + (sp))

        (sp) = (sp) + 2

    相當於:

        POP ip

        POP cs

3、call指令,call指令不能實現短轉移,實現轉移的方法和假名牌指令原理相同

    (1call標號,段內轉移

  機器指令中沒有轉移的目的地址,而是相對於當前ip的轉移位移(補碼),相當於 1.push ip 2.jmp near ptr標號

    (2call far ptr 標號,段間轉移

  機器指令中包含轉移目的地址,相當於 1.push cs 2.push ip 3.jmp far ptr標號

    (3call 16位寄存器

  相當於 1.push ip 2.jmp 16位寄存器,機器指令不包含目的地址

  注意:1.push ip ip先變成call後第一個字節的偏移地址,然後入棧

4call word ptr內存地址

  相當於 1.push ip 2.jmp word ptr內存地址

5call dword ptr內存地址

  相當於 1.push cs 2.push ip 3.jmp dword ptr內存地址

  注意:2.push ip ip先變成call後第一個字節的偏移地址,然後入棧

6、mul指令,乘法 a× b

     (1)都是8位  AL

     (2)都是16位  AX

結果 (1)結果放在AX

         (2)結果高位在DX,低位在AX 



第十一章標誌寄存器

1、  11     10     9     8        7     6     4     2       0

        OF    DF    IF   TF     SF   ZF  AF   PF    CF

       溢出 方向 中斷 標誌  符號 零 輔助 奇偶  進位     

2、ZF零標誌位,如果運算結果爲零,則 ZF=1

3、PF奇偶標誌位,相關指令執行後,1的個數爲偶數 PF=1

4、SF符號標誌位,執行後,計算結果爲負 SF=1

5、CF進位標誌位,無符號加減發生最高有效位之外的進、接位時 CF=1

6、OF溢出標誌位,有符號運算髮生溢出時 CF=1

7、adc帶進位加法,adc ax,bx == (ax)=(ax)+(bx)+CF

8、sbb帶借位減法,sbb ax,bx == (ax)=(ax)-(bx)-CF

9、cmp比較指令,相當於減法,但是不保存結果,隻影響標誌寄存器

      cmp ax,bx

   無符號比較時:

      ax==bx     ZF=1

      ax ≠ bx      ZF=0

      ax < bx     CF=1

      ax > bx     CF=0 and ZF=0

      ax <= bx   CF=1 or ZF=1

      ax >= bx   CF=0

   有符號比較時(反向說明)cmp ah,bh

      ah >= bh   SF=0 and OF=0

      ah < bh     SF=0 and OF=1

      ah < bh     SF=1 and OF=0

      ah > bh     SF=1 and OF=1

10、無符號比較跳轉指令

      je        ZF=1

      jne      ZF=0

      jb       CF=1

      jnb     CF=0

      ja       CF=0 and ZF=0

      jna     CF=1 or ZF=1

11、DF方向標誌位,在串處理指令中,控制每次操作後si di的增減,DF=1操作後si di遞減

    使用cld,std設置: cld, DF=0. std, DF=1

12、movsbds:si內存單元字節送入es:di

    相當於:

        mov es:[di], byte ptr ds:[si] ;8086指令

        DF=0: inc si, inc di

        DF=1: dec si, dec di

    類似的還有movsw,傳送一個字

    一般使用格式爲 rep movsb

    相當於 s:movsb, loop s,所以要在之前設置cx

        cld   DF置0

        std   DF置1

13、pushf將標誌寄存器值入棧, popf將標誌寄存器值出棧

14、標誌寄存器在debug中的表示

                       OF    DF    IF    TF    SF     ZF   AF      PF    CF

值爲1的標記    OV   DN                   NG    ZR             PE    CY

值爲0的標記    NV   UP                    PL    NZ             PO   NC


第十二章內中斷

1、中斷類型碼:

   除法錯誤:0

   單步執行:1

      int nn

2、中斷向量表 0000:0000~0000:04001024個單元,N號中斷偏移地址爲4N,段地址爲4N+2,高地址爲段地址,低地址爲偏移地址

3、中斷處理過程:

       1.取得中斷類型碼 N

       2.pushf

       3.TF=0, IF=0

       4.push CS

       5.push IP

       6.IP=4N, CS=4N+2

4、中斷處理程序的編寫和子程序類似,常規步驟爲:

       1.保存用到的寄存器

       2.處理中斷

       3.恢復用到的寄存器

       4.iret返回(iret = pop ip, pop cs, popf 




第十四章端口

1、端口的讀寫只能用in(讀入)和out(寫入)

2、在inout指令中,只能使用axal來存放從端口中讀入的數據或要發送到端口中的數據。訪問8位端口時用al,訪問16位端口時      用dx

      in al, 20h ;20h端口讀入一個字節

      out 20h,al ;20h端口寫入一個字節 


      mov dx, fffh ;端口號送入dx16位)

      in al, dx ;讀入一個字節

      out dx, al ;寫入一個字節 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章