《IBM-PC彙編語言程序設計》(清華大學出版社)筆記(四)

2.2.1.7 邏輯指令

1)      邏輯運算

a)      AND

b)      OR

c)       NOT

a)      不允許使用立即數

d)      XOR              異或

e)      TEST             做與運算,但是不保存結果,只根據結果設置條件碼

f)        除了NOT不允許使用立即數,其他的四種,只有源操作數可以是立即數,至少有一個操作數必須在寄存器中,另一個操作數可以使用任意尋址方式

2.2.1.8

2)      位測試並修改指令

a)      BT                 位測試

                    i.           BT DST, SRC         將目的操作數中,由源操作數指定位的值,送CF

b)      BTS               位測試並置1

                    i.           將目的操作數中,由源操作數指定位的值,送CF,並且將目的操作數該位置的值+1

c)       BTR               位測試並置0

                    i.           將目的操作數中,由源操作數指定位的值,送CF,並且將目的操作數該位置的值置爲0

d)      BTC               位測試並變反

                    i.           將目的操作數中,由源操作數指定位的值,送CF,並且將目的操作數該位置的值變反

e)      SRC,可以使用,立即數或者寄存器方式,直接指明是第幾位,也可以用任意一字寄存器或雙字寄存器的內容給出同一個值

f)        目的操作數可以是用除了立即數之外的任意一種尋址方式

g)      因爲目的操作數的字長最大爲32位,所以位位置的範圍是0~31

3)      位掃描指令

a)      BSF               正向位掃描

                    i.           從0位置開始,左←右

                   ii.           目的是檢索第一個爲1 的位置,並且記錄,如果遇到第一個爲1 的位,則將ZF置0,並把位置裝入目的存儲器中;如果源操作數爲0àZF= 1,此時目的存儲器無定義

                 iii.           源操作數可以使用除立即數意外的任意一種尋址方式,目的操作數必須用字或雙字寄存器

b)      BSR               反向位掃描

                    i.           自左à右掃描

                   ii.           其他與BSF一致

4)      移位指令

a)      SHL               邏輯左移

                    i.           SHL OPR,CNT

                   ii.           CNT大於1時,移位次數存放在CL中,直接用CL代替CNT,當=1 時,直接寫1

b)      SHR

c)       SAL               算術左移

                    i.           與SHL一致

d)      SAR

                    i.           SAR  OPR,CNT

                   ii.           CNT大於1時,移位次數存放在CL中,直接用CL代替CNT,當=1 時,直接寫1

                 iii.           最高位右移,補其本身,本身是0,補0,是1,補1

e)      ROL               循環左移

f)        ROR

g)      RCL               帶進位左移

h)      RCR

i)        SHLD             雙精度左移

j)        SHRD


2.2.1.8 串處理指令

1)      MOVS

2)      CMPS

3)      SCAS             串掃描

4)      LODS            從串取

5)      STOS             存入串

6)      INS                串輸入

7)      OUTS            串輸出

8)      串處理的指令處理存放在存儲器中的數據串

9)      配合以上指令使用的前綴有:

a)      REP

b)      REPE/REPN

c)       REPNE/REPXZ

10)   與REP相配合工作的MOVS,STOS,LODS,INS,OUTS

a)      REP  str

                    i.           重複str操作,知道CX計數器中的值爲0

b)      MOVS   

                    i.           MOVSB

                   ii.           MOVSW

                 iii.           MOVSD

                 iv.           目的操作數必須存儲在ES源操作數必須存儲在DS,源串允許使用段超越前綴

                   v.           源串首地址存放在SI,目的串首地址存放在DI,串長度存放在CX計數器中

                 vi.           CLDàDF=0,地址自動增量;STDàDF=1,地址自動減量

                vii.           執行MOVS的準備工作             P77

1.      源串首地址存放在SI,目的串首地址存放在DI

2.      串長度存放在CX計數器中

3.      建立方向標誌

c)       STOS      存入串指令

                    i.           STOS

                   ii.           STOSB

                 iii.           STOSW

                 iv.           STOSD

                   v.           將存放在AL\AX\EAX的內容存入由目的寄存器(DI)指向的附加段的某個單元

                 vi.           根據DF的值以及數據類型,修改目的寄存器的內容(存儲的是地址)

                vii.           與REP聯用時,將內容的長度存放在計數器中

               viii.           初始化某一緩衝區時很有作用

                  ix.           其他的特點和MOVS一致

d)      LODS     從串取指令

                    i.           從源變址寄存器(SI)所指向的數據段某單元取出內容,存放在AX\AL\EAX中

                   ii.           根據DF的值以及數據類型,修改目的寄存器的內容(存儲的是地址)

                 iii.           其他特點和STOS一致

e)      INS         串輸入指令

                    i.           INS

                   ii.           INSB

                 iii.           INSW

                 iv.           INSD

                   v.           將端口號在DX中的I/O空間的內容傳送到附加段中的目的變址寄存器(DI)所指向的存儲單元中

                 vi.           根據DF的值以及數據類型,修改目的寄存器的內容(存儲的是地址)

                vii.           其他特點和STOS一致

               viii.           I/O端口處理的速度必須與REP INS一致

f)        OUTS     串輸出指令

                    i.           OUTS

                   ii.           OUTSB

                 iii.           OUTSW

                 iv.           OUTSD

                   v.           把由源變址寄存器(SI)所指向的存儲器中的內容傳送到端口號在DX中的I/O端口中去

                 vi.           根據DF的值以及數據類型,修改目的寄存器的內容(存儲的是地址)

                vii.           其他特點和STOS一致

               viii.           I/O端口處理的速度必須與REP OUTS一致

11)   與REPE/REPZ和REPNE/REPNZ聯合工作的CMPS和SCAS

a)      CMPS    

                    i.           SI所指向的數據段(DS)中的內容與DI所指向的附加段(ES)中的一個字節、字或者雙字相減,不保存結果,根據結果設置條件碼

                   ii.           其他的特性與MOVS一致

b)      SCAS

                    i.           SACS

                   ii.           SACSB

                 iii.           SACSW

                 iv.           SACSD

                   v.           將AX\AL\EAX中的內容與DI所指向的附加段中的一個字節、字或者雙字比較,不保存結果,根據結果設置條件碼

                 vi.           其他的特性與MOVS一致

 

不允許使用“立即數尋址”的有:

1)      段內間接尋址

2)      段間間接尋址

3)      PUSH,POP操作

4)      XCHG

5)      LEA

6)      乘法運算,源操作數的尋址

7)      除法運算,源操作數的尋址

8)      位測試並修改指令

9)      NOT不允許使用立即數

10)   BSF/BSR

11)   SHL/SHR


條件標誌位

1)      最主要的是CF,ZF,SF,OF四位

2)      CF,是根據最高有效位是否有向高位的進位設置的,有進位CF=1,否則CF=0

a)      可以用來表示無符號數的溢出,CF = 1 ,溢出,否則不溢出

3)      OF,根據操作書的符號以及其變化情況來設置。

a)      加法,當兩個符號相同相加時,< 0 則溢出,符號不同相加,不會出現溢出

b)      減法,當兩個符號不相同相減時,> 0 則溢出,符號相同相減,不會溢出


       各個指令對標誌位的影響

指令集

指令名

CF

ZF

AF

OF

SF

PF

備註

 

 

通用數據傳送指令

MOV

-

-

-

-

-

-

無影響

MOVSX

-

-

-

-

-

-

無影響

MOVZX

-

-

-

-

-

-

無影響

PUSH/POP

-

-

-

-

-

-

無影響

PUSHA/POPA

-

-

-

-

-

-

無影響

累加器專用傳送指令

IN/OUT

-

-

-

-

-

-

無影響

XLAT

-

-

-

-

-

-

無影響

地址傳送指令

LEA等

-

-

-

-

-

-

無影響

標誌寄存器指令

LAHF/PUSHF/PUSHFD

-

-

-

-

-

-

無影響

SAHF/POPF/POPFD

由裝入的值確定標誌位的值

影響

類型轉換指令

CBD/CWD/CDQ/BSW

-

-

-

-

-

-

無影響

加法指令

ADD/ADC/XADD

1

1

-

1

1

-

影響

INC

-

 

 

 

 

 

 

 

減法指令

SUB/SBB/NEG/CMP

CMPXCHG/CMPXHCG8B

1

1

-

1

1

-

影響

DEC

-

 

 

 

 

 

 

 

邏輯運算指令

NOT

-

-

-

-

-

-

無影響

AND/OR/XOR/TEST

1

根據結果

-

根據結果

 

位測試指令

BT/BTS/BTR/BTC

1

-

-

-

-

-

影響

位掃描指令

BSF/BSR

-

1

-

-

-

-

影響

 

 

 

移位指令

SHL/SHR/SAL/SAR

 

根據各指令規定設置

根據移位後的結果設置

 

最高位移位後有變化,OF=1

根據移位後的結果設置

根據移位後的結果設置

 

ROL/ROR/RCL/RCR/SHLD/

SHRD

1

-

-

1

-

-

影響

串處理指令

MOVS/STOS/LODS/INS/OUTS/

SCAS

-

-

-

-

-

-

無影響

 

 

 

 

 

 

 

 

 

      

 

 

 

注意點:

1)      雙操作數指令不允許兩個操作數都使用存儲器,所以必須有一個操作數是寄存器

2)      不允許用MOV 指令在兩個存儲單元之間直接傳送數據,也不允許兩個段寄存器之間直接傳送信息

3)      幾種傳送信息的方式:

 
  

 

 

 

 

 

 

 

 







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