C语言反汇编用到的AT&T x86汇编语法

参考:CSDN1,CSDN2

默认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语法的更多相关文章

  1. [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  2. 基础常用JS函数和语法

    100多个基础常用JS函数和语法集合大全  来源:http://www.cnblogs.com/hnyei/p/4605103.html 网站特效离不开脚本,javascript是最常用的脚本语言,我 ...

  3. 【数据库】 SQL 常用语句之系统语法

    [数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...

  4. Linux系列教程(六)——Linux常用命令之文件搜索命令

    前一篇博客我们讲解了Linux链接命令和权限管理命令, 通过 ln -s  链接名 表示创建软链接,不加-s表示创建硬链接:还有三个更改权限的命令,chmod命令可以更改文件或目录权限,chown命令 ...

  5. VS2013中反汇编常用指令理解

    最近复习C语言,对反汇编感兴趣,就用下图举例解释一下我的理解,如有错还请大佬指教. 首先,认识两个常用指令 :   lea ---> 取地址赋值      mov ---> (同类型)赋值 ...

  6. 第三十六章 Linux常用性能检测的指令

    作为一个Linux运维人员,介绍下常用的性能检测指令! 一.uptime 命令返回的信息: 19:08:17              //系统当前时间 up 127 days,  3:00     ...

  7. 十六、C# 常用集合类及构建自定义集合(使用迭代器)

    常用集合类及构建自定义集合 1.更多集合接口:IList<T>.IDictionary<TKey,TValue>.IComparable<T>.ICollectio ...

  8. SpringBoot | 第六章:常用注解介绍及简单使用

    前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志配置等.这章节开始,开始总结一些关于springboot的综合开发的知识点.由于SpringBoot本身是基于Sprin ...

  9. 第六课 Html5常用标签 html5学习1

    HTML标签的认识一.标签的分类1.双标签 如<html> </html>2.单标签 如<br \> 换行标签 二.标签的关系1.嵌套关系 如<head> ...

  10. 深度学习(六)keras常用函数学习

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9769301.html Keras是什么? Keras:基于Theano和TensorFlow的 ...

随机推荐

  1. 统一建模语言UML---类图

    什么是统一建模语言,来看看百科中的介绍统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明.可视化和编制文档的一种标准语言,是非专利的第三代建模 ...

  2. 2022CSP-J初赛游记

    2022年9月16日: 下午,在学校集训,刘洋让我看了一下时间,突然发现,距离初赛就剩2天了...... 晚上,辅导班的老师对我们进行最后的培训,做了2套有道小图灵模拟题,但是做的不理想,很慌. 20 ...

  3. haproxy + keeplived

    两台主机: 192.168.2.163 192.168.2.165 # yum安装haproxy yum install haproxy # cat /etc/haproxy/haproxy.cfg ...

  4. Loki 简明教程

    文章转载参考自:https://jishuin.proginn.com/p/763bfbd2ac34 Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日 ...

  5. CAS核心思想、底层实现

    ★ 1.CAS 是什么 CAS 是比较并交换,是实现并发算法时常用到的一种技术.当内存的值和期望的值相等时,进行更新,否则 什么都不做 或 重来 . CAS 的底层实现:是靠硬件实现的,靠硬件的原子性 ...

  6. 两道超有意思的 CSS 面试题,试试你的基础

    今天在论坛,有看到这样一道非常有意思的题目,简单的代码如下: <div> <p id="a">First Paragraph</p> </ ...

  7. MES与工业互联网的关联边界在哪里?

    MES和工业互联网本不存在关联边界,如果有,那也只是MES包括在工业互联网中,是工业互联网的一部分.二者本来就是处于两个不同维度提出来的概念.MES是从信息系统维度提出来的,上承ERP.下接PCS的制 ...

  8. [Android开发学iOS系列] ViewController

    iOS ViewController 写UIKit的代码, ViewController是离不开的. 本文试图讲讲它的基本知识, 不是很深入且有点杂乱, 供初级选手和跨技术栈同学参考. What is ...

  9. 2022-08-14-esp32把玩记-③_轻轻松松显示个二维码(esp32+ssd1306显示图片)

    layout: post cid: 9 title: esp32把玩记-③ 轻轻松松显示个二维码(esp32+ssd1306显示图片) slug: 9 date: 2022/08/14 09:22:0 ...

  10. 微信小程序专题(二)-----微信openid的获取

    一,简单来讲就是以下流程 通过get方式获取信息 在前端调用wx.login() 获取 临时登录凭证code之后,将code字符串发送给后端,后端通过auth.code2Session接口获取用户唯一 ...