单片机汇编语言偏移量计算

ORG 00H
MOV R2,#0AH
TB3: MOV A,R2
ADD A,R2
MOV R3,A
ADD A,#6
MOVC A,@A+PC
XCH A,R3
ADD A,#3
MOVC A,@A+PC
MOV R4,A
RET
TAB3:DW 1520,3721,42645,7580
DW 3483,32657,883,9943
DW 10000,40511,6758,8931
DW 4468,5871,13284,27808
我的解法:
地址
Y3Y2Y10 ADD A,#6
Y3Y2Y12 MOVC A,@A+PC
3 XCH A,R3
4 ADD A,#3
6 MOVC A,@A+PC
7 MOV R4,A
8 RET
9 TAB3:DW 1520,3721,42645,7580
9-2-1=6 ADD A,#6 9-6-1=2 那这个ADD A,#3是怎么得到的?
另一个问题
ADD A,#16 ;
MOVC A, @A+PC ;查表低4位转换为ASCⅡ码
MOV @R1,A ;送结果
INC R1 ;修改指针
MOV A,@R0 ;从新取16进制数
SWAP A ;高4位与低4位互换
ANL A,#0FH ;取高4位
ADD A,#7
MOVC A,@A+PC ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE:DB’012345678’
DB’9ABCDEF’
END
——————————————————————
0 ADD A,#16 ;
2 MOVC A, @A+PC ;查表低4位转换为ASCⅡ码
3 MOV @R1,A ;送结果
4 INC R1 ;修改指针
5 MOV A,@R0 ;从新取16进制数
6 SWAP A ;高4位与低4位互换
7 ANL A,#0FH ;取高4位
8 ADD A,#7
10 MOVC A,@A+PC ;查表高4位转换为ASCⅡ码
11 MOV @R1,A
12 INC R0
13 INC R1
15 DJNZ R2,LOOP
16 DEC R1
17 RET
18 TABLE:DB’012345678’
18-3=15 ADD A,#16是怎么算出来的啊
18-11=7 ADD A,#7 这个没算错吧

ORG 00H
MOV R2,#0AH ;--打算从TAB3表中,查出第十个字,即:6758H
TB3: MOV A,R2
ADD A,R2 ;--A乘以2,因为,各个字,地址相差为2
MOV R3,A ;--暂存
ADD A,#6 ;--加上偏移量
MOVC A,@A+PC ;--查出第一字节,67H
XCH A,R3 ;--执行上一条查表时,PC,为此处的地址
;-------此处,和TAB3,相差6字节,故此,在前面加上了6

ADD A,#3 ; --再加一个偏移量
MOVC A,@A+PC ;--查出第二字节,58H
MOV R4,A ;--执行上一条查表时,PC,为此处的地址
;-------此处,和TAB3,相差2字节,又因为查第二字节,故此,在前面加上了3
RET

TAB3:DW 1520,3721,42645,7580
DW 3483,32657,883,9943
DW 10000,40511,6758H,8931
DW 4468,5871,13284,27808
END

计算偏移量,要用每条指令的字节数来计算。
先要写出机器码,才行。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-06
记住两点你就明白了:1、CPU执行程序时,PC指向下一条指令的首地址;
2、查表时候,PC是查表的下一条指令的首地址,只要能将其地址修正到表中对应位置就可以了。所以修正值与查表位置和表的位置有关。
第2个回答  2013-02-05
跟指令字节数有关
第3个回答  2013-02-05
很难看懂这个,查表用movc a,@a+dptr是最直接和有效的方法,何必费力用PC呢。而且这个程序显然有问题,不知所云。第一个是加的26不是16,所以第二个加的是23,。
ADD A,#6 ;这里应该加10,因为之后的指令占用10个字节
MOVC A,@A+PC
XCH A,R3
ADD A,#3 ;这好理解因为后面一个MOVC之后的两句占用3个字节
MOVC A,@A+PC
MOV R4,A
RET追问

MOV R4,A 和RET不是两个字节么

追答

是啊,但第三个字节才是表的首地址呀

单片机汇编语言偏移量计算
MOV R3,A ;--暂存ADD A,#6 ;--加上偏移量MOVC A,@A+PC ;--查出第一字节,67HXCH A,R3 ;--执行上一条查表时,PC,为此处的地址;---此处,和TAB3,相差6字节,故此,在前面加上了6ADD A,#3 ; --再加一个偏移量MOVC A,@A+PC ;--查出第二字节,58HMOV R4,A ;--执行上一条查表时,PC,为...

单片机汇编语言变址寻址?
在单片机汇编语言中,变址寻址是一种常见的寻址方式,它可以通过寄存器中的值来计算出要访问的内存地址。常见的变址寄存器有基址寄存器和偏移量寄存器。基址寄存器存储了一个基本地址,偏移量寄存器存储了一个偏移量,通过将这两个寄存器的值相加,就可以得到要访问的内存地址。例如,假设基址寄存器为BX,偏...

单片机中rel什么作用?
单片机中rel代表一个偏移量。计算机汇编语言中的偏移量是把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”。段地址左移四位,与有效地址相加,就构成了逻辑地址。一般而言,段地址是cpu自己独立编制的,但是偏移量是程序员编写的。偏移量就是程序的逻辑地址与...

单片机指令JNB字母各代表什么意思?
这是51单片机的一条汇编语言指令,其中J 代表"跳转JUMP",N代表 "非NO",B代表"位BIT";\\x0d\\x0a合起来后该语句意思是:如果某一位或某个管脚的值不是1则程序跳转,是1则顺序执行;\\x0d\\x0a通用写法是:JNB bit,rel bit是位变量,rel是跳转时的相对偏移量\\x0d\\x0a如:JNB P1...

求一MCS-51系列单片机指令表
该指令的rel是一个带符号的相对偏移量,范围为-128~+127。负数表示向后转移,正数表示向前转移。这条指令的优点是指令给出的是相对转移地址,不具体指出地址值,这样当程序地址发生变化时,只要相对地址不发生变化,该指令就不需作任何改动。在用汇编语言写程序时,rel是一个标号,由汇编程序在汇编过程中自动计算偏移地址...

单片机汇编语言解析.下面的程序不怎么懂,希望高手帮忙解析一下.谢谢...
这段 查表程序 没什么意思,要学习单片机汇编语言,先要学习单片机的指令系统,熟悉每条指令是什么意思及作用。

单片机汇编语言的几个疑问
【相对转移】剩下的转移指令都是相对转移指令,包括SJMP,它们是以当前语句的下一条语句所在地址为准,PC值向前或向后偏移数个字节地址开始执行,偏移量范围从-128到+127,以补码方式存在。比如 ORG 0100H NO1: CLR A SJMP NO1 编译后地址及机器码:0100H: 0E4H (CLR A)010...

51单片机中如何进行相对寻址?pc值怎么计算?rel又怎么给
相对寻址:先找到当前指令下一条指令的PC值,再加上相对偏移量rel,这是对机器码而言。但在汇编指令中,rel就是目的地址,执行当前指令时,直接跳到rel代表的目的地址上去。别看好多教材里胡扯,什么reli偏移量什么的,教材作者有本事把rel给成偏移量试试,看看目的地址是不是PC值加他所给定的rel值 ...

汇编语言中一下语句 [STRIN DB 'lajid451231;' COUNT EQU $-STRIN] $...
回答量:45 采纳率:100% 帮助的人:11.8万 我也去答题访问个人页 关注 展开全部 string db 'lajid451231';定义一个字符串,db指各字符是字节型。count equ $-string;定义count的值为上面所定义的字符串string的长度。$指当前偏移地址。注意,如果定义的字符串是dw型,则字符个数是count\/2,因为用$统计...

汇编语言编程单片机的问题
P1.1的地址就是91H, P1.2 对应 92H... ...这些名字都是寄存器地址,其他单片机也一样,PA,PB,PC 也是地址 要SETB PA.0 首先要看PA这个寄存器能不能够位寻址,PA.O中的"."在汇编语言中是取位运算,一般做为引脚的寄存器都是可以位寻址的.还有对于不同的单片机,指令也可能不太相同,SONIX...

相似回答