• X86-64汇编,寄存器,栈帧杂记


    正文

    Intel汇编与At&t汇编区别

    AT&T的立即数前面有修饰符号$. e.g. $4
    Intel的立即数不需要修饰 e.g. 4

    AT&T寄存器名称前有修饰符号% e.g. movl $4, %eax
    Intel寄存器名称不需要修饰 e.g. mov eax, 4

    AT&T的源操作数在左边,目的操作数在右边 命令表示为 opt src to dst
    e.g. movl $4, %eax
    Intel的目的操作数在左边,源操作数在右边 命令表示为 opt dst from src
    e.g. mov eax, 4

    AT&T的命令字有数据长度修饰符号
    e.g. movl %ebx, 4
    Intel的命令字没有修饰符号,而是提供了单独的命令字或在操作数中给定数据长度
    e.g. mov eax, dword ptr val_to_eax

    AT&T跳转时,将段和偏移当作不同的操作数
    e.g. ljmp $segment, $offset
    Intel语法将段和偏移当成一个操作数
    e.g. jmp segment:offset

    1.mov

    mov的原型

    mov dest source
    

    mov通过[]访问内存与地址, []和c一样表示,取eax地址对应的空间

    mov [eax], rbx
    

    对于一些八位的内存空间地址的大小,可以使用类似QWORD PTR的标识符标志出来

    mov QWORD PTR [eax], rbx
    

    如果要使用段寄存器,在括号外使用:标志段偏移,如下,表示的是将rbx的值放到[fs + eax]对应空间

    mov QWORD PTR fs:[eax], rbx
    

    2.intel汇编的参数寄存器传递

    参数传递会使用六个寄存器:
    %rdi
    %rsi
    %rdx
    %rcx
    %r8
    %r9

    返回值寄存器: %rax

    3.段寄存器

    cs: 代码段寄存器
    ds: 数据段寄存器
    ss: 堆栈段寄存器
    es: 扩展段寄存器
    fs: 标志段寄存器
    gs: 全局段寄存器

    4.test %rax %rax

    用来判断 %rax是否为0,test指令本来是让后面两个数做AND操作,然后根据结果去设置ZF位的,如果%rax的值为0,那么zs这个的标志就为1,

    5.函数栈帧调用过程

    其中关于%esp的值,指向的是当前正在使用的地址而不是下一个未使用的地址,但是注意到栈是从顶往下的,%esp指向的是使用的内存空间的低地址

    ref

    https://blog.csdn.net/u013737447/article/details/49154509
    x86 寄存器: https://www.cnblogs.com/tongyishu/p/11679829.html
    第4部分-Linux x86 64位汇编Intel汇编语法三
    x86通用寄存器
    x86栈帧原理

  • 相关阅读:
    算法导论读书笔记(未完成)
    工作心理学(未完成)
    面试疑难点解析
    aop难点解析。
    Mybatis框架解析之Builder解析
    HashMap原理总结
    编程基础的重要性(程序员之路)
    Java HashMap详解
    Java源码分析系列之HttpServletRequest源码分析
    JFinal源码 分析之 Core包分析
  • 原文地址:https://www.cnblogs.com/ishen/p/12266688.html
Copyright © 2020-2023  润新知