Freescale MC9S08AW60汇编学习笔记(五)

  前面学习了查表的功能,可以用查表的功能实现不少强大的功能,如查立方表、平方表、函数表、数码管显示的段码表等。这里还有一种由查表和转移指令配合使用而实现的一种强大的功能:散转。散转是指根据输入数据的不同来跳转到不同的程序入口进行处理,也就是说如果有多个子程序,我们不仅可以让它们按顺序一个个执行,还可以根据做判断用的数据的值来决定跳转到哪一个子程序。实现散转的具体做法是:在程序中定义一块连续存储单元作为跳转表,表中顺序存放各分支处理程序的跳转地址。各跳转地址在表中的偏移地址等于跳转表首地址加上它们各自的序号所占字节数的乘积。感觉关于跳转地址这一块有点不好理解,就用一个例子来说明一下:

  设字节变量Num的取值范围为0~3,另有程序入口地址Pro0~Pro3,编写子程序,要求根据Num的值转向不同的Pro程序。如Num为2则转向Pro2。代码如下:

org $0070
Num ds.b 1

org $1860

Pro0:nop                    ;子程序群,这里都让他们空操作。
   rts
Pro1:nop
   rts
Pro2:nop
   rts
Pro3:nop
   rts

Sbranch:                   ;分支程序,有点像c语言中switch
  ldx Num              ;Num-->X
  lda #05h        
  mul                     ;Num*5-->X:A
  tax                      ;A-->X  
  clrh                     ;查表之前别忘清零
  jmp Pro_Tab,x

Pro_Tab:                   ;跳转表
  jsr Pro0               ;跳转到Pro0,3B
  bra Sb_End          ;调用Pro0完毕,返回,2B

  jsr Pro1
  bra Sb_End

  jsr Pro2
  bra Sb_End

  jsr Pro3
Sb_End: rts

main:
  clra
  clrx
  clrh

  mov #$01,Num     ;设定Num的值,用来作为选择子程序的判断数

  bsr Sbranch

again:
  nop
  jmp again

org $fffe
 dc.w main

  细心的人肯定会发现Num是先乘以5之后才用来做散转的,其原因在于Pro_Tab标号后面的JSR指令是3字节指令,BRA指令值2字节指令,故数值Num、标号Pro_Tab的地址Addr_Pro和指令语句JSR  Pro_n的首地址Addr_Pro_n之间的关系为:

                         Address_Pro_n=Addr_Pro+Num*5

  是不是突然发现汇编的强大了,从一开始汇编给人的感觉是在寄存器之间跳来跳去变成了汇编可以实现这个功能那个功能,只要设计足够精巧、心思足够细腻,就算是汇编这种呆板的机器语言也可以焕发勃勃生机,举个例子:MenuetOS是一款完全用汇编语言写成的操作系统。 因此它运行起来超快,体积也非常小,它甚至可以放在一张软盘内。MenuetOS提供了抢占式多任务处理,一个引人注目的漂亮GUI,用于网络接入的 TCP/IP堆栈等等。由此可见:强大的不是工具而是人。当然,如果强大的工具加强大的人必然可以爆发出惊人的力量。

时间: 2024-08-11 05:43:09

Freescale MC9S08AW60汇编学习笔记(五)的相关文章

Freescale MC9S08AW60汇编学习笔记(整理)

MC9S08AW60是HCS08系列的MCU,它是8位的MCU,由HCS08核加上存储器和外围模块构成.HCS08系列的MCU除了MC9S08AW系列之外还有MC9S08GB系列.MC9S08GT系列.MC9S08AC系列等.不同型号的MCU应用领域的侧重点不同. HCS08系列的MCU就只有5个寄存器:A.H:X.SP.PC.CCR.分别是8位.16位.16位.16位.8位.具体功能要在使用中掌握.MC9S08AW60的主频为4MHz,一个总线周期为T=0.25us.MC9S08AW60存放数

Freescale MC9S08AW60汇编学习笔记(八)

能够实现用七段led数码管显示出数字和字母.让它们同时显示甚至于滚动显示,这些功能已经很不错了,但是这样还不够,我们还想实现更准确的控制,让数码管按照我们的想法来显示,而不是呆板的循环,这样我们引入中断的想法.也许其他人会从查询和中断的关系这些地方来引出中断,但是我还是倾向于从控制的观点来引出中断,毕竟中断也是实现更直观的人为控制的方法,程序的运行变得可以加入人的意愿来执行,如果我们要让程序进入某一个中断程序,那么给主程序发一个中断,让它跳到中断子程序中运行就行了:我们不发中断,中断子程序就不会

Freescale MC9S08AW60汇编学习笔记(四)

面对复杂的程序,我们不能都放入main主程序之中,那样会让人思路不够清晰,于是我们加入了子程序,这样程序就有了条理.主程序决定我们的思路,子程序则实现具体的功能.如果程序没有达到预想中的效果,就可以有条有理的进行分析,这在编写汇编程序时是很重要的,毕竟汇编语言不像c语言.c++.java等高级语言贴近人类语言.汇编语言的优势在于执行效率,可以用于程序的优化.为了让程序更加强大,我们给程序加入查表的功能,利用查表可以实现转换.计算等各种功能. 例子:将单字节变量Hex_Byte中存放的十六进制数转

Freescale MC9S08AW60汇编学习笔记(七)

之前我们写了延时的子程序,但是仅仅在电脑上运行,在CodeWarrior中调试根本给不了延时所实现的直观效果,也就是说程序运行到哪里但我们却无法直观地得出发生了延时的效果,所以我们要把这个延时的程序用出去,比如点亮一盏led灯,让它延时我们规定的时间后熄灭,然后再点亮再熄灭......这里我们使用清华版的MC9S08AW60开发板来验证延时的效果.对于开发板的使用和烧写请多看看数据手册和使用说明.我们直接给出验证延时的代码: org $0070num ds.b 1count1 ds.b 1cou

Freescale MC9S08AW60汇编学习笔记(六)

延时,汇编中经常要用到的功能,也就是MCU什么也不做,仅仅是拖延一段时间而已.MCU本身就有定时器.计数器,用来实现延时当然不在话下,但是一个编程的人自然更希望要实现的功能更加易于掌控,我们就用代码.用程序来实现延时,也就是采用软件进行延时.具体做法是:通过A.H:X增减指令.空操作指令nop和brn以及相应的转移指令,再利用循环结构就可以实现延时功能.既然是延时,能知道延时多长时间最好了,我们知道的是:MCU总线时钟频率为4MHz,所以一个总线周期占用的时间为0.25us,这样,只要知道每条指

Freescale MC9S08AW60汇编学习笔记(三)

前面给出了一个实现加法的小程序,但是如果要求变得更复杂.步骤变得更繁琐,这时又该怎么办呢??我们可以使用子程序来解决这个问题,这里给个例子:若字变量Data1和Data2分别存放着两个16位无符号数,编写求两个数之和的子程序,并将和存放到Sum字节存储空间中.代码如下: org $0070data1 ds.b 2data2 ds.b 2sum ds.b 3 org $1860Add_Pro: clc        ;清空进位标志位 clrx clrh clra mov #$00,data1 mo

Freescale MC9S08AW60汇编学习笔记(一)

MC9S08AW60是HCS08系列的MCU,它是8位的MCU,由HCS08核加上存储器和外围模块构成.HCS08系列的MCU除了MC9S08AW系列之外还有MC9S08GB系列.MC9S08GT系列.MC9S08AC系列等.不同型号的MCU应用领域的侧重点不同. HCS08系列的MCU就只有5个寄存器:A.H:X.SP.PC.CCR.分别是8位.16位.16位.16位.8位.具体功能要在使用中掌握.MC9S08AW60的主频为4MHz,一个总线周期为T=0.25us.MC9S08AW60存放数

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

AT&amp;T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母. (2)在AT&T格式中,寄存器名要加上"%"作为前缀,而在intel格式中则不带前缀. (3)在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反.在intel格式中是目标在前,源在后:而在AT&T格式中则是源在前,目标在后.例如,将寄存器eax的内容送入ebx,在intel格式中为&