?? i5_5_01_01.htm
字號:
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">SH2: MOV A,R2</p>
<p ALIGN="JUSTIFY">ORL A,R3</p>
<p ALIGN="JUSTIFY">JNZ SH20</p>
<p ALIGN="JUSTIFY">RET ;被開方數為零,不必運算</p>
<p ALIGN="JUSTIFY">SH20: MOV R7,#0 ;左規次數初始化</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">SH22: ANL A,#0C0H ;被開方數高字節小于40H否?</p>
<p ALIGN="JUSTIFY">JNZ SQRH ;不小于40H,左規格化完成,轉開方過程</p>
<p ALIGN="JUSTIFY">CLR C ;每左規一次,被開方數左移兩位</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV F0,C</p>
<p ALIGN="JUSTIFY">CLR C</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">MOV ACC.7,C</p>
<p ALIGN="JUSTIFY">MOV C,F0</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">INC R7 ;左規次數加一</p>
<p ALIGN="JUSTIFY">SJMP SH22 ;繼續左規</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(13) 標號: SH4
功能:四字節二進制無符號數開平方(快速)</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:被開方數在R2、R3、R4、R5中。</p>
<p ALIGN="JUSTIFY">出口信息:平方根在R2、R3中,整數部分的位數為原數的一半,其余為小數。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">SH4: MOV A,R2</p>
<p ALIGN="JUSTIFY">ORL A,R3</p>
<p ALIGN="JUSTIFY">ORL A,R4</p>
<p ALIGN="JUSTIFY">ORL A,R5</p>
<p ALIGN="JUSTIFY">JNZ SH40</p>
<p ALIGN="JUSTIFY">RET ;被開方數為零,不必運算</p>
<p ALIGN="JUSTIFY">SH40: MOV R7,#0 ;左規次數初始化</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">SH41: ANL A,#0C0H ;被開方數高字節小于40H否?</p>
<p ALIGN="JUSTIFY">JNZ SQRH ;不小于40H,左規格化完成</p>
<p ALIGN="JUSTIFY">MOV R6,#2 ;每左規一次,被開方數左移兩位</p>
<p ALIGN="JUSTIFY">SH42: CLR C ;被開方數左移一位</p>
<p ALIGN="JUSTIFY">MOV A,R5</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV A,R4</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">DJNZ R6,SH42 ;被開方數左移完兩位</p>
<p ALIGN="JUSTIFY">INC R7 ;左規次數加一</p>
<p ALIGN="JUSTIFY">SJMP SH41 ;繼續左規</p>
<p ALIGN="JUSTIFY">SQRH: MOV A,R2 ;規格化后高字節按折線法分為三個區間</p>
<p ALIGN="JUSTIFY">ADD A,#57H</p>
<p ALIGN="JUSTIFY">JC SQR2</p>
<p ALIGN="JUSTIFY">ADD A,#45H</p>
<p ALIGN="JUSTIFY">JC SQR1</p>
<p ALIGN="JUSTIFY">ADD A,#24H</p>
<p ALIGN="JUSTIFY">MOV B,#0E3H ;第一區間的斜率</p>
<p ALIGN="JUSTIFY">MOV R4,#80H ;第一區間的平方根基數</p>
<p ALIGN="JUSTIFY">SJMP SQR3</p>
<p ALIGN="JUSTIFY">SQR1: MOV B,#0B2H ;第二區間的斜率</p>
<p ALIGN="JUSTIFY">MOV R4,#0A0H;第二區間的平方根基數</p>
<p ALIGN="JUSTIFY">SJMP SQR3</p>
<p ALIGN="JUSTIFY">SQR2: MOV B,#8DH ;第三區間的斜率</p>
<p ALIGN="JUSTIFY">MOV R4,#0D0H;第三區間的平方根基數</p>
<p ALIGN="JUSTIFY">SQR3: MUL AB ;與區間基點的偏移量乘區間斜率</p>
<p ALIGN="JUSTIFY">MOV A,B</p>
<p ALIGN="JUSTIFY">ADD A,R4 ;累加到平方根的基數上</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV B,A</p>
<p ALIGN="JUSTIFY">MUL AB ;求當前平方根的冪</p>
<p ALIGN="JUSTIFY">XCH A,R3 ;求偏移量(存放在R2R3中)</p>
<p ALIGN="JUSTIFY">CLR C</p>
<p ALIGN="JUSTIFY">SUBB A,R3</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">SUBB A,B</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">SQR4: SETB C ;用減奇數法校正一個字節的平方根</p>
<p ALIGN="JUSTIFY">MOV A,R4 ;當前平方根的兩倍加一存入R5R6中</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R6,A</p>
<p ALIGN="JUSTIFY">CLR A</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV A,R3 ;偏移量小于該奇數否?</p>
<p ALIGN="JUSTIFY">SUBB A,R6</p>
<p ALIGN="JUSTIFY">MOV B,A</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">SUBB A,R5</p>
<p ALIGN="JUSTIFY">JC SQR5 ;小于,校正結束,已達到一個字節的精度</p>
<p ALIGN="JUSTIFY">INC R4 ;不小于,平方根加一</p>
<p ALIGN="JUSTIFY">MOV R2,A ;保存新的偏移量</p>
<p ALIGN="JUSTIFY">MOV R3,B</p>
<p ALIGN="JUSTIFY">SJMP SQR4 ;繼續校正</p>
<p ALIGN="JUSTIFY">SQR5: MOV A,R4 ;將一個字節精度的根存入R2</p>
<p ALIGN="JUSTIFY">XCH A,R2</p>
<p ALIGN="JUSTIFY">RRC A</p>
<p ALIGN="JUSTIFY">MOV F0,C ;保存最終偏移量的最高位</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">MOV R5,A ;將最終偏移量的低八位存入R5中</p>
<p ALIGN="JUSTIFY">MOV R4,#8 ;通過(R5R6/R2)求根的低字節</p>
<p ALIGN="JUSTIFY">SQR6: CLR C</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">CLR C</p>
<p ALIGN="JUSTIFY">MOV A,R5</p>
<p ALIGN="JUSTIFY">SUBB A,R2</p>
<p ALIGN="JUSTIFY">JB F0,SQR7</p>
<p ALIGN="JUSTIFY">JC SQR8</p>
<p ALIGN="JUSTIFY">SQR7: MOV R5,A</p>
<p ALIGN="JUSTIFY">INC R3</p>
<p ALIGN="JUSTIFY">SQR8: CLR C</p>
<p ALIGN="JUSTIFY">MOV A,R5</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV F0,C</p>
<p ALIGN="JUSTIFY">DJNZ R4,SQR6 ;根的第二字節計算完,在R3中</p>
<p ALIGN="JUSTIFY">MOV A,R7 ;取原被開方數的左規次數</p>
<p ALIGN="JUSTIFY">JZ SQRE ;未左規,開方結束</p>
<p ALIGN="JUSTIFY">SQR9: CLR C ;按左規次數右移平方根,得到實際根</p>
<p ALIGN="JUSTIFY">MOV A,R2</p>
<p ALIGN="JUSTIFY">RRC A</p>
<p ALIGN="JUSTIFY">MOV R2,A</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">RRC A</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">DJNZ R7,SQR9</p>
<p ALIGN="JUSTIFY">SQRE: RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(14) 標號: HASC
功能:單字節十六進制數轉換成雙字節ASCII碼</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:待轉換的單字節十六進制數在累加器A中。</p>
<p ALIGN="JUSTIFY">出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、B 堆棧需求: 4字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">HASC: MOV B,A ;暫存待轉換的單字節十六進制數</p>
<p ALIGN="JUSTIFY">LCALL HAS1 ;轉換低四位</p>
<p ALIGN="JUSTIFY">XCH A,B ;存放低四位的ASCII碼</p>
<p ALIGN="JUSTIFY">SWAP A ;準備轉換高四位</p>
<p ALIGN="JUSTIFY">HAS1: ANL A,#0FH ;將累加器的低四位轉換成ASCII碼</p>
<p ALIGN="JUSTIFY">ADD A,#90H</p>
<p ALIGN="JUSTIFY">DA A</p>
<p ALIGN="JUSTIFY">ADDC A,#40H</p>
<p ALIGN="JUSTIFY">DA A</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(15) 標號: ASCH 功能:ASCII碼轉換成十六進制數</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。</p>
<p ALIGN="JUSTIFY">出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">ASCH: CLR C</p>
<p ALIGN="JUSTIFY">SUBB A,#30H</p>
<p ALIGN="JUSTIFY">JNB ACC.4,ASH1</p>
<p ALIGN="JUSTIFY">SUBB A,#7</p>
<p ALIGN="JUSTIFY">ASH1: RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(16) 標號:HBCD
功能:單字節十六進制整數轉換成單字節BCD碼整數</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:待轉換的單字節十六進制整數在累加器A中。</p>
<p ALIGN="JUSTIFY">出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、B、R3 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">HBCD: MOV B,#100 ;分離出百位,存放在R3中</p>
<p ALIGN="JUSTIFY">DIV AB</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV A,#10 ;余數繼續分離十位和個位</p>
<p ALIGN="JUSTIFY">XCH A,B</p>
<p ALIGN="JUSTIFY">DIV AB</p>
<p ALIGN="JUSTIFY">SWAP A</p>
<p ALIGN="JUSTIFY">ORL A,B ;將十位和個位拼裝成BCD碼</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(17) 標號: HB2
功能:雙字節十六進制整數轉換成雙字節BCD碼整數</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:待轉換的雙字節十六進制整數在R6、R7中。</p>
<p ALIGN="JUSTIFY">出口信息:轉換后的三字節BCD碼整數在R3、R4、R5中。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、R2~R7 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">HB2: CLR A ;BCD碼初始化</p>
<p ALIGN="JUSTIFY">MOV R3,A</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV R2,#10H ;轉換雙字節十六進制整數</p>
<p ALIGN="JUSTIFY">HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R7,A</p>
<p ALIGN="JUSTIFY">MOV A,R6</p>
<p ALIGN="JUSTIFY">RLC A</p>
<p ALIGN="JUSTIFY">MOV R6,A</p>
<p ALIGN="JUSTIFY">MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2</p>
<p ALIGN="JUSTIFY">ADDC A,R5</p>
<p ALIGN="JUSTIFY">DA A ;十進制調整</p>
<p ALIGN="JUSTIFY">MOV R5,A</p>
<p ALIGN="JUSTIFY">MOV A,R4</p>
<p ALIGN="JUSTIFY">ADDC A,R4</p>
<p ALIGN="JUSTIFY">DA A</p>
<p ALIGN="JUSTIFY">MOV R4,A</p>
<p ALIGN="JUSTIFY">MOV A,R3</p>
<p ALIGN="JUSTIFY">ADDC A,R3</p>
<p ALIGN="JUSTIFY">MOV R3,A
;雙字節十六進制數的萬位數不超過6,不用調整</p>
<p ALIGN="JUSTIFY">DJNZ R2,HB3 ;處理完16bit</p>
<p ALIGN="JUSTIFY">RET </p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">(18) 標號: HBD
功能:單字節十六進制小數轉換成單字節BCD碼小數</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">入口條件:待轉換的單字節十六進制小數在累加器A中。</p>
<p ALIGN="JUSTIFY">出口信息:CY=0時轉換后的BCD碼小數仍在A中。CY=1時原小數接近整數1。</p>
<p ALIGN="JUSTIFY">影響資源:PSW、A、B 堆棧需求: 2字節</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">HBD: MOV B,#100 ;原小數擴大一百倍</p>
<p ALIGN="JUSTIFY">MUL AB</p>
<p ALIGN="JUSTIFY">RLC A ;余數部分四舍五入</p>
<p ALIGN="JUSTIFY">CLR A</p>
<p ALIGN="JUSTIFY">ADDC A,B</p>
<p ALIGN="JUSTIFY">MOV B,#10 ;分離出十分位和百分位</p>
<p ALIGN="JUSTIFY">DIV AB</p>
<p ALIGN="JUSTIFY">SWAP A</p>
<p ALIGN="JUSTIFY">ADD A,B ;拼裝成單字節BCD碼小數</p>
<p ALIGN="JUSTIFY">DA A ;調整后若有進位,原小數接近整數1</p>
<p ALIGN="JUSTIFY">RET</p>
<p ALIGN="JUSTIFY"> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -