代码
机器代码
程序计数器(PC)%rip给出将要执行的下一条指令在内存中的地址
整数寄存器文件包含16个命名的位置,储存地址或者整数数据。
条件码寄存器保存最近执行的算术或逻辑指令的状态信息。实现控制或数据流中的条件变化。
一组向量寄存器可以存放一个或多个整数或浮点数值
虚拟地址(64位)的高十六位必须设置为0
查看汇编代码(—>test.s)
1
linux> gcc -Og -S test.c
编译并汇编该代码(—>test.o)
1
linux> gcc -Og -c test.c
GCC产生的汇编代码指令上有后缀,而反汇编代码没有,x86-64的内存引用都是四字长寄存器给出。
反汇编器:根据机器代码生成一种类似于汇编代码的格式。
查看机器代码文件的内容:
1 | linux> objdump -d matore.o |
访问信息
整数寄存器:
操作数指示符
立即数:常数 ($(C常数表示法))
寄存器:某个寄存器的内容
内存引用:根据计算出的地址,访问地址
数据传送指令
MOV类:把数据从源位置复制到目的位置
源操作数是一个储存在寄存器或者内存中的立即数
目的操作数是个寄存器或者内存地址(位置),不能是立即数寻址
x86-64:两操作数不能都指向内存位置。
指令 | 描述 |
---|---|
movb(8) | 传送字节 |
movw(16) | 传送字 |
movl(32) | 传送双字,以寄存器为目的时,把寄存器高位4字节设置为0 |
movq(64) | 传送四字 |
movabsq | 传送绝对的四字 |
字节传送指令比较(16进制)
指令 | 描述 |
---|---|
movb | 不改变其他字节 |
movsbq | 把其他字节设为FF |
movzbq | 把其他字节设为00 |
压入和弹出栈数据
pushq:把数据压入到栈上
popq:弹出数据
%rsp:栈指针,保存栈顶元素地址
压入四字节:先减去8(栈倒过来放),然后将值写入新的栈顶地址。
1 | subq $8,%rsp |
弹出四字节:读出数据,加上8
1 | movq(%rsp),%rax |