X86汇编

x86汇编指令集包括x86-64(intel-64,amd64, emt64), x86-32, x86-16

内存模型

通用寄存器

X86-32

EAX        累加器(Accumulator), 用于乘、除、输入/输出等操作
EBX        基地址寄存器(Base Register), 作为存储器指针来使用
ECX        计数寄存器(Count Register), 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数

EDX        数据寄存器(Data Register), 在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址
EDI         目的变址寄存器(Destination Index)
ESI         源变址寄存器(Source Index)
               用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便

EBP        基址指针寄存器(Base Pointer)
ESP        堆栈指针寄存器(Stack Pointer)
               用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便

X86-64

X86-64通用寄存器
通用寄存器发展图

x86-32 CPU指令

push %x

前置操作:取出 ESP 寄存器里面的地址,将其减去4个字节(如果x是int),然后将新地址写入 ESP 寄存器
将x压入stack

call func

调用函数func

move %src, %dst

用于将一个src值写入某个寄存器dst

add %x, %y

用于将两个运算子x,y相加,并将结果写入第一个运算子x

pop %x

用于取出 Stack 最近一个写入的值(即最低位地址的值),并将这个值写入运算子指定的位置x, 然后会将 ESP 寄存器里面的地址加4 (如果是int)

ret

用于终止当前函数的执行,将运行权交还给上层函数

X86-64 CPU指令

寻址模式

指令后缀含义

单字母后缀决定自动多大数据

全局值(全局变量和函数)的引用直接使用名字,例如x或者printf;
常数使用带有美元符号的立即数,例如$56;
寄存器值的引用使用寄存器的名称,例如 %rbx;
间接寻址则是使用与寄存器中保存的地址值对应的内存中的值,例如,(%rsp) 表示%rsp指向的内存中的值;
相对基址寻址,则是把一个常数加到寄存器值上,例如 -16(%rcx)表示把%rcx指向的地址前移16个字节后对应的内存值;
相对基址寻址有很多复杂变种,例如-16(%rbx,%rcx,8)表示-16+%rbx+%rcx*8对应的地址的内存值,这种寻址模式在访问元素大小特殊的数组时很有用;

使用各种寻址模式加载一个64位值到%rax

基本算术指令

加ADD, 减SUB, 乘 IMUL 和 除IDIV

IMUL 指令稍有不同:它把%rax的值乘以操作数,把结果的低64位存在%rax,高64位放在%rdx (两个64位值相乘的结果是128位);

IDIV则相反,把128bit值(低64位在 %rax ,高64位在%rdx)除以指令中的操作数(为了正确处理负数,用CDQO 指令把%rax符号扩展到%rdx),商存储在%rax,余数在%rdx;

INC和DEC会把寄存器的值破坏掉,AND, OR, 和XOR以及NOT也会破坏寄存器的值

比较和跳转

JMP指令构造一个跳转,CMP指令比较两个不同的寄存器中的值,设置EFLAGS寄存器的比特位,记录下结果(大于,小于还是等于)。使用带条件的跳转指令根据EFLAGS完成相应跳转

带条件的跳转指令

JMP指令需要编译器生成目标标签(LABEL),标签必须唯一,并且是汇编文件内部私有,对外部不可见,除非有.globl指示。按C语言的说法,汇编中没有修饰的标签是static的,.globl修饰的标签是extern的

栈 stack

PUSH 、 POP,分别会把%rsp减去或者加上8

函数调用 Calling Functions

在大多数汇编程序中(X86-64不是),调用约定是简单的把每个参数都压栈,然后调用函数。被调用的函数从栈中获取参数,完成操作,把返回值保存到寄存器中并返回。调用方再把参数从栈pop出来(其实X86 32就是这样的)。

X86-64的调用方式有些不同,整个约定相当复杂,下面是简化版:
1. 整数参数(包含指针)依次放在%rdi, %rsi, %rdx, %rcx, %r8, 和 %r9 寄存器中。
2. 浮点参数依次放在寄存器%xmm0-%xmm7中。
3. 寄存器不够用时,参数放到栈中。
4. 可变参数哈函数(比如printf), 寄存器%eax需记录下浮点参数的个数。
5. 被调用的函数可以使用任何寄存器,但它必须保证%rbx, %rbp, %rsp, and %r12-%r15恢复到原来的值(如果它改变了它们的值)。
6. 返回值存储在 %eax中.

调用函数前,先要把参数放到寄存器中。然后,调用方要把寄存器%r10 和%r11的值保存到栈中。之后,执行CALL指令,把IP指针的值保存到栈中,并跳到函数的起始地址执行。从函数返回后,恢复%r10 和%r11,并从%eax获取返回值。

编译工具

gcc -S xxx.c 生成汇编指令

引用

http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
https://blog.csdn.net/pro_technician/article/details/78173777

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 1.地址总线,数据总线,控制总线在哪里,它们有什么作用?答:它们都是cpu连接外部组件的线路。地址总线:地址总线A...
    MagicalGuy阅读 1,348评论 0 1
  • x86处理器架构 寄存器 AX:通用寄存器,低8位为AL寄存器,高8位为AH寄存器。一般是累加寄存器。 BX:通用...
    ffusheng阅读 896评论 0 1
  • asm();括号里面每条指令后不加上\n\t会怎么样例如下面的代码exam_x86.c 内核完全注释上说是为了预处...
    sgy1993阅读 4,380评论 0 3
  • 第17章 x86汇编程序基础 本文是看17章的笔记。方便自己回顾。汇编基础知识可以看王爽的《汇编语言》本文环境我用...
    言十年阅读 421评论 0 1
  • 今天突然觉察到一个事实,2016年到现在我一至在找找好的学习方法,一直再研究如何去学习,确真真切切地忽略了“学习”...
    新自由阅读 214评论 0 1