51内核汇编学习-01

目的:看懂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, #datadata -> 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内核汇编的学习可以停留在了解即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值