根據指令判斷暫存器狀態

2021-10-13 17:13:47 字數 4671 閱讀 5580

給出下列各指令執行後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...