【编译、链接、装载四】汇编知识补充——ATT 汇编语法、寄存器、指令、栈、栈帧

news2024/12/23 22:38:40

【编译和链接四】编译器后端——生成汇编代码

  • 一、AT&T 汇编语法
    • 1、Intel 汇编
    • 2、AT&T汇编
  • 二、x86寄存器
    • 1、x86通用寄存器
    • 2.其他寄存器
    • 3、寄存器的具体用途
  • 三、常见的x86指令
  • 四、栈和栈帧

在这里插入图片描述

一、AT&T 汇编语法

AT&T VS Intel
基于 x86 架构 的处理器所使用的汇编指令一般有两种格式.

1、Intel 汇编

DOS(8086处理器), Windows
Windows 派系 -> VC 编译器

2、AT&T汇编

Linux, Unix, Mac OS, iOS(模拟器)
Unix派系 -> GCC编译器

在这里插入图片描述

汇编语言知多少(四): AT&T 汇编语法

二、x86寄存器

  • 寄存器非常小,可以快速访问位于CPU的存储器。某些寄存器有特殊用途,如跟踪当前执行地址的指令指针(EIP/RIP)或跟踪栈顶的栈指针(ESP/RSP)。其他的寄存器主要是通用存储单元,用来存储CPU执行程序时用到的变量。

  • x86基于原始的8086指令集,寄存器是16位宽,而32位x86 ISA将这些寄存器扩展为32位,然后x86-64再将它们进一步扩展为64位。为了保证向后兼容,新指令集中使用的寄存器是旧寄存器的超集。

在汇编中指定寄存器操作数,需要使用寄存器的名称,如mov rax,64将64赋给rax寄存器。图A-2显示了如何将x86-64 rax寄存器细分为传统的32位和16位寄存器,rax的低32位形成一个名为eax的寄存器,其低16位形成一个原始的8086寄存器ax。读者可以通过寄存器名称al访问ax的低字节,通过ah访问ax的高字节。

在这里插入图片描述

1、x86通用寄存器

栈指针(rsp)和基址指针(rbp)被认为是特殊寄存器,因为它们用来跟踪栈的布局,当然原则上你也可以将它们作为通用寄存器。
在这里插入图片描述

2.其他寄存器

除表A-2中所示的寄存器外,x86 CPU还包含其他非通用寄存器,最重要的两个是rip(在32位x86上称为eip,在8086上称为ip)和rflag(在较早的ISA中称为eflag或者标志寄存器)。rip指令指针始终指向下一条指令的地址,并且由CPU自动设置,无法手动干预。

3、寄存器的具体用途

%rax 作为函数返回值使用.
%rsp 指向栈顶.
%rdi, %rsi, %rdx, %rcx, %r8, %r9, %r10等寄存器用于存放函数参数.

  • 内存操作数

内存操作数指的是一个内存地址,CPU 在这个地址获取单个或多字节。x86 ISA对每条指令只支持一个显式内存操作数,也就是说你不能在一条指令中直接将一个值从一个内存地址移动到另一个内存地址,你必须使用寄存器作为中间存储。

在x86中,可以用[base+index*scale+displacement]指定内存操作数,其中base和index是64位寄存器,scale(比例)是1、2、4或8的整数值,而displacement(偏移)是32位常量或符号,所有这些组件都是可选的。CPU计算内存操作数表达式的结果,得到最终的内存地址,base、index和scale均在指令SIB字节中得到表达,而displacement在同名数据域得到表达。scale默认为1,displacement默认为0。

这些内存操作数格式足够灵活,可以直接使用许多常见的代码范例,如可以使用mov eax,DWORD PTR [rax*4+arr]之类的指令访问数组元素,其中arr是数组起始地址的偏移,rax是访问的数组元素的索引值,每个数组元素长度为4字节,DWORD PTR告诉汇编程序要从内存中获取4字节(双字或DWORD)。同样,访问结构域的一种方法是将结构的起始地址存储在基址寄存器,并添加要访问的域的偏移。

  • 立即数

立即数就是指令中硬编码的常量整数操作数,如指令add rax,42,42就是一个立即数。

在x86上,立即数以小端格式编码,多字节整数的最低有效字节排在内存中的第一位。换句话说,如果编写像mov ecx,0x10203040这样的程序集指令,相应的机器指令会将指令编码为0x40302010。

参考x86汇编快速入门

三、常见的x86指令

表A-3描述了常见的x86指令。要了解更多未在此表列出的指令,请参考Intel手册或者相应网站。表A-3中列出的大多数指令都是不言自明的,但有些需要更详细的描述。

表A-3 常见的x86指令

  • 数据传输
指令描述
❶ mov dst,src将src赋给dst
xchg dst1,dst2互换dst1和dst2
❷ push src将src压栈,并递减rsp
pop dst出栈赋给dst,并递增rsp
  • 算术
指令描述
add dst, srcdst +=src
sub dst, srcdst –= src
inc dstdst += 1
dec dstdst –= 1
neg dstdst = –dst
❸ cmp src1, src2根据src1−src2设置状态标志位
  • 逻辑/按位
指令描述
and dst, srcdst &= src
or dst, srcdst
xor dst, srcdst ˆ= src
not dstdst = ~dst
❹ test src1, src2根据src1 & src2设置状态标志位
  • 无条件分支
指令描述
jmp addr跳转到地址
call addr压入返回地址到栈上,然后调用函数地址
ret从栈上弹出返回地址,然后跳转到该地址
❺ syscall进入内核执行系统调用
  • 跳转分支(基于状态标志位)jcc addr仅在条件cc成立时才跳转到该地址,否则进入jncc相反条件,在条件cc不成立时跳转
指令描述
❻ je addr / jz addr如果设置ZF零标志位则跳转(如当上一个cmp中的操作数相同时)
ja addr上一次比较中,如果dst大于src则跳转(无符号)
jb addr上一次比较中,如果dst小于src则跳转(无符号)
jg addr上一次比较中,如果dst大于src则跳转(有符号)
jl addr上一次比较中,如果dst小于src则跳转(有符号)
jge addr上一次比较中,如果dst大于等于src则跳转(有符号)
jle addr上一次比较中,如果dst小于等于src则跳转(有符号)
js addr上一次比较中,如果结果为负则跳转,符号位置1
  • 杂项
指令描述
❼ lea dst, src将内存地址加载到dst中,(dst=&src,其中src必须在内存)
nop空指令,不执行操作(用作代码填充)
  • mov
    MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
# 调整rbp寄存器,使其指向main函数栈帧的起始位置
mov    %rsp,%rbp
  • push
push   %rbp  # 保存调用者的rbp寄存器的值
  • ret
    相当于pop IP

详见汇编常见指令

四、栈和栈帧

参考栈和栈帧

堆栈(stack)又称为栈或堆叠,是计算机科学里最重要且最基础的数据结构之一,它按照FILO(First In Last Out,后进先出)的原则存储数据。

  • 栈的相关概念:
    • 栈顶和栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
    • 压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
    • 弹栈:栈的删除操作,也叫做出栈。

下面是栈的示意图,从图中可以清楚的看到,不管是插入数据还是删除数据,都是在栈顶进行的,还有就是FILO原则,可以看到,如果你想取出B的值,那么你必须先要将B的上面的C取出,要取出C的值,就得取出C上面的值,以此类推。
在这里插入图片描述

从技术上说,栈就是CPU寄存器里的某个指针所指向的一片内存区域。这里所说的“某个指针”通常位于x86/x64平台的ESP寄存器/RSP寄存器,以及ARM平台的SP寄存器。

操作栈的最常见的指令时PUSH(压栈)和POP(弹栈)。PUSH指令会对ESP/RSP/SP寄存器的值进行减法运算,使之减去4(32位)或8(64位),然后将操作数写到上述寄存器里的指针所指向的内存中。

POP指令是PUSH指令的逆操作:它先从栈指针指向的内存中读取数据,用以备用(通常是写到其他寄存器里),然后再将栈指针的数值加上4或8.

下图演示了x86平台下的push指令和pop指令,指令push Z,首先ESP的值-4,然后将Z的值写入新的ESP所指的内存中,指令pop eax,先将Z的值存入EAX寄存器,然后进行ESP+4。指令POP EBX,首先将栈顶元素存入EBX,然后ESP+4。
在这里插入图片描述

栈在进程中的作用如下:
暂时保存函数内的局部变量。
调用函数时传递参数。
保存函数返回的地址。

栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。简言之,栈帧就是利用EBP(栈帧指针,请注意不是ESP)寄存器访问局部变量、参数、函数返回地址等的手段。

;栈帧结构
PUSH EBP            ;函数开始(使用EBP前先把已有值保存到栈中)
MOV EBP, ESP        ;保存当前ESP到EBP中

...                 ;函数体
                    ;无论ESP值如何变化,EBP都保持不变,可以安全访问函数的局部变量、参数

MOV ESP, EBP        ;将函数的起始地址返回到ESP中
POP EBP             ;函数返回前弹出保存在栈中的值
RETN                ;函数终止

每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧(stack frame)。每个独立的栈帧一般包括:

  • 函数的返回地址和参数
  • 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量函数调用的上下文
  • 栈是从高地址向低地址延伸,一个函数的栈帧用EBP和ESP这两个寄存器来划定范围。EBP指向当前栈帧的底部,ESP始终指向栈帧的顶部。

EBP寄存器又被称为帧指针(Frame Pointer)
ESP寄存器又被称为栈指针(Stack Pointer)

一个很常见的活动记录示例如图所示
在这里插入图片描述

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

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

相关文章

PyCaret初学者指南

🚀分类 PyCaret的分类模块是一个监督机器学习模块,用于将元素分类到组中。 目标是预测离散和无序的类别标签。一些常见的用例包括预测客户违约(是或否)、预测客户流失(客户将离开或留下)、发现疾病&#x…

深入理解深度学习——注意力机制(Attention Mechanism):基础知识

分类目录:《深入理解深度学习》总目录 相关文章: 注意力机制(AttentionMechanism):基础知识 注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

『DevOps』如何使用 Webhook 在 Jenkins 项目中实现自动构建

📣读完这篇文章里你能收获到 全文采用图文形式讲解在Jenkins配置Webhook实现代码推送时Jenkins自动构建感谢点赞收藏,避免下次找不到~ 文章目录 一、插件安装及配置1. 安装Generic Webhook Trigger Plugin2. 配置Webhook接收器 二、代码托管平台设置1. …

从新手到专家——我对于计算机科学专业的经验分享

在我的计算机科学专业学习之旅中,我遇到了无数的难题和挑战,但也因此积累了许多宝贵的经验。今天,我想要分享我在这个领域中的经验和看法,希望能够对即将进入计算机科学专业的后辈们有所帮助。 坚持动手实践 计算机科学是一个实…

Python调试串口设备Ortec 974A

Ortec 974A四通道100HMz计时/计数器的介绍在以下连接中: O​​​​​​​Ortec -- 974A 四通道100-MHz计时器/计数器_yuyuyuliang00的博客-CSDN博客 1、调试准备工作 1)一个串口服务器 根据Ortec 974A的串行通信参数,对串口服务器进行设…

【手撕MyBatis源码】MyBatis映射体系

文章目录 映射工具MetaObject基本功能底层结构获取属性值的流程 ResultMap结果集映射手动映射自动映射 嵌套子查询循环依赖懒加载原理内部结构Bean代理过程 联合查询和嵌套映射映射说明联合查询1对1查询映射1对多查询RowKey创建机制结果集解析流程 映射工具MetaObject 所谓映射…

【4】Midjourney常用技巧

【常用技巧】 本篇主要讲述MJ的常用技巧,围绕着一些常用指令的使用方法展开。 【版本切换】 在使用MJ时,最常用的技巧之一是版本切换。你可以在输入提示后添加"--v"加上相应的数字来实现版本切换。通常我默认使用MJ 4,偶尔会使用…

《精通特征工程》学习笔记(2):文本数据:扁平化、过滤和分块

1.元素袋:将自然文本转换为扁平向量 1.1 词袋 词袋将一个文本文档转换为一个扁平向量。之所以说这个向量是“扁平”的,是因为它 文本数据:扁平化、过滤和分块|35不包含原始文本中的任何结构。原始文本是一个单词序列&#xff0c…

【小沐学Python】Python实现绘画(海龟turtle)

文章目录 1、简介2、接口说明2.1 海龟动作2.1.1 移动和绘制2.1.2 获取海龟的状态 2.2 画笔控制2.2.1 绘图状态2.2.2 颜色控制2.2.3 填充2.2.4 更多绘图控制 2.3 TurtleScreen/Screen 方法2.3.1 窗口控制2.3.2 使用屏幕事件2.3.3 Screen 专有方法 3、示例测试3.1 Turtle star3.2…

[starrocks BE] 启动报错问题记录

文章目录 一、一句话描述二、问题表象1. starrocks_be的启动现象:2. starrocks_fe的启动现象 一、一句话描述 starrocks部署在没有AVX2指令集的机器上导致部署失败,解决方式更换支持AVX2指令集的机器。 官方说明: 二、问题表象 starrocks所…

Rocket面试(五)Rocketmq发生流量控制的情况有哪些?

在使用rocketmq过程中总能看见一下异常 [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 206ms, size of queue: 5这是因为Rocketmq出发了流量控制。 触发流量控制就是为了防止Broker压力过大挂掉。主要分为Broker流控,Consu…

全志V3S嵌入式驱动开发(开发环境再升级)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们陆陆续续开发了差不多有10个驱动,涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的…

【MySQL 数据库】8、视图

目录 一、什么是视图二、视图语法三、检查选项(1) cascaded(级联)(2) local 四、视图的作用五、视图案例 一、什么是视图 视图(View)是一种虚拟存在的表视图中的数据并不在数据库中真实存在行和列数据来自定义视图的查询中使用的…

一棵有点自律的树——搜索二叉树

文章目录 💐专栏导读💐文章导读🌷搜索二叉树概念🌷二叉搜索树的构建🌺查找操作🌺插入操作🌺删除操作🌺遍历操作☘️测试 🏵️拓展——递归实现🍃递归查找&…

数据结构与算法·第9章【查找】

概念 关键字: 是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。若此关键字能识别…

2.3 利用MyBatis实现关联查询

一、创建数据库表 1、创建教师表 执行SQL语句,创建教师表t_teacher CREATE TABLE t_teacher ( t_id int(11) NOT NULL AUTO_INCREMENT, t_name varchar(20) DEFAULT NULL, PRIMARY KEY (t_id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4;执行SQL语句…

使用OpenFlow和Ryu控制器实现网络交换机的软件定义网络(SDN)控制

使用OpenFlow和Ryu控制器实现网络交换机的软件定义网络(SDN)控制 (1)环境介绍 硬件环境:系统最低要求为2个CPU 、2 GB内存。 拓扑介绍:云平台具体安装拓扑如图5-4所示。 图5-4 云平台安装拓扑 搭建云平…

使用pipreqs生成requirements文件,并在服务器(矩池云)上通过requirements文件安装环境采坑记录

目录 问题描述问题1:问题2:发现问题问题解决 问题3:问题4:问题5:解决方案 关键!!!正常安装成功的操作流程备注1.我为何不在vscode的终端中装pipreqs包?2.在vscode终端中输…

Spring Cloud构建微服务架构:服务注册与发现

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。 Spring Cloud包…

面了一个来华为要22K的人,啥都不会,还不如找个应届生来代替···

最近有个在华为的朋友跟我分享了他面试招人的过程,感觉华为还是挺难进的。面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试。 其实,第一轮的电话面试除…