給出下列各指令執行後al的值以及cf,zf,sf,of和pf的狀態。
mov al,89h ;第1行
add al,al ;第2行
add al,9dh ;第3行
cmp al,0bch ;第4行
sub al,al ;第5行
dec al ;第6行
inc al ;第7行
這類題解題步驟是:
1.先算無符號數
2.再算有符號數(無符號數取反加一或是根據原理)
3.判斷各標誌位
具體步驟如圖:
注:什麼是原理法?
原理法的用途: 多用於判斷有符號數的原碼
先檢視無符號數的運算結果(無符號數運算結果的補碼). 其最高位為0則是正數, 正數的補碼與原碼一樣, 直接得出該正有符號數的原碼既是無符號數運算結果的補碼.
其最高位為1則是負數, 負數從-128算起, 加上除最高位以外的別的位組成的二進位制數對應的十進位制正數, 即得該負有符號數的十進位制表示,(從十進位制轉為二進位制就是它的原碼了, 但一般我們得到其十進位制表示又何必再轉回原碼呢?)
原理法的原理: 補碼表:
補碼表:
我們看到無符號數129的二進位製碼是10000001, 最高位為1, 其可代表負有符號數, 從表上我們看到, 負有符號數是從-128開始算起的, 我們把129的二進位製碼10000001拆成10000000+1,10000000就是-128, -128再加上拆出來的1就是-127, 即10000001是有符號數-127的補碼. 進而二進位制補碼10000001的原碼是-127的二進位制表示.
第1行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
89h10001001
137-119
0 0 0 0 0
1.先算無符號數:
89h = (10001001)2 = (137)10
2.再算有符號數:
方法一:(取反加一)
(10001001)2 = (01110110)全反 (01110110)全反 +1 = (01110111)補 = (119)有符號數的絕對值 則該有符號數就是119*(-1) = -119
注:全反就是符號位也取反
方法二:(原理法)
(10001001)2 的最高位符號位為1, 則有符號數為負數, 負數從-128算起, (-128)10= (10000000)2
(10001001)2 除最高位之外的位為我們要加上的數(00001001)2 = (9)10 ,則-128+9=(-119)有符號數
3.mov指令不改變標誌位, 故各標誌位均為0
第2行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
12h00010010
1818
1 0 0 1 1
1.先算無符號數:
137+137 = 274
但是274超過了8位無符號數的表示範圍(無符號:0~255, 有符號:-128~127), 此次之行必會引來進製操作, 故cf=1
先從137加到255: 137+? = 255, ? = 255-137 = 118需要加118才能到255, 那麼先把137拆成118和19, 先加118:
137+118=255,再把19拆成1和18, 先加1: 255+1 = 256這裡開始超出表示範圍了, 那麼加了1以後al變為0, 再把剩下的18加上, 得此時的al儲存的是無符號數的話值為0+18 = 18.
2.再算有符號數:
在算有符號數之前,我們很容易發現有符號運算已經發生溢位, -119+(-119) = -238 < -128. 於是得到錯誤的結果"18"
但這個18不是溢位造成的, 而是進行無符號數運算時的結果, 也就是說步驟1裡面的137+137產生進製後的結果. 我們所說的錯誤結果"18"並不是算數意義上的錯誤結果, 它是指在有符號數運算中這個結果沒有實際意義. 但這不代表他在算數意義上是錯誤的, 因為從無符號數的角度來看它是無符號數的正確運算結果, 也就是說, 如果有符號數運算發生溢位, 那麼這個結果就不用看了, 它只能指代無符號數的結果, 不代表有符號數的結果.
12h = (00010010)2 最高位符號位為0, 如果該數表示有符號數, 則為正, 結果與無符號數一樣為18
3.再看各標誌暫存器:
運算結果不為零zf=0, 結果非負sf=0, 運算結果最高位符號位由1變為0, 產生溢位of=1, 結果的1的個數為2為偶數pf=1
第3行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
0afh
10101111
175-81
0 0 1 0 1
1.先算無符號數:
(9dh)16 = (157)10 18+157 = 175 < 255 故無符號數運算結果為175 未發生進製 cf=0 , 結果也不為零 zf=0
(157)10 = (10101111)2 結果中"1"的個數為6, 為偶數個, pf=1
2.再算有符號數:
(9dh)16 = (10011101)2 這個(10011101)2 是有符號數的補碼, 為了得到其原始碼, 對(10011101)2 取全反加一后得: (01100011)2
(01100011)2 = (99)有符號數絕對值 則有符號數為(99)*(-1) = -99 原碼為(11100011)2
則 -99+18 = -81>-128 結果未發生溢位of=0 結果為負數 sf=1
3.再看各標誌暫存器:
綜上所述, 標誌暫存器依次為 0 0 1 0 1.
第4行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
0afh
10101111
175-81
1 0 1 0 1
[注]cmp指令本身含有運算元1-運算元2的意義, 根據相減結果的正負來判斷是大於還是小於, 但它不會修改暫存器中的值. 在本題中其比較結果沒有意義, 於是只關心它做減法運算的功能.
1.先算無符號數:
cmp al,0bch 相當於 (al) - 0bch
(0bch)16 = (188)10 175-188<0
發生借位 cf=1 發生借位後的運算結果是175+256-188 = 243 243不為零zf=0
(243)10 = (11110011)2 共有6個"1", 個數為偶數, pf=1
2.再算有符號數:
(0bch)16 = (10111100)2 原理法算得0bch有符號數原碼是-128+60 = -68
-81-(-68) = -13 <0 則sf=1
3.再看各標誌暫存器:
綜上所述, 標誌暫存器依次為 1 0 1 0 1.
第5行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
00h0000000000
0 1 0 0 1
1.先算無符號數:
sub al,al 毫無疑問就是0
2.再算有符號數:
sub al,al 毫無疑問就是0
3.最後看各標誌暫存器:
結果為0則zf=1, 沒發生進製/借位 cf=0, 結果非負sf=0, 沒發生溢位of=0, 結果中"1"的個數為0則pf=1(0是偶數)
第6行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
0ffh
11111111
255-1
0 0 1 0 1
1.先算無符號數:
0-1<0發生借位, 則借位後的運算結果為0+256-1 = 255, (255)10 = (11111111)2 zf=0, pf=1
值得注意的是dec指令的減法不影響cf, 故cf=0, 同理inc指令的加法也不影響cf
2.再算有符號數:
原理法: -128+127 = -1
則sf=1
3.最後看各標誌暫存器:
綜上所述, 標誌暫存器依次為 0 0 1 0 1.
第7行執行後:al
二進位制表示
無符號數
有符號數
cf zf sf of pf
00h0000000000
0 1 0 0 1
1.先算無符號數:
255+1>255發生進製, 則進製後的運算結果為255+1-256 = 0, zf=1,pf=1
第六行執行的時候提到了, inc不影響cf, 故cf=0
2.再算有符號數:
方法一:就是上一次有符號數結果加一:-1+1 = 0 則sf=0, of=0
方法二:原理法,00000000 的原碼還是0, 0的補碼還是00000000, 故結果為0
3.最後看各標誌暫存器:
綜上所述, 標誌暫存器依次為 0 1 0 0 1.
彙編指令狀態暫存器訪問指令(MRS,MSR)
arm中有兩條指令用於在狀態暫存器和通用暫存器之間傳送資料。針對32位的arm處理器,狀態暫存器就是乙個32位長的暫存器。每個位的含義如下圖 分成了4部分 1,條件標誌位 n negative z zero c carry v verflow 統稱為條件標誌位。arm指令可以根據cpsr中的這些條件...
ARM程式狀態暫存器
分類 linux arm體系結構包含1個當前程式狀態暫存器 cpsr 和5個各份的程式狀態暫存器 spsrs 使用msr和mrs指令來設定和讀取這些暫存器。當前程式狀態暫存器 cpsr 持有關於當預處理器狀態的資訊。其他5個各份的程式狀態暫存器 spsr 每個特權模式都有乙個,持有完成在這個模式下的...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...