在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位)程序状态寄存器(下面汇编语言中就是对这个寄存器设置后使用不同寄存器器组),下面是修改使用寄存器组用到的位

寄存器组

从上面的图片可以知道,有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 <reg51.h>
#include <stdio.h>


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
	}

整体程序执行过程

从汇编语言分析数据变换

总结认知

导致计算错误的主要原因是上图中的绿线连接的部分:实际的数据存储和计算过程中并不是指向同一个地址的数据。上图中程序中函数add_one使用的1,2都是在寄存器组0中的R7,R6,R5,R4 中(由于定义int需要使用2字节存储)。而在计算加的时候是指定了寄存器组1中的R7,R6,R5,R4,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。

相关推荐
kkkkkkkkkk_Z3 天前
新手自学嵌入式|学习日记:从C语言到51单片机基础(GPIO、中断、定时器与PWM篇)
linux·笔记·学习·51单片机
老当益壮梁奶奶3 天前
ARM汇编学习笔记(六):【i.MX6ULL】时钟系统与定时器(EPIT & GPT)
c语言·arm开发·嵌入式硬件·学习·51单片机
AAA代码批发商3 天前
Days 50 51 单片机与 i.MX6ULL 定时器对比:Timer、EPIT、GPT 原理与实验
51单片机·定时器·imx6ull·裸机开发
myy-learn4 天前
51单片机-外设温度计(DS18B20)知识总结
51单片机
老当益壮梁奶奶4 天前
ARM汇编学习笔记(四):i.MX6ULL裸机开发:从汇编点灯到C语言BSP工程管理
c语言·arm开发·单片机·嵌入式硬件·51单片机
myy-learn6 天前
51 单片机-串口通信
51单片机
kkkkkkkkkk_Z6 天前
单片机|学习日记:单片机底层架构与寄存器操作全解析
linux·笔记·单片机·学习·51单片机
辰域电子7 天前
STM32项目开源:智能插座控制系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·51单片机·proteus
ouynagda7 天前
DS18B20单总线温度传感器原理与51单片机驱动
51单片机
myy-learn7 天前
【51 单片机入门】点亮第一个 LED|模块化编程 led.c(完整源码 + 踩坑)
51单片机