16位匯編第六講匯編指令詳解第第三講
16位匯編第六講匯編指令詳解第第三講
1.十進制調整指令
1. 十進制數調整指令對二進制運算的結果進行十進制調整,以得到十進制的運算結果
2.分成壓縮BCD碼和非壓縮BCD碼調整
簡而言之:
以前的時候你有個手表,裏面的數字是九,如果加一個1就是0了,就會產生進位,
不過這個是10進制進位的,所以應該是 a了,但是a的話就出錯了.所以我們就出來了這個調整指令直接變為零,然後進位,也就是16進制碼當做10進制使用
壓縮BCD
壓縮BCD就是4位表示一個數字
非壓縮BCD
非壓縮就是一個字節表示一個數字(高4位通常為零)
例子
真值 8 64
二進制編碼 08H 40H
壓縮BCD碼 08H 64H
非壓縮BCD碼 08H 0604H
可以看出,8如果是個位數,是不變的
如果64那麽壓縮的是4位表示一個數字非壓縮的就是1個字節表示,高位為零.
壓縮BCD嗎的加減調整指令
DAA(加法的調整指令) DAS (減法的調整指令)
DAA 後綴A是Add的意思,後綴s是Sub的意思
例子
mov al,68h ;壓縮的BCD碼是68 mov bl,28h 壓縮的BCD碼28 add al,bl 二進制加法,al+ bl 賦值為al daa (十進制調整) al = 68h + 28h = 90h
但是因為daa了,所以是十進制進位 是96
簡單理解就是,本來16進制 9+1 = A的,但是十進制調整,就不能是A了,需要變為0,結果是10了
DAA的內部原理就是遇到a(….) +6
同理DAS也是-6
只不過是通過標誌位完成的(輔助標誌位)
減法例子:
mov al,68h
mov bl,28h
sub al,bl
das ;十進制調整:al=40h
;實現壓縮BCD碼加法:68-28=40
非壓縮BCD的加,和減法的調整指令
AAA,AAS
例子
mov ax,0109 (其實是想顯示19)
mov al,1
aaa 調整al
減法的例子:
mov ax,0100h sub al,1 aas
非壓縮BCD的乘法,和除法調整指令
AAM,AAD
加法的:
mov ax, 0205h 真值是0205 mov bx, 2 賦值乘數為2 mul bx 相乘 aam 調整
除法的
mov ax, 0102h mov bl, 2 aad div bl
除法的需要先調整,在相
除
二丶位操作類指令
分為三類
1.邏輯運算指令
AND OR XOR NOT TEST
2、移位指令
SHL SHR SAR
3、循環移位指令
ROL ROR RCL RCR
1.邏輯AND
尋址公式,指令
AND reg,imm/reg/mem ;reg←reg∧imm/reg/mem
AND mem,imm/reg ;mem←mem∧imm/reg
作用:
1.對兩個操作數執行邏輯與運算,結果送到目的操作數
2.AND指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義
AND 就是C語言的與運算,1 & 1 = 1 1&0 = 0
2.邏輯指令 OR(或運算)
作用:
1.對兩個操作數執行邏輯或運算,結果送到目的操作數
2.OR指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義
操作指令:
OR reg,imm/reg/mem ;reg←reg∨imm/reg/mem
OR mem,imm/reg ;mem←mem∨imm/reg
C語言中的或運算
置位用的
3.邏輯異或指令XOR
作用:
對兩個操作數執行邏輯異或運算,結果送到目的操作數
XOR指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義
操作指令:
XOR reg,imm/reg/mem ;reg←reg⊕imm/reg/mem
XOR mem,imm/reg ;mem←mem⊕imm/reg
C語言中的疑或指令,相同為假,不同為真.
4.邏輯非指令NOT(C語言中的位取反~)
作用:
對一個操作數執行邏輯非運算
NOT指令是一個單操作數指令
NOT指令不影響標誌位
操作指令:
NOT reg/mem ;reg/mem←~reg/mem
5.測試指令TEST
作用:
1.對兩個操作數執行邏輯與運算,結果不回送到目的操作數
TEST指令和CMP指令類似,CMP指令內部是相減然後設置標誌位
而TEST指令是內部相與,然後設置標誌位
2.AND指令設置CF = OF = 0,根據結果設置SF、ZF和PF狀態,而對AF未定義
指令:
TEST reg,imm/reg/mem ;reg∧imm/reg/mem
TEST mem,imm/reg ;mem∧imm/reg
測試指令,一般用於零判斷
優先使用Test指令,因為TEST指令比CMP指令快一點
6.移位指令(shift)
左移指令:
SHL SAL (邏輯左移,和算術左移)
邏輯左移: 移動的時候,補零
SHL:邏輯左移,最高位進入CF,最低位補0
SAL: 算術左移,最高位進入CF,最低位補0
其中邏輯左移和算術左移是一樣的,一般都會匯編成邏輯左移
算術左移: 移動的時候補符號位(和C語言一樣)
作用:
將操作數移動一位或多位,分成邏輯移位和算術移位,分別具有左移或右移操作
操作指令:
SHL reg/mem,1/CL (其中CL是次數,在8086的中,移動一次可以直接寫,但是移動多次比如放到計數器中)
例如
SHL al,1 (移動一個可以)
SHL al,2 (這樣不可以,必須放到CL中)
改為
mov cl,2
SHL al,2
右移指令:
SHR reg/mem,1/CL
邏輯右移,最低位進入CF,最高位補0
SAR reg/mem,1/CL
算術右移,最低位進入CF,最高位不變
右移的話不會是一樣的,不和左移一樣.他會有符號位的區分的.
應用:
一般來說,邏輯左移,算術左移,邏輯右移,算術右移都有特定的應用
最高位置CF位
邏輯右移SHR 值CF位補零
SAR則補符號位
移位指令對標誌的影響
按照移入的位設置進位標誌CF
根據移位後的結果影響SF、ZF、PF
對AF沒有定義
如果進行一位移動,則按照操作數的最高符號位是否改變,相應設置溢出標誌OF:如果移位前的操作數最高位與移位後操作數的最高位不同(有變化),則OF = 1;否則OF = 0。當移位次數大於1時,OF不確定
移位乘法和除法
邏輯左移一位,相當於無符號的數*2
邏輯右移一位相當於無符號數/2
7.循環移位指令
作用:
將操作數從一端移出的位返回到另一端形成循環,分成不帶進位和帶進位,分別具有左移或右移操作
指令:
ROL reg/mem,1/CL ;不帶進位循環左移
ROR reg/mem,1/CL ;不帶進位循環右移
RCL reg/mem,1/CL ;帶進位循環左移
RCR reg/mem,1/CL ;帶進位循環右移
不帶進位循環左移
可以看出,高位有效位(MSB)的高位,給低位了,(相當於高位和低位互換了)然後高位置CF位
不帶進位循環右移
這個則是相反,低位和高位互換,然後還是高位置CF位
帶進位的左循環移位RCL
這個則是最高位給CF位保存,然後CF位給低位,(相當於中間有一個CF位做中轉)
帶進位的右循環移位RCR
這個則是相反,最低位先給CF位保存,CF位再給最高位
一般循環帶進位的移位指令,適用於32位數的計算(8086下)
循環移位指令對標誌的影響
按照指令功能設置進位標誌CF
不影響SF、ZF、PF、AF
如果進行一位移動,則按照操作數的最高符號位是否改變,相應設置溢出標誌OF:如果移位前的操作數最高位與移位後操作數的最高位不同(有變化),則OF = 1;否則OF = 0。當移位次數大於1時,OF不確定
32位數的計算
首先左移一位,最高位置CF位,然後帶進位左移一位,CF位則給DX位進位,則產生了進位
資料:
鏈接:http://pan.baidu.com/s/1jHWF2fG 密碼:ykum
16位匯編第六講匯編指令詳解第第三講