目的:看懂51内核的汇编代码,不要求会写,能读懂即可
学习方法:通过编写基本的C语言代码-keil编译-汇编,对照C语言和汇编程序,学习汇编里面的语句并且理解它,而不是直接看一系列的汇编视频或者书籍,而是采取积累的方式慢慢学习,因为对于汇编的要求就是限于阅读,而不是书写,平时使用的基本都是C语言
为什么学习?:当程序出现问题的时候,有时候是逻辑问题(相信现在你的基础足够好,基本的语法不会犯错),逻辑问题可以推理解决,但是还有一种问题最难发现,那就是程序的走向或者生成的指令与你的写法不一致(造成这种原因可能是编译器的优化问题或者其他)导致生成的指令与你对应的C语言代码所表示的意思不同,此时你就需要学会阅读汇编代码,理解你程序生成的指令是否与你的相同。学习C51汇编,也是为了之后的ARM汇编打好基础
需要的基础:了解一定的C51和汇编基础
keil的芯片选择。资源8K-ROM 512-RAM
注意事项:由于我们的目的是学习汇编,因此keil软件中的优化等级为0,防止有些语句无法断点或者无法生成汇编语句
在调试的时候把鼠标放在变量上会出现如上图所示,i(D:0X0C) = 0X00,表示的意思就是RAM地址的0X0C的值为0x00,
8K-ROM 512-RAM --- 可以得出RAM和ROM的地址范围
RAM -- 0 - 0X200 ROM -- 0 - 0X2000 (十进制转换为十六进制)
D:表示的就是RAM(片内),也有片外的,至少我现在还没有玩过片外的,因为RAM足够了,X是RAM(片外)
所以上面的黄色部分其实就是ROM代码存储空间的地址,因为我们代码是储存在ROM的
这里就涉及到了CPU是如何工作的原理了,如果不懂建议独自阅读去
汇编代码研究部分
一、片内RAM数据转移指令 MOV
C:0X002D---ROM地址 750C02--数字码 (其实就是指令放在ROM的,CPU取)
MOV 0X0C,#0X02 -- 表示将数据0x02转移至RAM的0X0C中,其实对应的地址就是i的地址
MOV direct, #data data -> direct 目的:把源操作数所指定的内容送入由直接地址direct所指出的内存单元
此代码与之前的是一样的,但是由于51单片机是8位的,而int需要使用2个字节,因此需要使用两个地址来保存sum这个变量,地址为0x0D和0x0E,连续空间
其实这里可以根据汇编研究大小端问题
278-二进制( 0000 0001 0001 0110)
而地址表示的是:我们先从高-低--0001 0110 0000 0001
低-高 0000 0001 0001 0110
因此是低地址存储高位数据,高位地址存储低位数据 --大端存储
KEIL的调试结果,可以看出连续的地址0X0C-0X0D-0X0E分别的值
MOV Rn, direct --把地址的数据保存在Rn中
RLC和SUBB得结果是为了看是否进位,把进位得结果放在A-R6,此时R6-为0.把0X09+A得值放在了0X0E(0X0E是低位,高地址)
总结:
本章节只是一个引子,是为了提醒你在开发的过程中,假如出现了问题,并且排除了硬件问题以及软件逻辑问题,那么你就可以开始分析汇编代码了,因为编译器会优化代码,导致你所想的软件逻辑问题与实际编译器所想的会有所不一样,此时你就需要使用汇编的知识去理解程序走向了。汇编代码的学习初期使用的很少,因为你开发的时候很少会遇到这种问题(我也只遇到过一次),因此对于51内核汇编的学习可以停留在了解即可