HNU计算机系统·汇编进阶

news2024/11/14 6:10:25

知识回顾:

        寻址:EA = I_{mm}(R_{1},R_{2},S) = I_{mm} + R_{1} + R_{2}*S

        其中,比例因子S,只能是1,2,4,8中的数,这是因为在LEA的独立电路中使用移位寄存器


上节课的补充:

mov部分:

mov value , %eax 
mov $value , %eax

        第一条指令,把value的值赋值给寄存器eax

        第二条指令,把立即数(value的地址)赋值给寄存器eax

如下图所示      


lea指令

        lea(load effective address),LEA指令的功能是取偏移地址, 指令形式是从存储器读数据到寄存器, 效果是将存储器的有效地址写入到目的操作数。只是取地址而不是取地址中的数据

        lea 指令是mov 指令的变形,lea 指令形式看上去是从存储器读数据到寄存器,但实际并没有引用存储器,而是将有效地址写入目的操作数(必须是寄存器)

类似于C语言中的&

leal S,D 表示 D <- &S

有与其等效的mov指令

mov $S , D

作用:

  • 地址计算/地址传送
  • 执行简单的算术操作

地址计算/地址传送练习

        若寄存器%edx 的值为x,那么

leal 7(%edx,%edx,4),%eax

        表示:寄存器%eax的值为5x+7

leal 8(%edi), %eax

        表示:%eax+8 -> %eax

movl 8(%edi), %eax

         表示:%edi+8  -> %eax

演示:1012.s

执行简单的算术操作

        对于下面的程序

int scale(int x,int y,int z)
{
    int t=8*x+2*y+5*z;
    return t;
}

         反汇编代码如下,令%esi=x,%edi=y,%edx=z,%eax=t

scale
    leal (%edx,%edi,4) %eax
    leal (%eax,%edi,2) %eax
    leal (%eax,%esi,8) %eax
    ret

注意:

        比例因子只能是1,2,4,8,在LEA的独立电路中用移位寄存器可以简单高效地实现此类计算!


新知识

函数的栈帧

        每一个函数或过程在执行时,都需要在内存中分配一个空间来保存运行时数据,这个空间由于是采用栈的方式进行操作,所以也称为栈帧

        栈是向下增长的。上面大,下面小。存取地址从大向小的存。如图所示

       栈底的位置存储在寄存器%ebp中,栈顶的位置存储在寄存器%esp中

        esp指向的位置存储的什么不知道,因为不知道之前栈中存储的是什么数据,但是我们可以通过命令查看当中的数据

        栈是向“下”增长的,或者说是向地址0x0处增加的,因此%esp中的值小于或等于%ebp中的值。

        如图所示

注意: 

        栈帧是内存中一段连续的内存空间,被调用者的栈帧紧挨着调用者的栈帧

        每个函数,在同一时刻只会有一个活跃栈帧

        栈顶是朝着低地址方向(栈是向着零地址方向增长)如图所示


栈操作

栈有两个基本的操作:

  • 入栈:将一个新的元素放到栈顶。push
  • 出栈:从栈顶取出一个元素。pop

        栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。

        栈的操作规则:后进先出

        栈顶指针:保存在%esp寄存器中,当栈为空的时候,%esp指向最高地址空间的下一位

入栈:

        push操作只有目的操作数,没有源操作数。在每个程序所分配的内存中,划分出一段连续的区域,作为栈空间。示例1013.s

        push申请对应的源寄存器的数据长度,esp减小相应字节数(即%esp-n)因为存储的数据按照小端法存储,低位数据在栈顶位置

例一如图所示:

        先将0x8888 8888压入栈中,再压入%ebx(对应的为pushl,4个内存单元),再压入%bx(对应两个内存单元),在压入0x4321(value),最后压入value的地址

例二在执行push ax指令时,主要做了一下2件事

  1. 先将SP=SP–2。
  2. 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶

注意:

        push    $value   把value的首地址放到栈里
        pushw $value   只把低两位地址放到栈里 

出栈

        pop后数据依然在原来位置但是是无效的

        pop使用方法与push类似

如图所示:


逻辑算术指令

指令集如图所示

跳转指令

        寄存器eip 存放下一条要执行指令的地址

无条件跳转:jmp        

        jmp指令。条件执行通常涉及将控制转移到不跟随当前正在执行的指令的指令的地址。 控制权的转移可以是向前的,以执行一组新的指令,也可以是向后的,以重新执行相同的步骤。更多请看教材128页

语法:

        JMP 指令提供了一个标签名称,其中控制流立即转移。

jmp   label

程序:1014.s提供相应测试代码

        如图标记处,这里的05,是将指下一条指令(mov $5, %eax)的地址(即当前PC所存地址)
再加上05,就能得到跳转目的地<exit>的地址

                                    0x804805c+5=0x8048061= exit

条件跳转:jg

        如果条件跳转中满足某个指定条件,则控制流转移到目标指令。 根据条件和数据,有许多条件跳转指令。条件跳转按照%eflags中的值来判断是否该跳转。        


可以参考另一篇博客:Linux汇编入门大杂烩上!-CSDN博客

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

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

相关文章

【阅读论文】智能数据可视分析技术综述

智能数据可视分析技术综述 文章结构 中文引用格式: 骆昱宇, 秦雪迪, 谢宇鹏, 李国良. 智能数据可视分析技术综述. 软件学报, 2024, 35(1): 356–404. http://www.jos.org.cn/1000-9825/6911.htm

Linux常用操作命令和服务器硬件基础知识

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Spring Cloud部署篇2——Docker Compose部署至CentOS云服务器

一、项目介绍 系统模块 com.mingink |--mingink-api // 接口模块 | └──mingink-api-system // 系统接口 |--mingink-common // 通用模块 | └──mingink-common-core // 系统接口 |--mingink-gateway…

二叉树最长路径问题(x+1,x++,++x 问题详解)

首先遇到的问题是&#xff0c;在二叉树求最短路径中&#xff0c;DFS参数x的传入导致的结果不同问题 #include<iostream> #include<iomanip> #include<cstring> using namespace std; int maxi; char path[1000],ans[1000]; typedef struct BiTLnode{char da…

Restormer: Efficient Transformer for High-Resolution Image Restoration

Abstract 由于卷积神经网络&#xff08;CNN&#xff09;在从大规模数据中学习可概括的图像先验方面表现良好&#xff0c;因此这些模型已广泛应用于图像恢复和相关任务。最近&#xff0c;另一类神经架构 Transformer 在自然语言和高级视觉任务上表现出了显着的性能提升。虽然 T…

SpringMVC基本原理

第一章&#xff1a;Java web的发展历史 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是&#xff1a;JSPJavaBean的模式&#xff0c;它的核心是Jsp页面&#xff0c;在这个页面中&#xff0c;Jsp页面负责整合页面和JavaBean&#xff08;业务逻辑&#xff09;&…

23.1 微服务理论基础

23.1 微服务基础 1. 微服务介绍2. 微服务特点3. 微服务优缺点4. 微服务两大门派5. 微服务拆分6. 微服务扩展6.1 服务扩展6.2 按需扩展7. 微服务重要模块******************************************************************************************************************

自然语言处理实验2 字符级RNN分类实验

实验2 字符级RNN分类实验 必做题&#xff1a; &#xff08;1&#xff09;数据准备&#xff1a;academy_titles.txt为“考硕考博”板块的帖子标题&#xff0c;job_titles.txt为“招聘信息”板块的帖子标题&#xff0c;将上述两个txt进行划分&#xff0c;其中训练集为70%&#xf…

超薄片式厚膜电阻

超薄片式厚膜电阻器具有许多碳电阻器特性;它们可以做得很小&#xff0c;而且大批量的成本非常低。同时厚膜电阻器具有高达10TW&#xff08;太欧姆&#xff09;的高电阻值、非常高的温度性能和高电压能力&#xff0c;并且本质上是无感的。它们适用于医疗、航空航天和井下&#x…

比Let‘s Encrypt更简单更齐全的免费证书申请教程

步骤一 打开JoySSL官网&#xff0c;注册属于你的专属账号&#xff1b; 永久免费SSL证书申请地址真正完全且永久免费&#xff01;不用您花一分钱&#xff0c;SSL证书免费使用90天&#xff0c;并且还支持连续签发。JoySSL携手全球权威可信顶级根&#xff0c;自研新一代SSL证书&…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

【Leetcode每日一题】 递归 - 合并两个有序链表(难度⭐)(35)

1. 题目解析 题目链接&#xff1a;21. 合并两个有序链表 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 1. 递归函数定义与功能 递归函数的主要任务是将两个有序链表合并成一个新的有序链表&#xff0c;并返回合并后…

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…

PostgreSQL从入门到精通教程 - 第46讲:poc-tpch测试

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第46讲&#…

【计算机网络】概述

文章目录 一、Internet 因特网1.1 网络、互联网、因特网1.2 因特网的组成 二、三种交换方式2.1 电路交换 &#xff08;Circuit Switching&#xff09;2.2 *分组交换 &#xff08;Packet Switching&#xff09;2.3 报文交换 &#xff08;Message Switching&#xff09; 三、计算…

基于Verilog的简易CPU设计

前言 本篇文章将简单讲解CPU之间各部分的功能及接线&#xff0c;并提供Verilog模拟CPU的各个组成部分。该CPU可以完成一些操作&#xff0c;如&#xff1a;加减法&#xff0c;与或&#xff0c;指令跳转等&#xff0c;最后提供testbench用于测试该CPU的工作情况是否符合预期。 C…

雷卯推荐基于USB 快充(USB-PD) 浪涌保护器件

USB PD 从2010年USB BC1.2 &#xff1a;单一5V 1.5A&#xff0c;到2021 年USB PD 3.1&#xff0c;支持电压 5V、9V、15V 和 20V&#xff0c;28V、36V 和 48V, 充电功率同步提升至240W。应用范围从从手机、平板电脑、笔记本电脑&#xff0c;逐渐向显示器、服务器、电机驱动和通信…

企业架构设计方法与实践中的架构治理演进、架构评估方法、架构成熟度模型

企业架构设计方法与实践中的架构治理演进、架构评估方法、架构成熟度模型。 架构治理演进: 架构治理是指通过设立和执行一套政策和程序,来管理和控制一个组织的架构活动。架构治理演进是一个持续的过程,需要根据组织的实际情况进行定期审查和调整。 在演进过程中,重点需要…

Python学习01 python开发的准备工作 1.Python解释器的下载 2.Pycharm集成开发环境的安装

0.按照步骤&#xff0c;快速进行python的开发准备工作 1. Python解释器的下载 下载地址 https://www.python.org/ 选择对应你的系统的安装包 2.记得勾选这里将python加入你的路径中 3.有如下四个程序表明安装成功 4.点击上图中的第二个程序打开窗口检查解释器能否正常工作 输…

Flutter 多语言自动化本地化生成器

Flutter 多语言自动化本地化生成器 这是一个为Flutter设计的插件&#xff0c;通过从Excel表格提取的CSV文件自动生成Dart本地化文件&#xff0c;以简化应用程序本地化的流程。这个工具通过自动化创建多语言资源文件&#xff0c;简化了开发人员和翻译人员的工作流程。 特点 默…