C温故补缺(六):C反汇编常用的AT&Tx86语法
C语言反汇编用到的AT&T x86汇编语法
默认gcc -S汇编出的,以及反汇编出的,都是AT&T x86代码,可以用-masm=intel指定为intel x86汇编格式
gcc -S test.c -masm=intel -o test.s
有时编译器会自动优化汇编代码,导致得到的汇编与源程序不对应,可以用-O0参数关闭优化
gcc -S test.c -O0 -o test.s
指令的长度后缀
AT&T语法要求在指令后面加上后缀表示长度,根据操作的是1字节,2字节,4字节,8字节,分别对应后缀b,w,l,q,即byte(1字节),word(1个字),long word(双字),quad word(四字)
跳转和函数调用指令的语法

寄存器:跳转到寄存器%rax内容对应的地址,不是
jmpq %rax,而是jmpq *%rax立即数:直接跳,不用加*号
内存:如果想跳到
%rip+0x10内存对应的地址,用jmpq *0x10(%rip)
指令寄存器相对寻址(%rip-relative)
在x86_64汇编中,可以使用指令寄存器IP相对寻址这种方式来定位全局变量和函数
如:
static int i;
int f(){
i=i+4;
return i;
}
movl i(%rip), %eax
addl $4, %eax
movl %eax, i(%rip)
movl i(%rip), %eax
就是通过%rip寻址的
各个section
.test:存放代码对应的指令
.bss:存放未初始化的全局和静态变量,在运行时该区域初始全是0, .bss有时也会用.comm或.locomm
如:
static int i;
.file "test.c"
.text
.lcomm i,4,4
- .rodata:存放只读数据和变量,如字符串字面量
- .data存放余下的数据和变量,可读可写

寄存器
分类:
通用寄存器(A/B/C/DX,BP,SP,DI,SP等)
状态和控制寄存器RFLAGS
指令寄存器RIP
XMM寄存器
浮点控制和状态寄存器MXCSR
等等

通用寄存器
主要用于算数,逻辑,比较运算,数据转移,地址计算,存放临时变量等

一个通用寄存器有4种用法,以RAX为例:
可以被当作RAX,64位
可以被当作EAX,32位
可以被当作AX,16位
可以被当作AL,8位
具体作用分类:

RFLAGS寄存器
RFLAGS和8086的FLAGS寄存器类似,也是用来存不同标记和状态的,但它是64位的,远比8086长,但常用的也就是那几个
常用的标记位:
进位标志位CF
溢出标志位OF
奇偶校验位PF
符号标志位SF
零标志位ZF
指令寄存器IP
指令寄存器RIP包含下一条将要被执行的指令的逻辑地址,通常情况下,每取出一条指令后,RIP会自动指向下一条指令,但遇到call和ret时,RIP会被修改
浮点数寄存器XMM/YMM/ZMM
XMM0-XMM15是一系列128位寄存器,用于
32位和64位浮点数的操作
SIMD指令:SIMD即Single Instruction Multiple Data,一条SIMD指令可以同时接受多个数据流
有效地址
$EffectiveAddress=BaseReg+IndexReg*ScaleFactor+Disp$
其中:
Basereg是基址寄存器,可以是任意一个通用寄存器
IndexReg是索引寄存器,可以是处理rsp之外的任一寄存器
ScaleFactor的取值可以是1,2,4,8
Disp是偏移量
最终得到的有效地址是64位的
各种寻址方式

Disp:访问全局变量或静态变量通常使用
BaseReg:常用于指针获取对应变量的值
BaseReg+Disp:常用于某种数据结构中的某个成员
IndexReg*SF+Disp:用于数组
指令集


栈指令
push和pop
push R:
先将栈顶指令rsp减去8(8字节)
然后将R中目标操作数放入更新后的rsp所指向的地址处
pop R:
先将当前rsp所指的内容弹出到指定寄存器R
然后将rsp加8
call和ret
call f:
先将rip入栈,
push %rip再将函数f的第一条指令的地址赋给ip,
mov f,%rip
ret:
弹出当前栈顶的地址到rip,
pop %rip继续执行
C温故补缺(六):C反汇编常用的AT&Tx86语法的更多相关文章
- [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- 基础常用JS函数和语法
100多个基础常用JS函数和语法集合大全 来源:http://www.cnblogs.com/hnyei/p/4605103.html 网站特效离不开脚本,javascript是最常用的脚本语言,我 ...
- 【数据库】 SQL 常用语句之系统语法
[数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...
- Linux系列教程(六)——Linux常用命令之文件搜索命令
前一篇博客我们讲解了Linux链接命令和权限管理命令, 通过 ln -s 链接名 表示创建软链接,不加-s表示创建硬链接:还有三个更改权限的命令,chmod命令可以更改文件或目录权限,chown命令 ...
- VS2013中反汇编常用指令理解
最近复习C语言,对反汇编感兴趣,就用下图举例解释一下我的理解,如有错还请大佬指教. 首先,认识两个常用指令 : lea ---> 取地址赋值 mov ---> (同类型)赋值 ...
- 第三十六章 Linux常用性能检测的指令
作为一个Linux运维人员,介绍下常用的性能检测指令! 一.uptime 命令返回的信息: 19:08:17 //系统当前时间 up 127 days, 3:00 ...
- 十六、C# 常用集合类及构建自定义集合(使用迭代器)
常用集合类及构建自定义集合 1.更多集合接口:IList<T>.IDictionary<TKey,TValue>.IComparable<T>.ICollectio ...
- SpringBoot | 第六章:常用注解介绍及简单使用
前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Sprin ...
- 第六课 Html5常用标签 html5学习1
HTML标签的认识一.标签的分类1.双标签 如<html> </html>2.单标签 如<br \> 换行标签 二.标签的关系1.嵌套关系 如<head> ...
- 深度学习(六)keras常用函数学习
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9769301.html Keras是什么? Keras:基于Theano和TensorFlow的 ...
随机推荐
- 电商平台物流模块自建OR对接第三方物流平台
前沿 近几年来,电商行业竞争变得愈加激烈,公域流量获客成本越来越高,电商平台规则也越来越严格,数据无法出塔,商家无法自主运营用户群等等原因,很多大品牌纷纷开始搭建自有商城,运营私域流量,以此来降低 ...
- Go语言学习的坑爹历程
鄙人暑期实习,需要用Go语言进行编程 在go语言中,结构体的定义只支持变量的声明,成员函数是采用"接口方法"来实现的 留一个成员定义的模板在此 package main impor ...
- 以软件定义物联网芯片,以技术融合推动LPWAN2.0泛在物联
作为数字化产业重要的基础设施之一,物联网迎来了黄金发展期.物联网通信技术通过数据的采集.分析.输出,从浅层次的互联工具和产品深化,到成为重塑生产组织方式的基础设施和关键要素,正深刻地改变着传统产业形态 ...
- 使用SSH连接Windows Server
之前发过一篇在Windows Server上启用SSH服务器的文章.最近正好有这个需求,需要使用密钥免密登录服务器,试了一下,发现之前的方法不行了.需要再修正一些文件权限. 需要使用Repair-Au ...
- 第六章:Django 综合篇 - 13:发送邮件
在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件. 所有的功能都在django.core.mail中. ...
- mongodb集群搭建(分片+副本)开启安全认证
关于安全认证得总结: 这个讲述的步骤也是先创建超管用户,关闭服务,然后生成密钥文件,开启安全认证,启动服务 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server ...
- EasyExcel实现文件导入
导入 准备工作 见:https://www.cnblogs.com/wywblogs/p/16095576.html 异步导入 接口代码 public Map importMemberList(@Re ...
- 浅谈-动态路由之OSPF的理解
路由 在网络中,路由相当于就是一张地图,让路由器知道这个对应的IP数据包应该往哪端口.网段走:而这个"地图"我们称之为路由表,不同的目的IP路由表的下一个跳也不同,其生成方式有又有 ...
- Mysql编程中遇到的小错误
我在mysql中创建的数据库表语句为如下 create table grade (id int not null, name varchar(255), desc varchar(255), prim ...
- FluentValidation 验证(一):WebApi 中使用 基本使用
FluentValidation.AspNetCore 引入包 public class Login2RequestValidator : AbstractValidator<Login2Req ...