一个小想法--理解指针的机制与汇编中的寄存器间接寻址

8051汇编中C51指针操作原理与优化技巧 在嵌入式系统开发中,指针操作是内存管理的核心技术。基于冯诺依曼架构的微控制器通过寄存器间接寻址实现指针访问,这在8051这类经典MCU中尤为典型。指针本质上存储内存地址,其实现方式直接影响代码执行效率,特别是在资源受限的嵌入式场景。C51编译器针对8051的哈佛架构特性,为idata/xdata等不同存储区域生成差异化的汇编指令,如用R0/R1寄存器处理内部RAM,DPTR寄存器访问外部RAM。理解这些底层机制能帮助开发者编写更高性能的嵌入式代码,在传感器数据采集、实时控制等场景中优化内存访问。本文以Kei 阅读详情

      C语言中,指针可以理解为:值为其所指变量的地址的变量,或简称存储地址的变量。

      指针存储的内容不是具体的值,而是系统分配给对应变量的地址,这样,通过对指针(变量地址)的操作就可以实现对变量的操作,如赋值,查询,删除,甚至释放变量内存。

       在汇编或者说处理器中,在实现运算,访问等操作时,有多种寻址方式,如


       一,.立即寻址方式(immediate addressing)

       MOV  AX, 3064H             ;操作数3064H直接就在语句中给出


        二,直接寻址方式(direct addressing)

        MOV  AL, [78H]             ;给出操作数的地址,通过访问此地址取得操作数


         三,寄存器寻址方式(register addressing)

        MOV  BX, AX                    ; 将其他的寄存器的值直接赋值给当前寄存器


       


        其中有一种寻址方式为寄存器间接寻址方式(register indirect addressing),如

        MOV  AL, [BX]  

        其中,寄存器BX存储的并不是要访问的操作数(假定为3064H),而是此操作数(3064H)所在的地址,通过访问BX中的地址达到访问(取得)操作数的目的。


       此处,寄存器BX的效果和C语言的指针有异曲同工之妙。


问题:

       “C语言中的指针本身的地址由系统自动分配,同样由其回收”(天勤书上),此处的“系统”应该是指编译器,从CPU层次上看,寄存器级别的访问应该是最快的,那么C的编译器能否将C代码中指针由寄存器实现呢(数量上肯定不可能为每一个指针分配一个寄存器,但是个别呢),(①C的编译器有此权限吗(直接访问寄存器),还是说只有操作系统才有权限   ②就算有,可以这样做吗)

                         

参考资料:

汇编语言之寻址方式   http://blog.youkuaiyun.com/qq_35668537/article/details/74279554


声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者。

DSP间接寻址:TMS320C24x高效数据访问与FFT优化的核心技术 在嵌入式系统与数字信号处理领域,内存访问效率是影响实时性能的关键因素。间接寻址作为一种硬件实现的指针机制,允许通过寄存器动态指定内存地址,从而避免硬编码地址带来的代码冗余。其核心原理在于利用辅助寄存器存储地址,并由独立的算术单元在指令译码阶段自动更新指针,实现零开销的地址计算。这一技术显著提升了数据遍历的效率,尤其适用于需要连续或规律性访问大量数据的场景,如数字滤波、卷积运算等。在TMS320C24x等DSP芯片中,间接寻址通过七种寻址选项(包括基础的增减模式、索引模式以及专为FFT优化的位反转模式)得到进 阅读详情

相关推荐

x86寄存器全解析:从核心概念到汇编实战与调试技巧

寄存器是CPU内部的高速存储单元,作为计算机体系结构的基础组件,其核心价值在于为数据运算和指令执行提供最快的临时存储与操作空间。从原理上看,寄存器由触发器构成,直接位于CPU内部,具有速度快、延迟低、容量小的特点,是CPU与内存、外设进行数据交换的关键枢纽。在技术层面,理解寄存器是掌握指令集架构、程序执行机制和性能优化的前提,尤其在底层开发、逆向工程和系统调优中不可或缺。应用场景广泛,从编译器生成高效代码、操作系统管理进程上下文,到使用调试器(如GDB)进行动态分析和故障排查,都离不开对寄存器的精确操控。本

weixin_33806914的博客 847

用C语言和汇编给寄存器赋值

1用汇编–要根据目标CPU的体系,用对应的汇编类型编写 ldr r0, =0X020C4068 /* CCGR0 */ ldr r1, =0XFFFFFFFF str r1, [r0] 2用C语言–要知道相关寄存器地址–官方会提供参考手册,上面有 /* * IOMUX相关寄存器地址 */ #define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068) #define SW_PAD_GPIO1_IO03 *((volatile

weixin_55255438的博客 4381

51单片机内存访问黑科技:用寄存器间接寻址玩转片内外RAM

本文深入解析了51单片机中寄存器间接寻址这一核心内存访问技术。通过剖析@R0/@R1与@DPTR的硬件机制与分工,并结合Proteus仿真实战,详细演示了如何高效、安全地访问片外RAM。文章还进一步探讨了基于该寻址方式构建环形缓冲区等高级应用,并分析了MOVX指令的时序要点与避坑指南,为开发者突破片内RAM限制、处理复杂数据提供了关键技术路径。

weixin_29186249的博客 101

c语言中通过指针将数值赋值到制定内存地址

  1.一种直观的方法   假设现在需要往内存0x12ff7c地址上存入一个整型数0x100。我们怎么才能做到呢? 我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质不就是一个指针嘛。所以我们可以用下面的方法: int *p = (int *)0x12ff7c; *p = 0x100;   需要注意的是将地址0x12ff7c赋值...

weixin_34224941的博客 1531

汇编语言实验四:掌握[bx]与loop指令实现内存循环写入

在计算机底层编程中,内存访问和循环控制是两大核心基础概念。理解CPU如何通过地址寄存器间接访问内存,以及如何利用计数器实现重复操作,是掌握汇编语言乃至任何系统编程的关键。寄存器间接寻址原理允许程序动态操作连续内存区域,这为处理数组、字符串等数据结构奠定了基础。结合循环指令,开发者能够高效实现批量数据操作,这种模式直接对应高级语言中的指针遍历与迭代循环。其技术价值在于提供了对硬件资源的直接、精确控制,是理解内存管理、缓冲区操作及性能优化的基石。应用场景广泛,包括嵌入式系统开发、操作系统内核编程、性能关键型算法

weixin_33676492的博客 371

完整内、外期货量化交易系统源码可售

支持客户登录校验,支持所有的实时行情和汇总报价功能、实时资讯(报价,列表,分时,分钟成交明晰,),多线程支持盘后收盘作业下载(日线,5分钟线,15分钟, 30分钟,60分钟线,),支持从服务器下载相关运行配置(来自服务器动态配置信息,如收盘日期等),实现状态条显示。收盘作业包括日线、5分钟线、15分钟线、30分钟、60分钟线、2小时线、4小时线每日分时走势。综合信息栏显示用户账户信息、合约信息、当日委托单记录、当日成交记录、当日平仓记录、当日跟单记录、当日(月/周)排行榜、下单栏、持仓信息;

qq_35600909的博客 1805

【C语言】 第六章 - 指针

-

记录 1265

【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

这章来学习串口数据流操作。仿照成品制作一个自己用Qt编写的串口助手。 1. 布局UI界面 创建QWidget工程,布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。 拖入几个 Combo Box 、Label 和 Push Button,使用两个Widget进行布局。如下所示。 将接收区的 Plain Text Edit,属性勾选上 readOnly,使其运行时不会被人为的输入操作影响。 加入一些弹簧,使布局美观。(有必要可以加设置不能调整..

Mark_md的博客 9272

汇编看指针

前言 开发中经常使用指针访问变量修改变量值, 那么编译器是怎么翻译指针的 或者说指针在汇编层面到底是什么 mov 和 lea 指令 指针的分析离不开这两个指令,简单看下mov指令 mov指令 GNU汇编器输出AT&T汇编时为 mov 指令添加了一个维度,在其中必须声明要传送的数据元素的长度 因此,指令就变成了如下: movx 其中 x 可以是下面的字符: 1,q用于64位的4字值 2,l用于32位的长字值 3,w用于16位的字值 4,b用于8位的字节值 源码 - (void)asm_point {

iOS随笔 3118

IGBT基础知识

IGBT

u010783226的专栏 1万+

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5387

汇编-指针

(pointer)。指针是操作数组和数据结构的极好工具,因为它包含的地址在运行时是可以修改的。

lm68140318的博客 1182

企业级OpenClaw部署实战:10个关键配置让你从“养虾“到“精通“

OpenClaw(社区昵称"小龙虾")作为2026年开源社区最活跃的AI Agent项目,凭借其多Agent协同架构和企业级安全隔离能力,已成为中大型企业的首选AI基础设施。本文基于真实企业部署经验,系统梳理了企业级OpenClaw部署的10个关键配置:用户ID消息隔离、群组ID消息隔离、多机器人配置、无限量Agent创建、机器人与Agent关联、Agent间调度、权限配置、Hooks任务、多模型切换及一键备份迁移。

program哲学 930

c语言内存分配对应 一个小想法--理解指针的机制和汇编中的寄存器间接寻址,但是这个只对应IDATA存储器,DATA存储器用什么寻址方式?ROM,暂时可以理解MOVC A,@PC/DPTR,堆栈SP

c语言内存分配对应 一个小想法--理解指针的机制和汇编中的寄存器间接寻址 电脑杂谈  发布时间:2018-02-12 01:10:34  来源:网络整理 c语言内存分配对应 一个小想法--理解指针的机制和汇编中的寄存器间接寻址,但是这个只对应IDATA存储器,DATA存储器用什么寻址方式?ROM,暂时可以理解MOVC A,@PC/DPTR,堆栈SP, 变量可以理解为地址的宏定义 ?? ?? ?? C语言中,指针可以理解为:值为其所指变量的地址的变量,或简称存储地址的变量。c语言内存分配对应 ??

二进制模----细微行动改变影响世界 294

VSS shielding线可以floating吗?

shielding vss不打孔,就相当于dummy metal,如果周围有其他干扰线,他们影响了这段dummy metal,这段dummy metal仍然会对目标线产生干扰,bug的是,工具知道这段dummy是vss,那么计算寄生的时候仍然把它当vss,就有可能噪声没有完全消除,而用户又看不见。而真正接地的线,相当于一直是0,就不会对目标线产生干扰,一般加shield是在route之前,这时候shield能尽量覆盖目标线,等到绕线后再加就会出现shield只覆盖到一部分目标线的情况。

m0_61544122的博客 6634

14 | TensorFlow2对阿拉伯语手写字符数据集进行识别

该数据集由 60 名参与者书写的16,800 个字符组成,年龄范围在 19 至 40 岁之间,90% 的参与者是右手。每个参与者在两种形式上写下每个字符(从“alef”到“yeh”)十次,如图 7(a)和 7(b)所示。表格以 300 dpi 的分辨率扫描。使用 Matlab 2016a 自动分割每个块以确定每个块的坐标。该数据库分为两组:训练集(每类 13,440 个字符到 480 个图像)和测试集(每类 3,360 个字符到 120 个图像)。数据标签为1到28个类别。

微信号:RunsenLiu 2876

十三、直接、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址

计算机只容许使用bx、si、di、bp寄存器做间接和相对寻址 其中bx为基址存储器,si、di为变址存储器   内存寻址方式:确定访问内存存储单元偏移地址的方式称为寻址方式。 直接寻址:[偏移地址] 寄存器间接寻址:[基址寄存器/变址寄存器] 寄存器相对寻址:[基址寄存器/变址寄存器+偏移量值] 基址变址寻址:[基址寄存器+变址寄存器] 相对基址变址寻址:[基址寄存器+变址寄存器+...

墨痕诉清风的博客 2万+

Python 爬虫实战:爬虫代码打包为可执行文件

本文详细介绍了使用PyInstaller工具将Python爬虫打包为可执行文件的全过程。以豆瓣电影Top250爬虫为例,首先对比了主流打包工具,推荐选择跨平台的PyInstaller。通过编写完整的爬虫代码(包含异常处理和数据保存功能),演示了从环境准备、代码测试到打包配置的具体步骤。重点讲解了单文件打包、自定义图标等高级功能,并针对常见的"找不到模块"、文件体积过大等问题提供了解决方案。文章还说明了跨平台打包的注意事项,帮助开发者实现爬虫程序的无环境依赖部署,大幅提升程序的易用性和部署

2503_91057718的博客 2215

ARM架构下立即寻址与寄存器间接寻址对比

本文深入探讨ARM架构下的立即寻址与寄存器间接寻址机制,揭示其对性能、功耗和系统稳定性的影响。通过分析立即数编码限制、文字池使用及指针操作的硬件实现,帮助开发者理解编译器行为与底层执行效率的关系。

h6j7k8l9p0的博客 629

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入理解C语言指针:从源码到汇编的彻底剖析

本文通过反汇编分析深入剖析C语言指针的底层原理。首先明确指针本质是存储内存地址的变量,通过实验代码展示指针赋值、解引用等操作。重点解析了LEA指令获取地址、指针赋值的内存操作、解引用三步曲以及指针算术运算的实质(地址增减取决于数据类型大小)。最后通过内存布局图直观展示栈空间分配情况,揭示不同类型指针的差异。从汇编层面理解指针操作,有助于开发者深入掌握C语言核心概念。

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 1075

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

用汇编理解C++

用汇编理解C++在各种高级语言发展成熟的今天,我们几乎不会再去用汇编进行编程了。但是在实际编程过程中,确经常会碰到一些莫名奇怪地问题,此时如果能从汇编的角度对代码进行理解的话也许就可以发现其中的问题所在,同时也便于更深次理解高级语言的运行原理。因此本篇文章旨在让大家能更好地理解C++,即使没有汇编基础的人也能看懂。一、汇编和C++的关系要说到它俩的关系,首先得提一下机器语言。机器语言是机器指令的集...

wzn491574452的博客 5049

第6章 寄存器及其用途

掌握寄存器的使用是精通汇编语言的关键。熟悉不同的调用约定、正确管理寄存器状态以及有效与内存交互都是编写高效汇编代码的重要技能。随着经验的增长,程序员还可以探索更复杂的优化技术,如寄存器重命名、循环展开和向量化计算等。接下来我们将深入探讨一些更高级的主题,包括寄存器优化、SIMD指令集的应用、异常处理机制以及如何编写高效的汇编代码。这些主题对于那些希望进一步提高汇编语言编程技能的人来说非常重要。

hummhumm的专栏 1422

MicroPython Thumb-2 内联汇编器完整参考:指令集、寄存器约定与实战指南

MicroPython 内置的 Thumb-2 内联汇编器允许开发者以 Python 函数的形式直接编写 ARM Thumb-2 汇编代码,并通过 `@micropython.asm_thumb` 装饰器将其作为普通 Python 函数调用。本文以仓库中 [docs/reference/asm_thumb2_index.rst](https://link.gitcode.com/i/cac52bf

gitblog_00138的博客 997

Intel汇编知识整理

无

Fyantu的博客 2967

汇编语言的数据寻址方式

本文介绍了x86架构中常见的汇编语言数据寻址方式。主要涵盖10种寻址模式:立即寻址(操作数直接包含在指令中)、寄存器寻址(操作数在CPU寄存器中)、直接寻址(操作数地址由指令显式给出)、寄存器间接寻址(寄存器作为指针)、基址/变址寻址(基址加偏移/索引)、比例变址寻址(带比例因子的索引)、堆栈寻址(通过堆栈指针访问)和隐含寻址(指令隐含指定操作数)。文章详细说明了每种方式的特点、示例和适用场景,并对比了它们在速度和灵活性上的差异,为理解汇编代码和高级语言底层实现提供了基础。

fearhacker的专栏 1071

指令跳转与寄存器详解

指令跳转是计算机体系结构中的一个重要概念,它允许程序根据特定条件或无条件地改变程序执行的顺序。指令跳转通常涉及以下几个关键寄存器和机制:指令地址寄存器(Program Counter, PC)、指令寄存器(Instruction Register, IR)、条件码寄存器(Condition Code Register, CCR)等。本文将详细解释这些概念,并通过示例展示如何在汇编语言和 Java 代码中实现条件跳转。

m0_37395203的博客 1064
下一篇: 由经典swap( )谈起——参数传递的三种类型
ProLayman
博客等级 码龄10年 105粉丝 192原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值