?? 100個(gè)匯編范例.txt
字號:
定點(diǎn)運(yùn)算和定點(diǎn)數(shù)制轉(zhuǎn)換
;范例1
LSDAA: ADC R16,R16 ;十進(jìn)制數(shù)(在R16中)左移調(diào)整子程序
ADDAA: IN R6,SREG ;bcd碼相加調(diào)整子程序,先保存相加后的
LDI R17,$66 ;狀態(tài)the old status
ADD R16,R17 ;再將和預(yù)加立即數(shù)$66
IN R17,SREG ;輸入相加后新狀態(tài)(the new status)
OR R6,R17 ;新舊狀態(tài)相或
SBRS R6,0 ;相或后進(jìn)位置位則跳行
SUBI R16,$60 ;否則減去$60(十位bcd不滿足調(diào)整條件)
SBRS R6,5 ;半進(jìn)位置位則跳行
SUBI R16,6 ;否則減去$06(個(gè)位bcd不滿足調(diào)整條件)
ROR R6 ;向高位字節(jié)BCD返還進(jìn)位位!
RET
;范例2
SUDAA: BRCC SBD1 ;bcd碼減法調(diào)整子程序,差在R16中
BRHC SBD3
SUBI R16,$66 ;進(jìn)位半進(jìn)位都置位,將差減去立即數(shù)$66
SEC ;并恢復(fù)借位C
RET ;ret. with seC
SBD1: BRHC SBD2 ;進(jìn)位半進(jìn)位都清位,返回
SUBI R16,6 ;進(jìn)位清除而半進(jìn)位置位,將差減去6
SBD2: RET ;ret. with clC
SBD3: SUBI R16,$60 ;進(jìn)位置位而半進(jìn)位清除,將差減去$60
SEC ;并恢復(fù)借位C
RET ;ret. with seC
;范例3
RSDAA: SBRC R16,7 ;bcd碼(在R16中)右移調(diào)整子程序
SUBI R16,$30 ;十位BCD最高位為1(代表8),將其變?yōu)?(否則跳行)
SBRC R16,3
SUBI R16,3 ;個(gè)位BCD最高位為1(代表8),將其變?yōu)?(否則跳行)
RET
;范例4
ADBCD4: MOV R16,R15 ;4字節(jié)壓縮bcd碼相加子程序
ADD R16,R11 ;R12,R13,R14,R15內(nèi)為被加數(shù),R8,R9,R10,R11內(nèi)為加數(shù)
RCALL ADDAA ;相加后調(diào)整
MOV R15,R16 ;并返還調(diào)整后結(jié)果
MOV R16,R14
ADC R16,R10
RCALL ADDAA
MOV R14,R16
MOV R16,R13
ADC R16,R9
RCALL ADDAA
MOV R13,R16
MOV R16,R12
ADC R16,R8
RCALL ADDAA
MOV R12,R16
RET
;范例5
ADBCD: LDI R16,4 ;多字節(jié)壓縮bcd碼相加子程序
MOV R7,R16 ;(r7):字節(jié)數(shù)
CLC
ADLOP: LD R16,-X ;X-1指向被加數(shù);
LD R6,-Y ;Y-1指向加數(shù)
ADC R16,R6
RCALL ADDAA ;相加后調(diào)整
ST X,R16 ;返還調(diào)整后結(jié)果
DEC R7
BRNE ADLOP
RET
;范例6
SUBCD4: MOV R16,R15 ;4字節(jié)壓縮bcd碼減法子程序
SUB R16,R11 ;R12,R13,R14,R15內(nèi)為被減數(shù),R8,R9,R10,R11內(nèi)為減數(shù)
RCALL SUDAA ;相減后調(diào)整
MOV R15,R16 ;并返還調(diào)整后結(jié)果
MOV R16,R14
SBC R16,R10
RCALL SUDAA
MOV R14,r16
MOV R16,R13
SBC R16,R9
RCALL SUDAA
MOV R13,R16
MOV R16,R12
SBC R16,R8
RCALL SUDAA
MOV R12,R16
RET
;范例7
SUBCD: LDI R16,4 ;多字節(jié)壓縮bcd碼相減子程序
MOV R7,R16 ;(r7):壓縮bcd碼字節(jié)數(shù)
CLC
SUBLP: LD R16,-X ;X-1指向被減數(shù)
LD R6,-Y ;Y-1指向減數(shù)
SBC R16,R6
RCALL SUDAA ;相減后調(diào)整
ST X,R16 ;返還調(diào)整后結(jié)果
DEC R7
BRNE SUBLP
RET
;范例8 ;16位被乘數(shù)*16位乘數(shù)-->32位積
MUL16: LDI R16,17 ;(r10r11)*(r14r15)-->r12r13r14r15
ClR R12
ClR R13 ;積的高位字預(yù)清除
CLC ;第1次只右移,不相加
MLOOP: BRCC MUL1 ;
ADD R13,R11 ;乘數(shù)右移移出位為1,將被乘數(shù)加入部分積
ADC R12,R10
MUL1: ROR R12
ROR R13
ROR R14
ROR R15 ;部分積連同乘數(shù)整體右移1位
DEC R16
BRNE MLOOP ;17次右移后結(jié)束
RET
;范例9 ;16位整數(shù)被乘數(shù)*16位小數(shù)乘數(shù)-->16位整數(shù)積,精確到0.5
MUL165: RCALL MUL16 ;先得到32位積
SBRS R14,7 ;積小數(shù)部分最高位為1,將整數(shù)部分加1
RET ;否則返回
LDI R17,255
SUB R13,R17
SBC R12,R17 ;以減去-1($FFFF)替代加1
RET
;范例10 ;32位被除數(shù)/16位除數(shù)-->16位商,精確到1
DIV16: LDI R16,16 ;(r12r13r14r15)/(r10r11)-->r14r15
DLOOP: LSL R15
ROL R14
ROL R13
ROL R12 ;被除數(shù)左移1位
BRCS DI1
SUB R13,R11
SBC R12,R10 ;移出位為0,被除數(shù)高位字減去除數(shù)試商
BRCC DI2 ;夠減,本位商為1
ADD R13,R11
ADC R12,R10 ;否則恢復(fù)被除數(shù)
RJMP DI3 ;本位商0
DI1: SUB R13,R11
SBC R12,R10 ;移出位為1,被除數(shù)高位字減去除數(shù)
DI2: INC R15 ;本位商1
DI3: DEC R16
BRNE DLOOP
RET
;范例11 ;32位被除數(shù)/16位除數(shù)-->16位商,精確到0.5
;可能產(chǎn)生溢出!例$7FFFC000/$8000=$FFFF.8->$10000!
DIV165: RCALL DIV16 ;(r12r13r14r15)/(r10r11)-->r14r15
LSL R13
ROL R12 ;余數(shù)乘2
BRCS D165 ;有進(jìn)位,轉(zhuǎn)5入
SUB R13,R11
SBC R12,R10 ;否則,余數(shù)乘2減去除數(shù)
BRCS D164 ;不夠減,轉(zhuǎn)4舍
D165: CLR R13 ;否則將商增1
SEC
ADC R15,R13
ADC R14,R13
ADC R13,R13 ;若有溢出,溢出位在R13中
RET
D164: CLR R13
RET
;范例12 ;32位整數(shù)/16位整數(shù)->16整數(shù)+16位小數(shù)->4字節(jié)浮點(diǎn)數(shù)
;(r12r13r14r15)/(r10r11)-->r12r13r14r15
DIV16F: RCALL DIV16 ;先做整數(shù)除法
MOV R9,r15
MOV R8,r14 ;保存整數(shù)部分
CLR R15
CLR R14
RCALL DIV16 ;除得小數(shù)部分
MOV R11,R15
MOV R15,R14
MOV R13,R8
MOV R14,R9 ;整數(shù)部分在r13r14,小數(shù)部分在r15r11
LDI R17,$90 ;預(yù)設(shè)階碼$90(整數(shù)為16位)
MOV R12,R17
LDI R17,32 ;設(shè)32次右移
DIV16L: SBRC R13,7
RJMP NMLDN ;最高位為1,已完成規(guī)格化
LSL R11 ;否則繼續(xù)右移R13,R14,R15,R11
ROL R15
ROL R14
ROL R13
DEC R12 ;階碼減1
DEC R17
BRNE DIV16L
CLR R12 ;右移達(dá)32次,浮點(diǎn)數(shù)為零,置零階
RET
NMLDN: SBRS R11,7
RJMP DIVRT ;欲舍去部分(R11)最高位為0,轉(zhuǎn)4舍
RCALL INC3 ;否則尾數(shù)部分增1
BRNE DIVRT
INC R12 ;尾數(shù)增1后變?yōu)?,改為0.5,并將階碼增1
DIVRT: LDI R17,$7F ;將尾數(shù)最高位清除,表示正數(shù)(負(fù)數(shù)不要清除)
AND R13,R17 ;規(guī)格化浮點(diǎn)數(shù)在R12(階碼)R13R14R15(尾數(shù))中
RET
;范例13 ;(R16,R12,R13,R14,R15)/(R10,R11)-->R13,R14,R15
DIV24: CLR R16 ;32位整數(shù)/16位整數(shù)->24位整數(shù),要求(R10)不為0;否則
;要求(R12)<(R11)
DIV40: LDI 17,24 ;40位整數(shù)/16位整數(shù)->24位整數(shù) 要求(R16,R12)
LXP: LSL R15 ; <(R10,R11)
ROL R14
ROL R13
ROL R12
ROL R16
BRCC LXP1
SUB R12,R11 ;右移后C=1 夠減
SBC R16,R10 ;被除數(shù)減去除數(shù)
RJMP DIV0 ;本位商為1
LXP1: SUB R12,R11 ;C=0
SBC R16,R10 ;被除數(shù)減去除數(shù)試商
BRCC DIV0 ;C=0 夠減,本位商1
ADD R12,R11
ADC R16,R10 ;否則恢復(fù)被除數(shù),本位商0
RJMP DIV1
DIV0: INC R15 ;記本位商1
DIV1: DEC R17
BRNE LXP
LSL R12
ROL R16
BRCS GINC ;C=1,5入
SUB R12,R11
SBC R16,R10
BRCS RET3 ;不夠減,舍掉
GINC: RCALL INC3 ;將商增1
RET3: RET
;范例14 ;定點(diǎn)整數(shù)(最大$FFFFFFFF)開平方子程序
INTSQR: LDI R16,17 ;SQR(R12,R13,R14,R15)-->(r15r8r9)
CLR R8 ;R8,R9存儲平方根
CLR R9 ;r10,r11,r12,r13,r14,r15
CLR R10 ; r8, r9(根) r16 (counter)
CLR R11 ;r10,r11:被開平方數(shù)擴(kuò)展字節(jié)
LDI R17,$40
SQR0: SUB R12,R17
SBC R11,R9
SBC R10,R8
BRCS SQR1
SEC ;試根夠減,本位根1
RJMP SQR2
SQR1: ADD R12,R17
ADC R11,R9
ADC R10,R8
CLC ;否則恢復(fù)被開平方數(shù),本位根0
SQR2: DEC R16
BRNE SQR3 ;when the No.17bit of root be getting
SQR20: ADC R9,R15 ;R15 HAVE BEEN CLEARED!
ADC R8,R15
ADC R15,R15 ;將開出之根4舍5入,使根最大可達(dá)65536(=$10000)!
RET ;for example:sqr.($ffff0001)≈$10000
SQR3: ROL R9
ROL R8 ;記本位根
LSL R15
ROL R14
ROL R13
ROL R12
ROL R11
ROL R10 ;被開平方數(shù)連同其擴(kuò)展字節(jié)左移一位
LSL R15
ROL R14
ROL R13
ROL R12
ROL R11
ROL R10 ;被開平方數(shù)連同其擴(kuò)展字節(jié)再次左移一位/左移2位開出1位根
BRCS SQR20 ;被開平方數(shù)左移2位后,若進(jìn)位置位,則僅表明第17位根
;已被提前開出且該位根=1,將平方根增1,開平方結(jié)束。
RJMP SQR0 ;否則轉(zhuǎn)試下一位根
;范例15 ;定點(diǎn)整數(shù)二翻十
CONV1: LDI R17,24 ;r12r13r14r15<--(r9r10r11)左移24次
MOV R7,R17 ;例:16777215<--$FFFFFF
CLR R12
CLR R13 ;68719476735<--$FFFFFFFFF
CLR R14 ;1099511627775<--$FFFFFFFFFF
CLR R15 ;十進(jìn)制數(shù)存儲區(qū)予清除
CV1: LSL R11
ROL R10
ROL R9 ;二進(jìn)制數(shù)整體左移一位
MOV R16,R15
RCALL LSDAA
MOV R15,R16
MOV R16,R14
RCALL LSDAA
MOV R14,R16
MOV R16,R13
RCALL LSDAA
MOV R13,R16
MOV R16,R12
RCALL LSDAA ;十進(jìn)制數(shù)左移并調(diào)整
MOV R12,R16
DEC R7
BRNE CV1
RET
;范例16 ;定點(diǎn)整數(shù)十翻二
CONV2: LDI R17,24 ;(r9r10r11)-->r13r14r15,右移24次
CLR R31 ;例:999999-->$0F423F
MOV R7,R17 ; 99999999-->$05F5E0FF
CV2: LSR R9
ROR R10
ROR R11
ROR R13
ROR R14
ROR R15 ;十進(jìn)制數(shù)連同二進(jìn)制數(shù)右移一位
LDI R30,12 ;數(shù)據(jù)指針
CV2L: LD R16,-Z
RCALL RSDAA ;十進(jìn)制數(shù)右移調(diào)整
ST Z,R16
CPI R30,9 ;十進(jìn)制數(shù)各字節(jié)調(diào)整完畢?
BRNE CV2L
DEC R7 ;右移次數(shù)(24次)完成?
BRNE CV2
RET
;范例17 ;定點(diǎn)小數(shù)二翻十
CONV3: LDI R17,24 ;(r13r14r15)--->r9r10r11r12右移24次
CONV31: MOV R7,R17
CLR R9
CLR R10 ;例:$0.FFFFFF-->0.99999994
CLR R11 ;$0.FFFFFFFF-->0.999999999767
CLR R12 ;$0.FFFFFFFFF->0.999999999985448
CLR R31
CV3: LSR R13
ROR R14
ROR R15
ROR R9
ROR R10
ROR R11
ROR R12 ;二進(jìn)制數(shù)連同十進(jìn)制數(shù)右移一位
LDI R30,9
CV3L: LD R16,Z
RCALL RSDAA ;十進(jìn)制數(shù)右移調(diào)整
ST Z+,r16
CPI R30,13
BRNE CV3L ;十進(jìn)制數(shù)各字節(jié)調(diào)整完畢?
DEC R7
BRNE CV3 ;右移次數(shù)(24次)完成?
RET
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -