第1个回答 推荐于2016-11-28
共同研究一下:下面的几种方法(下面采用汇编的形式写,可能这样比C更容易理解一点)
1:(移位法)
clrr TmpL ;清临时寄存器
clrr TmpH
movar TmpL
rl TmpL,1 ;不带进位左移(左移两位相当于*4)
btrss status,C_FLAG ;C_FLAG 进位标志
inc TmpH,1
rl TmpL,1
btrss status,C_FLAG
inc TmpH,1
movr TmpH,0 ;放入值 高位放入B 低位放入A
movar B
movr TmpL,0
2:(相加法)
clrr TmpL ;清临时寄存器
clrr TmpH
movar TmpL ;放入初值
movia 3 ;放入计数次数(4-1)
movar downcount
ADD_star: ;改为调用形式应该更好
ADD_loop:
movr downcount,1
btrsc status,Z_FLAG ;Z_FLAG 零标志
goto ADD_end
movr TmpL,0
addar TmpL,1
btrsc status,C_FLAG
inc TmpH,1 ;这里没有考虑溢出问题
decr downcount,1
btrss status,Z_FLAG
goto ADD_loop
movr TmpH,0
movar B
movr TmpL,0
ADD_end:
3:
clrr TmpL ;清临时寄存器
clrr TmpH
mulia a,2 ;乘数过大采用调用的形式更好
btrsc status,C_FLAG ;注单片机”相乘“会影响”进位标志“
inc TmpH,1
mulia a,2
btrsc status,C_FLAG
inc TmpH,1
movar TmpL
movr TmpH,0 ;放入值
movar B
movr TmpL,0本回答被提问者采纳
第2个回答 2008-06-02
<<单片机原理,接口及应用--嵌入在式系统技术基础>>清华大学出版社,作者,肖看,李群芳.这本书有一道一模一样的题目,下面是这道题的标准准答案.
(1)利用乘法指令:
MOV B,#04H
MUL AB
SJMP $
(2)利用移位指令:
RL A
RL A
MOV 20H,A
ANL A,#03H
MOV B,A
MOV A,20H
ANL,#0FCH
SJMP $
(3)用加法指令:
ADD A,A
MOV R0,A
MOV A,#0
ADDC A,A
MOV B,A
MOV A,R0
ADD A,A
MOV R1,A
MOV A,B
ADDC A,B
MOV B,A
MOV A,R1
SJMP $