文件名称:AVR汇编百例_-_计算程序
文件大小:48KB
文件格式:DOC
更新时间:2018-09-12 15:17:31
单片机
;范例9 ;16位整数被乘数*16位小数乘数-->16位整数积,精确到0.5 MUL165: RCALL MUL16 ;先得到32位积 SBRS R14,7 ;积小数部分最高位为1,将整数部分加1 RET ;否则返回 LDI R17,255 SUB R13,R17 SBC R12,R17 ;以减去-1($FFFF)替代加1 RET ;范例10 ;32位被除数/16位除数-->16位商,精确到1 DIV16: LDI R16,16 ;(r12r13r14r15)/(r10r11)-->r14r15 DLOOP: LSL R15 ROL R14 ROL R13 ROL R12 ;被除数左移1位 BRCS DI1 SUB R13,R11 SBC R12,R10 ;移出位为0,被除数高位字减去除数试商 BRCC DI2 ;够减,本位商为1 ADD R13,R11 ADC R12,R10 ;否则恢复被除数 RJMP DI3 ;本位商0 DI1: SUB R13,R11 SBC R12,R10 ;移出位为1,被除数高位字减去除数 DI2: INC R15 ;本位商1 DI3: DEC R16 BRNE DLOOP RET ;范例11 ;32位被除数/16位除数-->16位商,精确到0.5 ;可能产生溢出!例$7FFFC000/$8000=$FFFF.8->$10000! DIV165: RCALL DIV16 ;(r12r13r14r15)/(r10r11)-->r14r15 LSL R13 ROL R12 ;余数乘2 BRCS D165 ;有进位,转5入 SUB R13,R11 SBC R12,R10 ;否则,余数乘2减去除数 BRCS D164 ;不够减,转4舍 D165: CLR R13 ;否则将商增1 SEC ADC R15,R13 ADC R14,R13 ADC R13,R13 ;若有溢出,溢出位在R13中 RET D164: CLR R13 RET ;范例12 ;32位整数/16位整数->16整数+16位小数->4字节浮点数 ;(r12r13r14r15)/(r10r11)-->r12r13r14r15 DIV16F: RCALL DIV16 ;先做整数除法 MOV R9,r15 MOV R8,r14 ;保存整数部分 CLR R15 CLR R14 RCALL DIV16 ;除得小数部分 MOV R11,R15 MOV R15,R14 MOV R13,R8 MOV R14,R9 ;整数部分在r13r14,小数部分在r15r11 LDI R17,$90 ;预设阶码$90(整数为16位) MOV R12,R17 LDI R17,32 ;设32次右移 DIV16L: SBRC R13,7 RJMP NMLDN ;最高位为1,已完成规格化 LSL R11 ;否则继续右移R13,R14,R15,R11 ROL R15 ROL R14 ROL R13 DEC R12 ;阶码减1 DEC R17 BRNE DIV16L CLR R12 ;右移达32次,浮点数为零,置零阶 RET NMLDN: SBRS R11,7 RJMP DIVRT ;欲舍去部分(R11)最高位为0,转4舍 RCALL INC3 ;否则尾数部分增1 BRNE DIVRT INC R12 ;尾数增1后变为0,改为0.5,并将阶码增1 DIVRT: LDI R17,$7F ;将尾数最高位清除,表示正数(负数不要清除) AND R13,R17 ;规格化浮点数在R12(阶码)R13R14R15(尾数)中 RET ;范例13 ;(R16,R12,R13,R14,R15)/(R10,R11)-->R13,R14,R15 DIV24: CLR R16 ;32位整数/16位整数->24位整数,要求(R10)不为0;否则 ;要求(R12)<(R11) DIV40: LDI 17,24 ;40位整数/16位整数->24位整数 要求(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 ;被除数减