在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,这当然会出现错误。切换使用寄存器的时候一定注意数据的传递情况,否则很可能出现错误。

相关推荐
海的预约4 小时前
51单片机-按键
单片机·嵌入式硬件·51单片机
海的预约1 天前
51单片机-定时器中断
stm32·单片机·51单片机
曾浩轩2 天前
51单片机学习之旅——在LCD1602上显示时钟
嵌入式硬件·学习·51单片机
曾浩轩2 天前
51单片机学习之旅——定时器
嵌入式硬件·学习·51单片机
新晨单片机设计5 天前
【097】基于51单片机排队叫号系统【Keil程序+报告+原理图】
单片机·嵌入式硬件·51单片机·ad原理图
fengyuzhe135 天前
STC 51单片机63——关于STC8H的ADC通道切换问题
单片机·嵌入式硬件·51单片机
悠闲漫步者7 天前
江科大51单片机学习笔记(2)
笔记·学习·51单片机
零下273°11 天前
51单片机蜂鸣器铃声代码
单片机·嵌入式硬件·51单片机
爱吃奶酪的松鼠丶11 天前
51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤
嵌入式硬件·51单片机·接口隔离原则
杜子不疼.11 天前
在CT107D单片机综合训练平台上实现外部中断控制LED闪烁
c语言·51单片机