Y_G_G 发表于 2019-1-15 00:11 二级C以前学校学的,还有一点点印象了。汇编我也学。我都学。先从汇编开始。现在想把单片机搞熟了,我刚接触单片机不久。还请指教 |
zhangzhao2423 发表于 2019-1-14 22:29 汇编学个差不多就可以了,以后还是要用C多一点的 我也是一直用汇编,准备学C了 难不成你要用汇编?? |
Y_G_G 发表于 2019-1-14 19:01 师傅,能不能加我微信啊?zhangzhao2423,万分感谢,有不懂请多多指教,我们是新人,求带路 |
zhangzhao2423 发表于 2019-1-14 00:01 从“MOVC A, @A+PC”这个指令到“TAB3”之间有几条指令,每条指令占用不同的空间,你得打开8051汇编指令看这几条指令占用的空间,加在一起就是占用了6B,就是6个字节 这是一个非常应试教育的题目:一个酒杯的容积怎么计算,2B一样的老师要告诉你,酒杯的高度,直径,弧度之类,估计你还得用到微积分,说不定还算不出来。 实际上,把酒杯装满水,再称水的重量就知道容量了。 明明有更好的方法,非得叫人用PC值,以为这样就可以练习基本功什么之类的。 用PC值的缺点:你得对着8051汇编指令,慢慢找到你那条指令占用空间的大小,一条一条的加上去。这样还不行,你还要看PC加上去不是大于255了,大于255了就不行,也就是说这个查表指令是不能随便放的,你得把这指令放在前面。不然,PC值就会超过255了 用16位查表就什么都没有了 一般来说尽量少用PC值这个计算 一般来说尽量少用汇编,能用C就尽量用C |
你看看从“MOVC A, @A+PC”这语句到“TAB3”之间有几条指令(不含本语句)?这几条指令的机器码就是6个字节。 在没有给“TAB3”指定位置的情况下,程序的机器码是按先后顺序存放烧写的。 “PC”的值就是当前语句的机器码烧写在程序存储器中的地址。再加上6个字节,就到“TAB3”的首地址了。 你可以打开你的本工程目录下,经过编译产生的*.lst文件看看便知。 根据你的提问,你现在理解这些还有一定的难度,如果你真心的想学、想掌握这门技术,建议你还是扎扎实实的打好基础。 |
Y_G_G 发表于 2019-1-13 20:38 请问ADDC A,#06H它是怎么得出的啊?为什么是加6? |
ahshmj 发表于 2019-1-13 18:24 为什么说TAB3的首地址距离PC有6个字节的距离啊?是怎么求出来的啊 |
MOVC A, @A+PC 本条指令是查表指令,也叫作:“程序存储器读指令”,要读的值在“TAB3”表中。“PC”是当前(本条指令)代码在程序存储器中的位置,而TAB3表距离当前“PC”还有6个字节的距离,所以当前的“PC”值+6,才是TAB3的首字符位置。 |
因为表是DW 用两个字节来放一个数据,如果是DB就是直接计算偏移量 DW的话,是乘以2来计算的 |
MOVC A, @A+PC 本条指令是查表指令,也叫作:“程序存储器读指令”,要读的值在“TAB3”表中。“PC”是当前(本条指令)代码在程序存储器中的位置,而TAB3表距离当前“PC”还有6个字节的距离,所以当前的“PC”值+6,才是TAB3的首字符位置。 |
add a,r3 把r3里的值加到累加器a里去。 ADD A,#6 把直接数6加到累加器a里去。 和偏移量没任何关系。 |