请教一道单片机教材上的例题

来源:百度知道 编辑:UC知道 时间:2024/05/26 17:36:08
单片机原理与应用 教材书P44上有这样一道例题:
以查表方法把累加器A中的十六进制数转换为ASSCII码,并送回累加器A中。其查表程序如下:
(1)采用“MOVC A,@A+DPTR”指令
2000 MOV DPTR, #TAB ;表的首地址作为基址
2001 MOVC A, @A+DPTR ;查表
2002 RET
2003 TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,
38H,39H
DB 41H,42H,43H,44H,45H,46H
(2)采用“MOVC A,@A+PC”指令
2000 INC A ;由于表格跳过RET指令
2001 MOVC A, @A+PC ;查表
2002 RET
2003 TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,
38H,39H
DB 41H,42H,43H,44H,45H,46H

我是初学的,对于这个例题有几个疑问
1. 指令前面的2000-2003是指指令的地址吗?可以换成2005-2008吗?或者是其他的连续的地址,也就是说,这些指令前面的数字是可以由用户自己设定的地址吗?
2. 2000 MOV DPTR, #TAB ;表的首地址作为基址
对于这条指令,#TAB是指表的首地址,那么TAB可以换成其他的字符串吗?就是说可以由用户自己任意定义吗?比如换成TABLE1,同时把后面的TAB也改成TABLE1,这样可以吗?还是TAB是指令系统中固有的?

1 可以的 不过不要有冲突,它是 程序指针IP所指向的地址单元

2 可以 TAB 只是名字,具体的 是地址 是一种替换 相当于 C语言里面的定义的一个数组 a[] 定义成b[]也可以

3 DB 定义的是数据 值可以不连续 但是这种写法 地址是连续的,也就是IP指针的变化是连续的

4 你会C语言或C++吗 查表就相当于一个数组或者指针 a[i] 当i变的时候,就能够得到对应的值 道理是一样的 那个IP就相当于a[0] 而 寄存器A相当于i