Freescale MC9S08AW60汇编学习笔记(四)

  面对复杂的程序,我们不能都放入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寄存器。

转载于:https://www.cnblogs.com/daviddolphin/p/4469596.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值