理解计算机系统_程序的机器级表示(特别篇):对比move和leaq看汇编语言中数据的传递,变量和指针的映射,指针的实现

前言


       以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定

引入

        汇编代码传递数据的机制令人费解.而这部分内容又是比较基础的,需要有个清楚的认识,所以专门列一篇帖子来探索.move指令和leaq指令的区别,其他指令可以类比这两个指令.

        本贴主要讲几个方面内容:move指令和leaq的对比,变量指针的映射,以及指针的实现.

一.move指令和leaq的对比

        前面理解计算机系统_程序的机器级表示(二):寄存器,操作数,数据传送,程序栈-CSDN博客提到了数据的模型,由地址和数值组成.在汇编代码的指令中,数据是以立即数和地址出现的. 所有的指令都是在yo地址(操作数指示符的内容有阐述),或以立即数形式出现.

        然而在不同指令中的地址,表达的意思可能不一致,有的是地址,有的是数值.

        例如:move指令操作数值;leaq指令操作地址.如图所示

        笔者觉得其他指令对数据的操作可以参照这两个指令,操作数值或地址(二选一)

        示例代码:

movew $0x3,0xff00   //讲0x3传给地址0xff00
movew 0xff00,%ax    //讲0xff00里的数值传给%ax,此时%ax里的值是0x3leaq 0xff00,%rax    //%rax里的值是0xff00

二.变量和指针的映射

        计算机内部对数据的存储,只有0和1两种状态.数据模型中,地址值和数值,表达方式是一样的,通常用十六进制0x来表示.

        寄存器或内存中存放的数值,由程序员的使用方式来决定他们是具体的数字还是地址.例如:

movew $0x3,0xff00
movew $0xff00,0xff40
movew 0xff40,%ax 

        此时%ax表示从0xff40传入的值,即0xff00.而(%rax)表示取以传进来的值0xff00,为地址的值0x3.

        汇编语言中的数据和高级语言的数据表示

          汇编语言中的数据,地址和数值是一体的,既没有"数据类型"这个概念(有数据长度的区分),也没有明确区分"数值"和"指针",由使用者自己解释.高级语言不但区分了数据类型,在类型相同的情况下还区分出了"变量"和"指针" .  下面试着找他们的映射关系(伪代码不保证准确只谈思路)

        1>变量  

      以下两种写法的结果看起来差不多

//汇编指令
movew $0x3,0xff00 
//c语言写法
short int a=3;   

        在C语言代码中,变量a的底层是一个地址0xff00,所以变量相当于给地址取了个名称.这样做的好处是方便程序员表达,以及使用者的理解.当然还有其他问题要解决,比如short类型是怎样定义的,和其他类型是怎么区分的.这个问题是编译器设计者解决的,只是使用可以不用关心.

        2>指针

        以下两种写法的结果差不多(忽略数据类型)

//汇编指令
movew $0x3,0xff00 
leaq 0xff00,%rax
moveq %rax,0xff08    //将地址0xff00放入0xff08
movew $0x4,(0xff08)  //0xff08的值等于0xff00,加括号取以0xff00为地址的值并修改为4//c语言写法
short int a=3;   
short int* p=&a;
*p=4;                //修改a地址的数据为4

        变量a的地址0xff00,他的指针p的值被设置为0xff08.

        观察一下难道不是多此一举吗?C语言中特意多用了一个字(2个字节)的空间来放地址

movew $0x4,0xff00   //替代C语言的汇编代码

        C语言如果在函数里,要修改传入值,就必须传入指针了,这是他的设计机制决定的..汇编直接修改内存里的值就能达到目的. 从这里也可以看出,汇编占的空间会比C语言小.

       两种方式的比较

         高级语言易懂,写代码更方便.底层语言工作效率更高,但编写效率低.而且C语言学了再用汇编语言写的话,会令人烦躁(属于给自己找理由,如果都会用更好).

         举个例子:变量之间赋值,

        C语言直接写short int b=a;汇编语言写的话,要经过寄存器(规定了内存之间不能直接赋值)

三.指针的实现

        上面不是说过了指针吗?寄存器%rsp始终指向栈首元素,还要能访问栈内其他数据.就是说要实现指针指向一个数据块. 示意图如下:

代码:

//以下非代码,是想在对应地址内插入的数据,
$0x123,0xff00    
$0x456,0xff08
$0x789,0xff10    //以下是操作代码
leaq 0xff10,%rsp       //栈内第一个元素
movdq $0x789,(%rsp) 
//入栈
subq 8,%rsp            //地址值减8
movq $0x456,(%rsp)     //压入数据

 

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

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

相关文章

实例详解 | 借助 Langchain 和 Gemma 2 构建 RAG 应用

本文原作者&#xff1a;Connie Leung&#xff0c;谷歌开发者专家 (GDE)&#xff0c;原文发布于&#xff1a;DEV Community https://dev.to/railsstudent/build-a-rag-application-to-learn-angular-using-langchhtainjs-nestjs-htmx-and-gemma-2-5ggk 本文将为您介绍如何使用…

.Net基础1

.NET框架 项目结构 Connected Services是第三方服务MVC框架appsettings.json配置文件Program.cs控制台应用程序Properties里的json文件是配置启动方式 1. 基本开发 出现这个bug是因为防火墙没有把浏览器加入白名单&#xff0c;可以暂时先用http启动代替 第一步创建控制器&am…

数字化AI新赋能,智享AI直播:开启一个全新的直播时代!

数字化AI新赋能&#xff0c;智享AI直播&#xff1a;开启一个全新的直播时代! 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。其中&#xff0c;AI直播技术的崛起&#xff0c;无疑是数字化时代的一大亮…

深入理解 C/C++ 指针

深入理解 C 指针&#xff1a;指针、解引用与指针变量的详细解析 前言 在 C 编程语言中&#xff0c;指针 是一个非常强大且重要的概念。对于初学者来说&#xff0c;指针往往会让人感到困惑不解。本文将通过形象的比喻&#xff0c;帮助大家深入理解指针、解引用与指针变量的概念…

ELK:Elasticsearch、Logstash、Kibana Spring Cloud Sleuth和Spring Cloud Zipkin

〇、虚拟机中docker安装elasticsearch 、Kibana、Logstash elasticsearch导入中文分词器 Logstash修改es数据库ip及创建索引名配置 一、elasticsearch数据库的结构 和mysql作比较&#xff0c;mysql中的数据库的二维表相当于es数据库的index索引结构&#xff1b;mysql数据库的二…

大数据处理从零开始————4.认识HDFS分布式文件系统

1.分布式文件系统HDFS 1.1 认识HDFS 当单台服务器的存储容量和计算性能已经无法处理大文件时&#xff0c;分布式文件系统应运而生。什么是分布式系统&#xff0c;分布式系统是由多个独立的计算机或节点组成的系统&#xff0c;这些计算机通过网络连接&#xff…

Mysql(五) --- 数据库设计

文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…

paimon,基础查询语句测试

基础设置 -- 创建catalog/加载catalog&#xff0c;如果这个catalog已经存在就不会创建&#xff0c;自动加载元数据信息CREATE CATALOG fs_paimon_catalog WITH ( type paimon, warehouse hdfs://wsl01:8020/paimon/catalog ); -- 使用catalog use catalog fs_paimon_catalog…

Java虚拟机(JVM)

目录 内存区域划分堆&#xff08;Heap&#xff09;方法区&#xff08;Method Area&#xff09;程序计数器&#xff08;Program Counter Register&#xff09;虚拟机栈&#xff08;VM Stack&#xff09;本地方法栈&#xff08;Native Method Stack&#xff09; 类加载的过程类加…

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&#x…

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具&#xff0c;由python语言实现&#xff0c;通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务&#xff0c;并允许远程登录&#xff0c;被管理主机需要安装py…

卸载PLSQL及标准卸载流程

目录 1. 卸载PLSQL2. 删除注册表3. 删除数据信息 1. 卸载PLSQL 等待进度条走完 2. 删除注册表 regedit 右击删除 3. 删除数据信息 由于AppData是隐藏文件&#xff0c;需要勾选隐藏的项目。 重启电脑&#xff0c;PLSQL就卸载成功了。

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统&#xff0c;客户端和web的结合&#xff1b; 主要是使用java编写客户端代码&#xff0c;采用selenium控制浏览器&#xff0c;主要是用到selenium自动化测试的功能&#xff1b; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…

使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应&#xff1a;详细教程 在现代应用程序中&#xff0c;API调用是一个非常常见的任务。本文将通过一个完整的示例&#xff0c;讲解如何使用Java调用OpenAI的ChatGPT API&#xff0c;并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…

网络参考模型

OSI七层网络参考模型 OSI模型仅作为参考&#xff0c;现实中并不用&#xff0c;OSI模型的目的是为了解决主机之间的网络通讯。 1. 物理层&#xff1a; 物理层将由比特&#xff08;0和1&#xff09;组成的数据用不同的媒介&#xff08;电、光或其他形式的电磁波&#xff09;传输…

黑马软件测试第一篇_测试理论

概念 使用技术手段验证软件功能是否符合需求 测试种类 功能测试 自动化测试 接口测试 性能测试 按测试阶段划分 单元测试&#xff1a;针对程序源码进行测试 集成测试&#xff1a;又称接口测试&#xff0c;针对模块之间访问地址进行测试 系统测试&#xff1a;对整个系统进行…

京东零售数据湖应用与实践

作者&#xff1a;陈洪健&#xff1a;京东零售大数据架构师&#xff0c;深耕大数据 10 年&#xff0c;2019 年加入京东&#xff0c;主要负责 OLAP 优化、大数据传输工具生态、流批一体、SRE 建设。 当前企业数据处理广泛采用 Lambda 架构。Lambda 架构的优点是保证了数据的完整性…

YOLO的相关改进机制

我的面包多平台有多种关于YOLO的改进&#xff0c;大家尽早关注&#xff0c;不迷路

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显&#xff1a; 没有回显 usernameadmin&passwordadmin 闭合单引号&#xff0c;依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

查看SQL Server授权序列号通过SQL查询查看安装日志文件使用PowerShell查询

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…