Skip to content

cpp assembly

ShenYj edited this page Jul 30, 2023 · 1 revision

汇编

笔记内容大纲

汇编语言的种类

  • 8086 汇编 (16bit)
  • x86 汇编 (32bit)
  • x64 汇编 (64bit)
  • ARM 汇编 (嵌入式、移动设备)

书写格式

x64汇编根据编译器的不同,有2种书写格式

  • Intel (Windows平台)

  • AT&T (Mac平台、GCC编译器)

    .

    汇编不区分大小写

x64汇编

.

最常用的通用寄存器

64bit RAX、RBX、RCX、RDX

32bit EAX、EBX、ECX、EDX

16bit AX、BX、CX、DX

  • 其他通用寄存器是后期增加的

  • x64是兼容以前的寄存器的,将64bit寄存器的一半(低位)拿出来作为32bit寄存器, 所以在调试时还会看到 EAX 寄存器

    RAX 拆成两半,低位4个字节就是 EAX,以此方式 32bit 又可以继续向前兼容

一般规律

  • R开头的寄存器是64bit的,占8字节
  • E开头的寄存器是32bit的,占4字节

内联汇编

在 C++ 代码中编写汇编代码,称为内联汇编

  • 示例

    int main() {}
    
        int a = 10;
    
        __asm {
            mov eax, a
        }
    
        return 0;
    }

x64汇编要点总结

  • mov dest, src

    将src的内容赋值给dest,类似于 dest = src

  • [ 地址值 ]

    • 中括号[ ]里面放的都是内存地址
    • 通常固定写法: word ptr [], ptr 是固定写法, prt左侧用来指定单位,通常由低向高吞并占用
  • word是2字节,dword 是4字节(double word),qword 是8字节(quad word)

  • call 函数地址

    调用函数

  • lea dest, [ 地址值 ]

    • load effect address, 将地址值赋值给dest,类似于 dest = 地址值
  • ret

    函数返回

  • xor op1, op2

    • 将 op1 和 op2 异或的结果赋值给 op1,类似于 op1 = op1 ^ op2
  • add op1, op2

    类似于op1 = op1 + op2

  • sub op1, op2

    类似于op1 = op1 - op2

  • inc op

    increase 自增,类似于op = op + 1

  • dec op

    decrease 自减,类似于op = op – 1

  • jmp 内存地址

    • 跳转到某个内存地址去执行代码
    • j 开头的一般都是跳转,大多数是带条件的跳转,一般跟test、cmp等指令配合使用

Getting Started

Social

Clone this wiki locally