12 汇编语言程序设计(3)-查表与散转程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TBJ3 TBJ3+1 TBJ3+2 PRG0-TBJ3 PRG1-TBJ3 PRG2-TBJ3
TBJ3+3
TBJ3+4 TBJ3+5
PRG3-TBJ3
PRG4-TBJ3 PRG5-TBJ3
使用这种方法,转移表的大小加上各个处理程序长度必须 小于256个字节。
使用转向地址表的散转程序
MOV DPTR, #TBL4 MOV A, R2 ADD A, R2 JNC NADD INC DPH NADD:MOV R3, A ;保存2×R2 MOVC A, @A+DPTR XCH A, R3 INC A MOVC A, @A+DPTR MOV DPL, A MOV DPH, R3 CLR A JMP @A+DPTR TBL4: DW PRG0 DW PRG1 DW PRG2 DW PRG3 TBJ4 TBJ4+1 PRG0H PRG0L
; DPTR←表首地址
MOV A, R3 ;(R2R3) ← (R2R3) ×2 CLR C RLC A MOV R3, A XCH A, R2 RLC A XCH R2, A ADD A, DPL ;(DPTR) ← (R2R3) +(DPTR) MOV DPL, A MOV A, DPH ADDC A, R2 MOV DPH, A
以PC为指针查表程序
[例4-10]已知R0低4位有一个十六进制数(0~F中的一个),请编 写能把它转换成相应ASCII码并送入R0的程序。
ORG 0100H MOV A, R0 ANL A, #0FH CJNE A, #10, Next1 SJMP Next2 Next1: JNC Next2 ADD A, #30H SJMP Done Next2: ADD A, #37H Done: MOV R0, A SJMP $ END ORG 0100H MOV A,R0 ANL A,# 0FH ADD A,# 03H MOVC A,@A+PC MOV R0, A SIMP $ ASCTAB: DB ‘0’ , ‘ 1’ , ‘ 2’ , ‘3’ DB ‘4’ , ‘ 5’ , ‘ 6’ , ‘7’ DB ‘8’ , ‘ 9’ , ‘ A’, ‘B’ DB ‘C’,‘D’,‘E’,
MOVC A, @A+DPTR 查表前 数据表格表头地址存入DPTR 所查数据送入累加器A 最后MOVC A,@A+DPTR完成查表 因为DPTR可以人为修改,可在64KB内 查表。 MOVC A, @A+PC 分为三步: 1)所查数据送入累加器A 2)使用ADD A,#data指令对累加器A 进行修正,data值等于查表指令和数据 表格之间的字节数,即 PC当前值+data=数据表头地址 3)用指令MOVC A , @A+PC完成查表 由于PC指针只能在A中提供的偏移地址 的范围内查表,故查表范围在一页内。
[例4-9]求函数Y=X!(X=0,1,…,7)的值。设自变量存放在ABC单元,表 头地址为TABL,Y值为双字节存放在寄存器R2R3中,R3存放Y值低字节, 写出查表程序。
ORG EQU MOV ADD MOV ADD MOVC XCH ADD MOVC MOV SIMP DB DB END 2000H 30H A, ABC ;取待转换值 A, ABC R3, A A, # 07H ;计算偏移量 A, @A+PC ;查低字节 A, R3 A, # 04H ;计算偏移量 A, @A+PC ;查高字节 R2, A ;存结果 $ 01, 00, 01, 00, 02, 00, 06, 00 24H, 00, 20H, 01, 20H, 07, 40H, 50H
由于使用了AJMP指令,要求 所有的处理程序入口和散转表 都必须在同一2kB范围内。
使用地址偏移量表的散转程序
MOV A, R2 MOV DPTR, #TBJ3 MOVC A, @A+DPTR JMP @A+DPTR TBJ3: DB PRG0-TBJ3 DB PRG1-TBJ3 DB PRG2-TBJ3 DB PRG3-TBJ3 DB PRG4-TBJ3 DB PRG5-TBJ3
ABC L1:
Βιβλιοθήκη BaiduTABL:
以DPTR为指针查表程序
[例4-11]温控系统中,检测的电压与温度成非线性关系,为此要作线 性化补偿。测得的电压已由A/D转换为10位二进制数。根据实验测得 数据构成一个表,表中存放温度值Y为输出,采样电压值X为输入, X放在R2、R3中。用程序把它转换成线性温度值,仍存放在R2R3中。 LTB2: MOV DPTR, #TAB2
CLR A MOVC A, @A+DPTR MOV R2, A CLR A INC DPTR MOVC A, @A+DPTR MOV R3, A RET TAB2: DW ...… ;高8位在前 …… END
表格长度超过256个字节时,必须使用 “MOV A, @A+DPTR”指令,并且需要对 DPH、DPL进行运算处理,求出表目地址。
TBJ4+2
TBJ4+3 TBJ4+4 TBJ4+5 TBJ4+6 TBJ4+7
PRG1H
PRG1L PRG2H PRG2L PRG3H PRG3L
使用这种方法可以实现64kB范围内的转移,但散 转数n应小于256。如n>256则应采用双字节加法运 算来修改DPTR。
4.2.5 散转程序设计
散转程序为分支程序的一种,是根据某种输入或运算 的结果,分别转向各个处理程序。根据指示处理程序 入口方式的不同分为:
• 转移指令表 • 地址偏移量表 • 转向地址表
例:根据R2内容转向各处理程序。
使用转移指令表的散转程序
ORG 0000H Main:MOV DPTR, #TBJ1 MOV A,R2 ADD A,R2 JNC NADD INC DPH NADD:JMP @A+DPTR TBJ1:AJMP PRG0 AJMP PRG1 AJMP PRG2 AJMP PRG3 SJMP $ PRG0:MOV SJMP PRG1:MOV SJMP PRG2:MOV SJMP PRG3:MOV Halt: SJMP END A, #0 Halt A, #1 Halt A, #2 Halt A, #3 $
4.2 MCS-51 单片机汇编语言程序设计
4.2.1 简单程序设计
4.2.2 分支程序设计
4.2.3 循环程序设计
4.2.4 查表程序设计
4.2.5 散转程序设计 4.2.6 子程序设计 4.2.7 运算程序设计
4.2.4 查表程序设计
查表程序实现查表算法。该方法把事先计算或实验数据按一定顺序编成表 格,存在程序存储器内,然后根据输入参数值,从表中取得结果。查表程 序可完成数据补偿、计算和转换等功能。
TBJ3+3
TBJ3+4 TBJ3+5
PRG3-TBJ3
PRG4-TBJ3 PRG5-TBJ3
使用这种方法,转移表的大小加上各个处理程序长度必须 小于256个字节。
使用转向地址表的散转程序
MOV DPTR, #TBL4 MOV A, R2 ADD A, R2 JNC NADD INC DPH NADD:MOV R3, A ;保存2×R2 MOVC A, @A+DPTR XCH A, R3 INC A MOVC A, @A+DPTR MOV DPL, A MOV DPH, R3 CLR A JMP @A+DPTR TBL4: DW PRG0 DW PRG1 DW PRG2 DW PRG3 TBJ4 TBJ4+1 PRG0H PRG0L
; DPTR←表首地址
MOV A, R3 ;(R2R3) ← (R2R3) ×2 CLR C RLC A MOV R3, A XCH A, R2 RLC A XCH R2, A ADD A, DPL ;(DPTR) ← (R2R3) +(DPTR) MOV DPL, A MOV A, DPH ADDC A, R2 MOV DPH, A
以PC为指针查表程序
[例4-10]已知R0低4位有一个十六进制数(0~F中的一个),请编 写能把它转换成相应ASCII码并送入R0的程序。
ORG 0100H MOV A, R0 ANL A, #0FH CJNE A, #10, Next1 SJMP Next2 Next1: JNC Next2 ADD A, #30H SJMP Done Next2: ADD A, #37H Done: MOV R0, A SJMP $ END ORG 0100H MOV A,R0 ANL A,# 0FH ADD A,# 03H MOVC A,@A+PC MOV R0, A SIMP $ ASCTAB: DB ‘0’ , ‘ 1’ , ‘ 2’ , ‘3’ DB ‘4’ , ‘ 5’ , ‘ 6’ , ‘7’ DB ‘8’ , ‘ 9’ , ‘ A’, ‘B’ DB ‘C’,‘D’,‘E’,
MOVC A, @A+DPTR 查表前 数据表格表头地址存入DPTR 所查数据送入累加器A 最后MOVC A,@A+DPTR完成查表 因为DPTR可以人为修改,可在64KB内 查表。 MOVC A, @A+PC 分为三步: 1)所查数据送入累加器A 2)使用ADD A,#data指令对累加器A 进行修正,data值等于查表指令和数据 表格之间的字节数,即 PC当前值+data=数据表头地址 3)用指令MOVC A , @A+PC完成查表 由于PC指针只能在A中提供的偏移地址 的范围内查表,故查表范围在一页内。
[例4-9]求函数Y=X!(X=0,1,…,7)的值。设自变量存放在ABC单元,表 头地址为TABL,Y值为双字节存放在寄存器R2R3中,R3存放Y值低字节, 写出查表程序。
ORG EQU MOV ADD MOV ADD MOVC XCH ADD MOVC MOV SIMP DB DB END 2000H 30H A, ABC ;取待转换值 A, ABC R3, A A, # 07H ;计算偏移量 A, @A+PC ;查低字节 A, R3 A, # 04H ;计算偏移量 A, @A+PC ;查高字节 R2, A ;存结果 $ 01, 00, 01, 00, 02, 00, 06, 00 24H, 00, 20H, 01, 20H, 07, 40H, 50H
由于使用了AJMP指令,要求 所有的处理程序入口和散转表 都必须在同一2kB范围内。
使用地址偏移量表的散转程序
MOV A, R2 MOV DPTR, #TBJ3 MOVC A, @A+DPTR JMP @A+DPTR TBJ3: DB PRG0-TBJ3 DB PRG1-TBJ3 DB PRG2-TBJ3 DB PRG3-TBJ3 DB PRG4-TBJ3 DB PRG5-TBJ3
ABC L1:
Βιβλιοθήκη BaiduTABL:
以DPTR为指针查表程序
[例4-11]温控系统中,检测的电压与温度成非线性关系,为此要作线 性化补偿。测得的电压已由A/D转换为10位二进制数。根据实验测得 数据构成一个表,表中存放温度值Y为输出,采样电压值X为输入, X放在R2、R3中。用程序把它转换成线性温度值,仍存放在R2R3中。 LTB2: MOV DPTR, #TAB2
CLR A MOVC A, @A+DPTR MOV R2, A CLR A INC DPTR MOVC A, @A+DPTR MOV R3, A RET TAB2: DW ...… ;高8位在前 …… END
表格长度超过256个字节时,必须使用 “MOV A, @A+DPTR”指令,并且需要对 DPH、DPL进行运算处理,求出表目地址。
TBJ4+2
TBJ4+3 TBJ4+4 TBJ4+5 TBJ4+6 TBJ4+7
PRG1H
PRG1L PRG2H PRG2L PRG3H PRG3L
使用这种方法可以实现64kB范围内的转移,但散 转数n应小于256。如n>256则应采用双字节加法运 算来修改DPTR。
4.2.5 散转程序设计
散转程序为分支程序的一种,是根据某种输入或运算 的结果,分别转向各个处理程序。根据指示处理程序 入口方式的不同分为:
• 转移指令表 • 地址偏移量表 • 转向地址表
例:根据R2内容转向各处理程序。
使用转移指令表的散转程序
ORG 0000H Main:MOV DPTR, #TBJ1 MOV A,R2 ADD A,R2 JNC NADD INC DPH NADD:JMP @A+DPTR TBJ1:AJMP PRG0 AJMP PRG1 AJMP PRG2 AJMP PRG3 SJMP $ PRG0:MOV SJMP PRG1:MOV SJMP PRG2:MOV SJMP PRG3:MOV Halt: SJMP END A, #0 Halt A, #1 Halt A, #2 Halt A, #3 $
4.2 MCS-51 单片机汇编语言程序设计
4.2.1 简单程序设计
4.2.2 分支程序设计
4.2.3 循环程序设计
4.2.4 查表程序设计
4.2.5 散转程序设计 4.2.6 子程序设计 4.2.7 运算程序设计
4.2.4 查表程序设计
查表程序实现查表算法。该方法把事先计算或实验数据按一定顺序编成表 格,存在程序存储器内,然后根据输入参数值,从表中取得结果。查表程 序可完成数据补偿、计算和转换等功能。