在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语言代码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年中国汽车覆盖件模具竞争格局、市场规模及行业需求前景[图]

汽车覆盖件模具是汽车车身生产的重要工艺装备&#xff0c;其设计和制造时间约占汽车开发周期的 2/3&#xff0c;是汽车换型的重要制约因素之一。汽车覆盖件模具具有尺寸大、工作型面复杂、技术标准高等特点&#xff0c;属于技术密集型产品。汽车覆盖件模具按以其冲压的汽车覆盖…

【tg】6: MediaManager的主要功能

【tg】2:视频采集的输入和输出 的管理者是 media manager‘ media 需要 network的支持:NetworkInterface friend class MediaManager::NetworkInterfaceImpl;NetworkInterfaceImpl 直接持有 MediaManager 的指针即可:发送rtp包、rtcp包、设置socket选项?

NodeMCU ESP8266 读取按键外部输入信号详解(图文并茂)

NodeMCU ESP8266 读取按键外部输入信号教程&#xff08;图文并茂&#xff09; 文章目录 NodeMCU ESP8266 读取按键外部输入信号教程&#xff08;图文并茂&#xff09;前言按键输入常用接口pinModedigitalRead 示例代码结论 前言 ESP8266如何检测外部信号的输入&#xff0c;通常…

JVM——一些零散的概念(后续学习深入了再补充)

Native 凡是带了native关键字的&#xff0c;说明Java的作用范围的达不到了&#xff0c;需要调用底层C语言的库 调用native方法&#xff0c;会进入本地方法栈&#xff0c;调用本地接口(JNI) JNI的作用&#xff1a;扩展Java的使用&#xff0c;融合不同的编程语言为Java所用 它在内…

适合在虚拟化环境中部署 Kubernetes 的三个场景

在《虚拟化 vs. 裸金属&#xff1a;K8s 部署环境架构与特性对比》文章中&#xff0c;我们从架构和特性的角度&#xff0c;对比了在虚拟化和裸金属环境部署 Kubernetes 的优劣势&#xff0c;并在文末列举了两者更适合的应用场景。本文&#xff0c;我们将聚焦以虚拟化环境支持 K8…

【LeetCode刷题】1两数之和

为找工作&#xff0c;我的代码都是用的JAVA&#xff0c;慢慢学习中。 LeetCode刷题Day1 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入…

《动手学深度学习 Pytorch版》 10.2 注意力汇聚:Nadaraya-Watson 核回归

import torch from torch import nn from d2l import torch as d2l1964 年提出的 Nadaraya-Watson 核回归模型是一个简单但完整的例子&#xff0c;可以用于演示具有注意力机制的机器学习。 10.2.1 生成数据集 根据下面的非线性函数生成一个人工数据集&#xff0c;其中噪声项 …

如何正确地使用ChatGPT(角色扮演+提示工程)

如何正确地使用ChatGPT&#xff08;角色扮演提示工程&#xff09; 一、ChatGPT介绍二、准备工作2.1 获取ChatGPT环境2.2 确定使用ChatGPT的目标和需求 三、重要因素3.1 角色赋予3.2 提示工程 四、正确案例4.1 工作日报4.2 工作总结 一、ChatGPT介绍 可以查阅ChatGPT快速入门 …

【Javascript】运算符(赋值,算术,自增,自减)

目录 赋值 算术 单个变量&#xff1a; 多个变量&#xff1a; 在字符串&#xff0c;数组中充当连接符 自符串与字符串 数组与数组 数组与字符串 自增与自减 前置 自增 自减 后置 自增 自减 赋值 var a 1;算术 单个变量&#xff1a; var a 1;a 1;console.l…

Java算法做题中用到的-数据结构(对应C++的STL)【java中各种集合的api方法】

Java算法做题中用到的-数据结构&#xff08;对应C的STL&#xff09; 一、数组List初始化加入元素&#xff1a; add删除元素&#xff1a; remove&#xff08;参数是角标&#xff09;获取元素&#xff1a;getindexOf() 返回指定元素下标contains()toArray() 排序方法一&#xff1…

代码随想录算法训练营第三十二天 | LeetCode 122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏 II

代码随想录算法训练营第三十二天 | LeetCode 122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏 II 文章链接&#xff1a;买卖股票的最佳时机 II 跳跃游戏 跳跃游戏 II 视频链接&#xff1a;买卖股票的最佳时机 II 跳跃游戏 跳跃游戏 II 目…

Modeling Deep Learning Accelerator Enabled GPUs

Modeling Deep Learning Accelerator Enabled GPUs 发表在 ISPASS 2019 上。文章研究了 NVIDIA 的 Volta 和 Turing 架构中张量核的设计&#xff0c;并提出了 Volta 中张量核的架构模型。 基于 GPGPU-Sim 实现该模型&#xff0c;并且支持 CUTLASS 运行。发现其性能与硬件非常吻…

SystemVerilog Assertions应用指南 Chapter1.38在序列匹配时调用子程序

SVA可以在序列每次成功匹配时调用子程序。同一序列中定义的局部变量可以作为参数传给这些子程序。对于序列的每次匹配,子程序调用的执行与它们在序列定义中的顺序相同。 module sub;logic a, b, clk;initial $vcdpluson();initial begin clk 1b0; a1b0; b1b0; repeat(2) (pos…

如何复制禁止复制的内容

今天找到一段代码&#xff0c;但是复制时页面提示“这个是VIP会员才有的权限”。我该怎么复制呢。 现在的平台大都是用钱说话&#xff0c;以便响应知识付费的主张。对错我就不说了&#xff0c;我认为既然我有权利看到代码&#xff0c;当然也有权把他复制下来。这并不涉及侵权。…

【嵌入式-Linux】安装实时内核

原文链接&#xff1a;Docs 所有内容链接&#xff1a;博客学习目录_Howe_xixi的博客-CSDN博客 参考链接&#xff1a;Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】_fully preemptible kernel(rt)_黄小白的进阶之路的博客-CSDN博客 Ubuntu20.04编译Linux内核_zstd: n…

【wvp】wvp设备上可以开启tcp被动模式

目录 开启了 tcp被动模式 开启UDP模式 地平线不支持这种tcp情况 开启了 tcp被动模式 我的理解是zlm就会是tcp被动收流模式 tcpdump -i any host 10.1.3.7 and tcp 而wvp->浏览器&#xff0c;是SRTP,其实还是基于zlm8000的udp端口出来的 开启UDP模式 tcpdump -i any host…

【Reinforcement Learning】Ubuntu中mujoco210 mujoco_py D4RL安装及错误解决

Ubuntu中mujoco210 mujoco_py D4RL安装及错误解决 本文根据一篇知乎文章链接在此进行配置&#xff0c;记录在配置过程中遇到的一些问题&#xff0c;原文作者的教程很详细&#xff0c;在此对原作者表示感谢&#xff5e; 直接进行知乎原文的第2.2 有效安装过程(避坑) 2.注意上…

Django viewsets 视图集与 router 路由实现评论接口开发

正常来说遵循restful风格编写接口&#xff0c;定义一个类包含了 get post delete put 四种请求方式&#xff0c;这四种请求方式是不能重复的 例如:获取单条记录和多条记录使用的方式都是get&#xff0c;如果两个都要实现的话那么得定义两个类&#xff0c;因为在同一个类中不能有…

【rust/树莓派】使用rppalembedded-graphics控制st7789 LCD屏幕

说在前面 树莓派版本&#xff1a;4bLCD模块&#xff1a;ST7789V2 240*280 LCD树莓派系统&#xff1a;Linux raspberrypi 5.15.76-v8 #1597 SMP aarch64 GNU/Linuxrust版本&#xff1a;rustc 1.73.0 模块详情 某雪的1.69inch LCD模块&#xff0c;包含杜邦线 准备工作 树莓派…

如何有效取代FTP来帮助企业快速传输大文件

在互联网的发展历史上&#xff0c;FTP是一种具有里程碑意义的协议&#xff0c;它最早出现在1971年&#xff0c;是实现网络上文件传输的基础。FTP的优点是简单、稳定、兼容性强&#xff0c;可以在不同的操作系统和平台之间进行文件交换。然而&#xff0c;时代在进步&#xff0c;…