汇编基础(三)
標志寄存器
指令的操作對象除了數據外還包括狀態。在大多數情況下,使用標志寄存器中的標志來存儲狀態。
80*86的標志寄存器(EFLAGS)是一個32位的寄存器,實際只使用到15個二進制,一共14個標志。在此只說6個標志。
如下所示是80*86的標志寄存器的EFLAGS
?
1.C標志(進位/借位標志):加法/減法指令執行完后,最高位產生進位/借位,則C=1,否則C=0。
2.A標志(輔助進位/借位標志):加法/減法時,D3向D4位有進位/借位,則A=1,否則A=0。(當加法/減法為字或者雙字時A標志的設置僅與最低一個字節中的D3位向D4位的進位/借位有關)
3.S標志(符號標志):S的標志記錄運算結果的最高位的位值。如字運算后D15位為1,則S=1,否則S=0。有符號運算時,S標志是運算結果的符號位。
4.Z標志(全零標志):運算結果為全0時Z=1,否則Z=0。
5.P標志(奇偶標志):最低一個字節中1的個數,當1的個數為偶數時,P標志被設置為1,否則為0。當運算結果是字或雙字時,P總與最后一個字節有關。
6.O標志(溢出標志):CPU根據判溢出電路對O標志進行設置,O=1時表示異常,O=0時表示無溢出。其邏輯表達式為:O=Xn-1*Yn-1*Zn-1的非+Xn-1的非*Yn-1的非*Zn-1(n為位數)
?
下面講解下目標操作數的尋址方式源操作數的尋址方式和CPU所尋址的邏輯段
1.立即尋址:操作數是一個立即數(就是常數)?
例如:MOV?AX,3100H?中的3100H
2.直接尋址:指令中給出的不是數值,而是操作數存放的物理地址(偏移地址)
例如:MOV?AX,[5400H]?中的[5400H]
3.寄存器尋址:指令的操作數是CPU的內部寄存器
例如:MOV?SI,AX?中的AX
4.寄存器間接尋址:用寄存器的內容表示操作數的偏移地址,同樣,寄存器不再表示數值本身,而是操作數存放的物理地址(偏移地址),此方式只允許使用SI、DI、BX、BP
例如:MOV?AX,[SI]?中的?[SI]
5.寄存器相對尋址(帶位移的基址/變址尋址):與寄存器間接尋址相類似,只是偏移地址中多了一個給定的8位或16位位移量
例如:MOV?AX,[BX+5]?中的[BX+5]
6.基址-變址尋址:由基址寄存器BX和BP中的任意一個和變址寄存器SI和DI中的任意一個相加而形成操作數的偏移地址
例如:MOV?AX,[BX][DI]?中的[BX][DI]
7.基址-變址相對尋址(帶位移的基址-變址尋址):與基址-變址尋址相類似,只是偏移地址中多了一個給定的8位或16位位移量
例如:MOV?AX,[BX+DI+8]?中的[BX+DI+8]
記住一點,帶有“[?]”的,都是代表地址,而并非真正的數值.
至于邏輯段,主要針對的是源操作數的尋址.默認情況下,指令中只要沒有出現BP,邏輯段是DS;出現了BP,邏輯段為SS
另外:
SP:基址寄存器(stack?pointer),一般在函數中用來保存進入函數時的sp的棧頂基址
BP:??基數指針寄存器BP(base?pointer)是一個寄存器,它的用途有點特殊,是和堆棧指針SP聯合使用的,作為SP校準使用的,只有在尋找堆棧里的數據和使用個別的尋址方式時候才能用到
總結
- 上一篇: WEB安全基础-SQL注入基础
- 下一篇: oracle ash介绍,Oracle