彙編學習筆記07——BCD碼及調整指令
一、BCD碼
什麼是BCD碼呢?
BCD碼的全稱是Binary Coded Decimal。可以看出是關於二進位制和十進位制的編碼。
我們在寫十進位制轉二進位制的時候,採用的是8421編碼制,比如十進位制的43,在二進位制就是 0010 1011
而BCD碼會將這個十進位制的數分割成4和3,分別用兩個4位二進位制去表示:
0100 0011——0100是4 0011是3.
BCD碼其實有兩種格式,壓縮BCD碼和非壓縮BCD碼
上面寫的那種就是壓縮BCD碼,一個位元組的高低四位各表示一個十進位制數。
而非壓縮BCD碼則是,一個位元組只有低四位去表示一個十進位制數,高四位空閒不用。
比如剛才的43,用非壓縮BCD碼錶示就是xxxx0100 xxxx0011
BCD碼其實用的不多,但是考試可能會涉及到,所以我們著重學一下BCD碼的調整指令
二、BCD調整指令
什麼是BCD調整指令呢?或者說為什麼要調整呢?
我們剛才說BCD碼用得不多,所以任何CPU都沒有設定專門的BCD碼的運算指令,只能通過正常普通的二進位制運算指令來進行。
這就出問題了。
比如我們想算一個十進位制的35+35,我們希望得到的是一個為70D的BCD碼(0111 0000)
但是我們算一下,35的BCD碼是0011 0101,按照二進位制的運算方式,35+35就成了0110 1010。
仔細看,後面兩個5+5,本應該滿十進一的,結果低四位的二進位制是可以表示10的,就沒有對高四位進位,這樣就與我們期望的結果不匹配了。
再舉個例子,比如38加38,我們期望得到76(0111 0110)
但是0011 1000算完後是0111 0000(70D),這裡是低位產生了進位,但並不是滿十進位,而是帶走了一個16,所以依然比我們期望的低了6。
這樣我們就找到調整的方法了——就是加6
BCD調整指令主要有四種(乘法和除法的不做要求):
DAA壓縮型BCD數加法調整指令
AAA非圧縮型BCD數加法調整指令
DAS壓縮型BCD數減法調整指令
AAS非圧縮型BCD數減法調整指令
1、DAA
DAA是對在AL中的和進行調整,重新產生一個BCD碼,放在加法指令後面
格式:DAA
運算元隱含為AL暫存器
方法為:
- 如果AL中的低四位在A~F之間(即低四位大於10D),或者AF為1(即低四位產生進位),則AL <- AL+6,且將AF置為1.
- 如果AL中的高四位在A~F之間(即高四位大於10D),或者CF為1(即高四位產生進位),則AL <- AL+60H,且將CF置為1.
2、DAS
DAS是對在AL中的差進行調整,重新產生一個BCD碼,放在減法指令後面
格式:DAS
運算元隱含為AL暫存器
方法為:
- 如果AL中的低四位在A~F之間(即低四位大於10D),或者AF為1(即低四位產生進位),則AL <- AL-6,且將AF置為1.
- 如果AL中的高四位在A~F之間(即高四位大於10D),或者CF為1(即高四位產生進位),則AL <- AL-60H,且將CF置為1.
注:DAA和DAS要緊跟在加法減法指令之後
相關文章
- 彙編學習筆記之轉移指令筆記
- 學習筆記分享之彙編---2.彙編指令/語法筆記
- 彙編學習筆記筆記
- 逆向學習筆記3——暫存器與彙編指令筆記
- 彙編基礎學習筆記筆記
- 【筆記】statspack 學習(二) sql調整筆記SQL
- iOS逆向學習筆記 - 彙編(一) - 初識彙編iOS筆記
- Shell指令碼學習筆記指令碼筆記
- 《Shell指令碼學習指南》學習筆記指令碼筆記
- iOS逆向學習筆記 - 彙編(四) - 迴圈&選擇[cmp 比較指令]iOS筆記
- shell指令碼學習筆記-1指令碼筆記
- 我的彙編學習之路(1):指令
- 【自用】彙編初學筆記 #1筆記
- 【Redis學習筆記】2018-07-11 Redis指令學習5Redis筆記
- 【Redis學習筆記】2018-07-10 Redis指令學習3Redis筆記
- Vue 學習筆記——指令Vue筆記
- 官方遊戲--學習筆記二(英雄指令碼)遊戲筆記指令碼
- 學習筆記 07 --- JUC集合筆記
- Solidity語言學習筆記————38、Solidity彙編Solid筆記
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- 彙編學習小記(三)-查表
- 【學習筆記】初次學習斜率最佳化的程式碼及筆記筆記
- 學習Ant編譯指令碼編譯指令碼
- Angularjs學習筆記指令AngularJS筆記
- Oracle效能優化視訊學習筆記-動態調整SGAOracle優化筆記
- Java基礎-學習筆記07Java筆記
- Oracle效能調整筆記Oracle筆記
- [老實李] Gradle學習筆記-使用kotlin編寫gradle指令碼Gradle筆記Kotlin指令碼
- Centos學習筆記14 – java程式啟動指令碼CentOS筆記Java指令碼
- shell指令碼程式設計學習筆記-運算子指令碼程式設計筆記
- shell指令碼程式設計學習筆記——變數指令碼程式設計筆記變數
- 【Linux學習筆記29】shell指令碼基礎Linux筆記指令碼
- surfer 8 scripter 學習筆記(1)指令碼物件模型筆記指令碼物件模型
- webpack 學習筆記:實戰之 babel 編碼Web筆記Babel
- 整體二分學習筆記筆記
- 逆向之彙編筆記筆記
- 【編譯openjdk學習筆記】編譯JDK筆記
- 彙編指令