第三章、汇编1

编译选项知识

-Og:这是 GCC 和 Clang 编译器提供的优化选项之一。-Og 的含义是“优化级别为 g”,其中的 “g” 代表了"g优化"。这个选项的作用是启用一些基本的优化,以尽量保持生成的代码易读易调试。它通常会保留变量名和源代码结构,以方便调试。但是,它并不会进行像 -O1、-O2 或 -O3 这样的更加激进的优化。因此,当你希望在调试时仍然能够方便地查看源代码和变量名时,可以使用 -Og。
-g:这是另一个编译选项,用于生成调试信息。使用 -g 选项编译程序会在生成的可执行文件中包含调试信息,包括源代码中的行号、变量名等,以便在调试器中进行调试时能够准确定位到源代码的位置。-g 选项通常与其他优化选项一起使用,以便在优化后的代码中进行调试。
-S: 生成汇编
-c: 生成目标文件

汇编代码

  • 不区分有符号和无符号整数
  • 点开头的都是汇编代码中的注释

gdb

  • x:显示
  • xb: 16进制格式,举例,x/14xb 结果会显示14个字节(以16进制显示,53, 。。。5b, c3)
  • i r: 显示所有寄存器状态,info registers rax查看具体的某个寄存器信息

objdump

  • -d: 可以将目标文件反汇编成汇编语言
  • 会省略一些指令结尾的‘q’,不过会给call和ret添加q后缀
  • nop指令主要是为了内存对其,使得下一个代码块的首地址为16的整数倍

通用寄存器

在这里插入图片描述

  • rip寄存器是存放pc, 也就是下一次执行代码的地址
  • 由于架构升级,所以寄存器的开头rax->eax->ax->al,对应大小:8->4->2->1
  • 生成1字节或者2字节的指令会保持剩下的字节不变,比如movb $-1 %al, 那么rax中只有al位置为FF,其他不变,movw同理
  • 生成4字节的指令会把高位4字节置为0,比如movl $-1 %eax, 那么eax中为F,rax中其他位置为0

操作数指示符

  • 立即数用$表示,如$-577或者$0x1F
  • 寄存器用%提取,如%rax
  • 内存地址的值,直接写地址0x104

数据传送指令

  • movb, movw, movl, movq ,不能输入和输出全是内存,简单解释两个内存数据搬移,必须经过寄存器

  • movabsq 和 movq 都是 x86/x86-64 汇编语言中的指令,用于将数据从一个位置移动到另一个位置。它们之间的主要区别在于处理数据的方式。

    movabsq 指令:

    • movabsq 是一个较新的指令,引入了 x86-64 架构(即 64 位处理器体系结构)。
    • 它用于将 64 位立即数(immediate)加载到 64 位寄存器中。
    • 该指令的操作数是一个立即数,表示为立即数前缀 0x,后面跟着一个 64 位的立即数值。
    • movabsq 不会对目标寄存器进行符号扩展。

    movq 指令:

    • movq 指令用于将数据从一个位置移动到另一个位置,通常用于寄存器之间的数据传输,也可以用于内存和寄存器之间的数据传输。
    • 它可以用于处理 64 位数据,但也可以用于处理 32 位或 16 位数据,取决于操作数的大小。
    • 如果源操作数是 64 位的,则将其完全复制到目标操作数,否则进行符号扩展或零扩展,以适应目标操作数的大小。

    示例:
    假设我们有一个 64 位立即数 0x123456789abcdef0,我们要将它加载到 rax 寄存器中。
    使用 movabsq 指令:

    movabsq $0x123456789abcdef0, %rax

    使用 movq 指令:

    movq $0x123456789abcdef0, %rax
    在这两个例子中,我们将立即数 0x123456789abcdef0 移动到 rax 寄存器中。使用 movq 指令时,如果立即数没有 64 位,则会对其进行符号扩展或零扩展。(书上说是符号扩展, 实测也是)
    在这里插入图片描述在这里插入图片描述

  • MOVZ和MOVS分别代表0扩展和符号扩展,其中没有movzlq, 因为可以利用movl和通用寄存器的规则达到这样的效果,省一条指令

  • cltq 这个没有显示指示出源和目的,其实等于movslq %eax, %rax, 注意是符号扩展

  • pushq, popq 压入四字或者弹出四字,popq的话不会删除栈的值,只会更改%rsp

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

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

相关文章

Idea如何本地调试线上测试服务器代码?

线上出现问题,但是没加日志打印拍脑门惋惜为啥不多打一行日志 加日志重新部署,半小时没了,问题还没有找到,头顶的灯却早已照亮了整层楼...... 排查别人线上的 bug,不仅代码还没看懂,还没一行日志&#…

Linux:目录目录、文件管理

Linux:目录、文件管理 文件系统 Linux 系统中的所有文件存储在文件系统中,它们被组织到一个颠倒的目录树中,称为文件系统层次结构。这棵树是颠倒的,因为树根在该层次结构的顶部,树根的下方延伸出目录和子目录的分支。…

高级控件3:ViewPager

ViewPager:翻页视图,可以在水平方向上滑动。常用于做欢迎页、图片轮播、标签页等场景一个页面View就是一个数据条目(可以理解为一个子项)适配器:PagerAdapter,该接口有两个子类,FragmentPagerAd…

【Linux】理解文件系统——那就浅聊一下吧

前言 在上一篇文件描述符详解中谈论的都是打开的文件,但是在我们的系统中不仅有打开的文件还有许多未打开的文件,那么这些未打开的文件又该如何理解呢?阅读完本篇文章相信你会得到答案。 如果觉得文章内容对你有所帮助的话,可以给博主一键三…

【计算机网络】MAC地址简介

MAC(Medium Access Control),即媒介访问控制,是计算机网络通信中的重要概念。每个NIC(Network Interface Card),即网络适配器,都具有独自且不变的MAC地址(烧录的&#xf…

线程-条件变量和生产者消费者模型

这个内容比较重要,并且面试很容易被问道。所以把他单独拿出来了。 条件变量 条件变量是一种线程同步机制 当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。为了保护共享资源,条件变量需要…

ROM修改进阶教程------安卓7_____安卓13去除签名验证操作步骤解析

同类博文: 安卓玩机搞机技巧综合资源-----修改rom 制作rom 解包rom的一些问题解析【二十一】_qcn改区域锁-CSDN博客 安卓系列机型rom修改。如果你删减了系统相关的app。那么严重会导致开机系统卡米 定屏等问题。这类一般都是系统签名验证导致的。而破解签名验证一般都是修改…

JAVA:Kettle 强大的开源ETL工具

请关注微信公众号:拾荒的小海螺 1、简述 Kettle(Pentaho Data Integration):强大的开源ETL工具Kettle,又称作Pentaho Data Integration,是一款流行的开源ETL(Extract, Transform, Load&#x…

ubuntu如何运行python程序

打开LINUX UBUNTU操作系统。 找到左边的TERMINAL,打开窗口。 输入python,如果没有安装,就会提示需要安装。 如果已经安装好python3,直接输入,那么就会进入。 exit()就可以退出python3的模式。 创建一个文件&#xff0c…

有没有学网络空间安全的学长,想知道学长们毕业以后都去干嘛了?

我作为一个零基础小白到白帽黑客,也认识到了很多零基础小白的,有一些网络空间安全的学员,但是大多数还是非计算机相关专业的学员。他们通过系统学习网络安全,掌握黑客技术之后,都找到了自己满意的工作。 同学A&#x…

二叉树oj题(2)

1.二叉树的最近公共祖先 解题思路:方法一: 1.先判断p或者q 是不是 root当中的一个 2.左子树当中递归査找p或者q 3.右子树当中递归查找p或者q 如何查找: root 的 left 和 right 都不为空 ->root root的 left 为空 right 不为空->right这一侧找…

话题——为什么要学习程序,成为程序员呢?

选择成为一名程序员,这对我而言并非是一时冲动,而是深思熟虑后的坚定选择。在当下这个信息化、数字化的时代,程序员这一职业不仅具有极高的技术含量,更承载了推动社会进步、引领科技发展的重任。特别是在深度学习这一前沿领域&…

复写零 ---- 双指针

题目链接 题目: 分析: 就地对数组进行操作, 肯定是需要双指针的 那么我们从左往右进行复写, 定义一个cur用来遍历数组, 一个dest用来修改数组的值, 如果cur下标的值不为零, 那么将cur的值写到dest位置, cur, dest; 如果cur下标的值为0, 那么就将dest下标的值写为0, dest, 再将…

Linux系统编程——进程

一、进程相关概念 面试中关于进程,应该会问的的几个问题: 1.1 什么是程序?什么是进程?有什么区别? 程序是静态的概念,比如: 磁盘中生成的a.out文件,就叫做:程序 进程…

11408知识点集合

文章目录 一、数学(一) 高数0.初等数学补充1.函数、极限、连续2.导数3.中值定理4.积分5.微分方程6.空间解析几何7.多元微分8.重积分9.曲线曲面积分10.无穷级数11.其他杂记(二) 线代0.串联各章的等价条件1.行列式、矩阵的秩、矩阵的初等变换2.向量3.方程组、矩阵方程AXB4.特征值…

Springboot+Vue项目-基于Java+MySQL的学科竞赛管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

Kibana安装部署(Linux)

Kibana是Elasticsearch的开源可视化工具,与存储在Elasticsearch中的数据进行交互。 1. 下载软件 这里使用的Elasticsearch的版本是7.12.0,所以kibana选择同样的7.12.0版本。 官网下载地址:https://www.elastic.co/cn/downloads/past-releas…

WEB攻防-ASP中间件IIS 短文件名探针安全漏洞

IIS短文件名探针安全漏洞是一个与IIS(Internet Information Services)服务相关的安全问题。该漏洞主要是由于HTTP请求中使用了旧DOS 8.3名称约定(SFN)的代字符(〜)波浪号,这使得远程攻击者有可能…

Xilinx FPGA BGA推荐设计规则和策略(二)

引言:上一篇介绍了BGA封装PCB层数估计、BGA焊盘设计、过孔设计、信号走线等内容,本文我们介绍下FPGA BGA封装电源管脚布线。 1. 概述 工程师必须在设计阶段早期评估功率需求,以确保有足够的层和面积为需要功率的BGA焊盘提供足够的功率。因为…

深入探索GDB:Linux下强大的调试神器

目录 一、GDB简介:源码级调试的基石 二、GDB基础操作:从入门到熟练 启动与基本命令 三、GDB进阶功能:解锁更深层次的调试能力 1. 回溯追踪:洞察调用栈 2. 动态内存检测:揪出内存问题 3. 条件断点与观察点&#…