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

  设字节变量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堆栈等等。由此可见:强大的不是工具而是人。当然,如果强大的工具加强大的人必然可以爆发出惊人的力量。

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

Freescale MC9S08AW60汇编学习笔记(五)相关推荐

  1. Freescale MC9S08AW60汇编学习笔记(三)

    前面给出了一个实现加法的小程序,但是如果要求变得更复杂.步骤变得更繁琐,这时又该怎么办呢??我们可以使用子程序来解决这个问题,这里给个例子:若字变量Data1和Data2分别存放着两个16位无符号数, ...

  2. 哈工大操作系统学习笔记五——内核级线程实现

    哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...

  3. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  4. Ethernet/IP 学习笔记五

    Ethernet/IP 学习笔记五 Accessing data within a device using a non-time critical message (an explicit mess ...

  5. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  6. 吴恩达《机器学习》学习笔记五——逻辑回归

    吴恩达<机器学习>学习笔记五--逻辑回归 一. 分类(classification) 1.定义 2.阈值 二. 逻辑(logistic)回归假设函数 1.假设的表达式 2.假设表达式的意义 ...

  7. 好程序员教程分析Vue学习笔记五

    好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...

  8. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  9. ROS学习笔记五:理解ROS topics

    ROS学习笔记五:理解ROS topics 本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具. 例子展示 roscore 首先运行roscore系列服务,这是使用R ...

最新文章

  1. 【MediaPipe】(1) AI视觉,手部关键点实时跟踪,附python完整代码
  2. java swing控件大全_java swing 组件大全(新手快进)
  3. android ndk 编译c++11,Android NDK的C++11标准支持
  4. ace unlck工具下载_压缩工具:WinRAR 曝出代码执行漏洞,该升级了
  5. Android 触摸手势基础 官方文档概览
  6. python简易_Python简易爬虫
  7. 前端一些注意点 2021-05-26
  8. Redis基本数据类型、应用场景、操作指令
  9. 蓝桥杯真题:等差素数列
  10. 三种隐藏 HTML 元素的方式
  11. 瞬时功率与有功功率计算公式
  12. vue第四天笔记02——axios请求
  13. 爱是什么——读弗洛姆《爱的艺术》的读后感作文3000字
  14. surrogate function
  15. Android系统日历读取各厂商农历年重复event
  16. boostrap插件
  17. 公路安全设施和交通秩序管理精细化提升行动方案(宣贯培训资料)(附下载)...
  18. 国内的程序员(软件工程师)这一职业,是吃青春饭的吗?
  19. 5.4版本内核ufs设备信息查询方式
  20. word-解决复制相同的word内容,显示行间距差别大的原因

热门文章

  1. Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词
  2. poj_2349 Kruskal 最小生成树
  3. $.post $.getScript
  4. FireBug命令行命令介绍
  5. 播放生成Android4.0.3中的提示音
  6. 2.5.1 MySQL数据库备份恢复基础讲解
  7. 第34 memcached缓存
  8. java 微信请求_Java web微信请求拦截器(微信公众号开发)
  9. 春风吹用计算机的谱子,方大同《春风吹》简谱
  10. 进程调度之最短作业优先