1. 程式人生 > >16位匯編第六講匯編指令詳解第第三講

16位匯編第六講匯編指令詳解第第三講

不變 無符號 目的 分享 class 邏輯移位 aam 但是 二進制

     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位匯編第六講匯編指令詳解第第三講