在keil中debug分析单片机数据和函数调用过程(c51为例),使用寄存器组导致错误原因分析

寄存器参考
参考2

寄存器组使用using参考\](https://blog.csdn.net/weixin_46720928/article/details/110221835) ## keil中的using关键字参考 官方文档里关于using的说明可参阅2个地方,(1)keil软件菜单栏-\>Help-\>uVision Heip,打开帮助文件,然后依次展开Ax51 Assembler User Guide -\> Control Statement -\> Reference -\> USING,(2)帮助文件依次展开CX51 Compiler User's Guide-\> Language Extensions -\> Function Declarations -\> Register Banks ## C51单片机有关概念 ### PSW:(8个bit位)程序状态寄存器(下面汇编语言中就是对这个寄存器设置后使用不同寄存器器组),下面是修改使用寄存器组用到的位 ![在这里插入图片描述](https://file.jishuzhan.net/article/1716744116290719746/5d2306dbe6b70c699dc0de7e0956d6e4.webp) ### 寄存器组 从上面的图片可以知道,有**4组寄存器** 。**每组寄存器中都有R0到R7,共8个字节**。以第0组寄存器为例,地址是00h-07h。 #### 程序寄存器组中的数据使用 (下面的程序实例中也有)从汇编中可以看出,**寄存器组** 中**只是存储了运算的数据** ,而调用的**执行命令** 是在**存储命令的(code)内存**中。存一个字节的数据使用一个寄存器组中的一个 ## 汇编常用命令 参考:https://blog.csdn.net/zcx515545/article/details/26152169 MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1;DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; RET(Return from subroutine)子程序返回; LCALL(Long subroutine Call)子程序长调用; NOP (No Operation) 空操作; ## 整体c语言代码 ```c #include #include int result; void add_two(int a,int b,int c) using 1 { result = a+b+c; } void add_one(int a,int b) using 1 { add_two(a,b,9); } void main() { add_one(1,2); printf("result:%d",result); //执行结果是9 } ``` ## 整体程序执行过程 ![在这里插入图片描述](https://file.jishuzhan.net/article/1716744116290719746/92b16775b40457b435cb59cf0b193b01.webp) ## 从汇编语言分析数据变换 ![在这里插入图片描述](https://file.jishuzhan.net/article/1716744116290719746/4dd307a90e15135582a7e9f91c6c6478.webp) ## 总结认知 导致计算错误的主要原因是上图中的绿线连接的部分:实际的数据存储和计算过程中并不是指向同一个地址的数据。上图中程序中函数add_one使用的1,2都是在寄存器组0中的**R7,R6,R5,R4** 中(由于定义int需要使用2字节存储)。而在计算加的时候是指定了寄存器组1中的**R7,R6,R5,R4**,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。

相关推荐
机器视觉知识推荐、就业指导12 小时前
STC89C52系列单片机简介
单片机·嵌入式硬件·51单片机
沧海一笑-dj13 小时前
【嵌入式】51单片机学习笔记-Keil5软件安装教程
51单片机·嵌入式·keil·keil5·51·keil安装·keil5软件
1+2单片机电子设计14 小时前
STM32 单片机的停车场管理系统设计与实现
stm32·单片机·嵌入式硬件·51单片机
机器视觉知识推荐、就业指导1 天前
51单片机基础知识讲解
嵌入式硬件·mongodb·51单片机
WD137298015571 天前
WD5018 同步整流降压转换器核心特性与应用,电压12V降5V,2A电流输出
stm32·单片机·嵌入式硬件·51单片机
学不动CV了2 天前
基于按键开源MultiButton框架深入理解代码框架(一)(指针的深入理解与应用)
c语言·arm开发·stm32·单片机·开源·51单片机
薄情书生3 天前
基于51单片机的贪吃蛇游戏Protues仿真设计
c语言·嵌入式硬件·51单片机·protues
学不动CV了5 天前
ARM单片机OTA解析(一)
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
F133168929577 天前
WD0407 40V 7A 超级肖特基二极管,应用于开关汽车工业控制
stm32·单片机·嵌入式硬件·汽车·51单片机