标签:
面对复杂的程序,我们不能都放入main主程序之中,那样会让人思路不够清晰,于是我们加入了子程序,这样程序就有了条理。主程序决定我们的思路,子程序则实现具体的功能。如果程序没有达到预想中的效果,就可以有条有理的进行分析,这在编写汇编程序时是很重要的,毕竟汇编语言不像c语言、c++、java等高级语言贴近人类语言。汇编语言的优势在于执行效率,可以用于程序的优化。为了让程序更加强大,我们给程序加入查表的功能,利用查表可以实现转换、计算等各种功能。
例子:将单字节变量Hex_Byte中存放的十六进制数转换为两位ASCII码,并将结果存至以Result开首的字节存储单元中,可使用子程序。例如4AH的ASCII码为3441H,$F9的ASCII码为4639H。代码如下:
org $0070
Hex_Byte ds.b 1
Result ds.b 2
org $0870
ASCII_Table dc.b ‘0123456789ABCDEFG‘
Hex_To_Ascii:
clra
clrx
clrh
lda Hex_Byte
and #$f0
nsa ;作用是:将寄存器a中的高4为与低4位交换:即(A[3:0]:A[7:4])-->A
tax ;A-->X
clrh ;00H-->H,查表时使用的寻址使用H:X中的值
lda ASCII_Table,x ;查表
sta Result
lda Hex_Byte
and #$0f
tax
lda ASCII_Table,x
sta Result+1
rts
main:
clra
clrx
clrh
mov #4AH,Hex_Byte
bsr Hex_To_Ascii
again:
nop
jmp again
org $fffe
dc.w main
请时刻记住MC9S08AW60使用的是大端方式:低地址存放最高有效字节。这就是为什么高4位的ASCII码存放入Result中,二低4位的ASCII码存放入Result+1中。查表时是这样执行的:lda ASCII_Table,x ;查表 可以理解为:找到表中的第x位并放入A中。
我们再来试试查立方表:设字节变量Num存放在RAM的$0070单元,取值范围为0T~9T,编写查表子程序,查出变量的立方值,并存入Res_Cube字节变量中。代码如下:
org $0070
Num ds.b 1
Res_Cube ds.b 2
org $1860
Cube_Tab: dc.w 0000,0001,0008,0027,0064,0125,0216,0343,0512,0729
Cube:
clra
clrx
clrh
ldx Num ;Num-->X
lslx ;X*2-->X
clrh ;查表使用H:X中的值寻址,所以不要忘记清零
lda Cube_Tab,x ;查表得立方值高位
sta Res_Cube ;大端方式:低地址存放最高有效字节
lda Cube_Tab+1,x ;查表得立方值地位
sta Res_Cube+1
rts
main:
clra
clrx
clrh
mov #$09,Num
bsr Cube
again:
nop
jmp again
org $fffe
dc.w main
分析:由于9的立方值为729T=2D9H,故表中的每一个立方值需用2B来存储,则数值Num的立方值的存储地址Addr_n和立方表的首地址Cube_Tab的关系为:Addr_n=Cube_Tab+Num*2。
查表技术是汇编语言程序设计的一个重要技术,通过查表可避免复杂的计算和编程,如查平方表、立方表、函数表、数码管显示的段码表等。表格常数一定要定位到flash区域才能正确实现查表功能,不能将其定位到RAM区域;此外要注意清零H寄存器。
标签:
原文地址:http://www.cnblogs.com/daviddolphin/p/4469596.html