机器字长
x86是32位系统
64是64位系统
这里的32和64,指的都是机器字长
机器字长是
- 能直接进行整数/位运算的大小
- 指针的大小(索引内存的范围)
8位机
由于空间大小限制,想要把集成电路做到个人主机里,只能用8位字长的
16位机
8086 IBMPC
32位机
Intel x86
64位机
32位到64位中间度过了很长的时间
C语言int类型
ABI
Application Binary Interface
计算机中的ABI是指应用程序二进制接口,它是编译器和链接器遵守的一组规则,以让编译后的程序可以正常工作。ABI里包含很多方面的内容,比如函数的调用顺序、数据类型的表示、可执行文件的格式、虚拟地址空间布局等等。不同的处理器体系结构有不同的ABI规范,例如X86和X86_64。ABI对于程序的兼容性和效率有重要的影响。
需求
gcc clang 编译出的程序能否互相链接
gcc 不同版本下 编译出的程序能否互相链接
C 和 C++ 的代码能否互相链接
实现
在linux下的 cdecl
在win32下的 stdcall
汇编
esp寄存器
计算机的esp寄存器是一个用来存储栈顶地址的寄存器。它可以指向内存单元,也可以指向内存单元之间的缝隙。它的值会随着栈的入栈和出栈操作而改变。它可以帮助CPU从栈中读取数据或指针。
eip寄存器
计算机的eip寄存器是一个用来存储下一条指令地址的寄存器。它可以帮助CPU从内存中读取指令并执行。它的值会随着指令的执行而改变。它和esp寄存器的区别是,esp寄存器是用来存储栈顶地址的寄存器,而eip寄存器是用来存储指令地址的寄存器。
汇编指令 sub $0x18,%esp
- sub是减法指令,它表示将两个操作数相减,结果存放在第一个操作数中。
- $0x18是一个立即数,它表示十六进制的18,也就是十进制的24。
- %esp是一个寄存器,它表示栈指针,也就是指向栈顶的地址。
- sub $0x18,%esp表示将栈指针减去24,也就是向下移动栈顶24个字节,相当于在栈上分配了24个字节的空间。在32位汇编(x86架构)中,机器字长为32位,等于4字节,也就是向下移动了6个栈帧。
- 这个指令通常用于函数的开头,为函数的局部变量或参数预留空间。
eax寄存器
计算机的eax寄存器是:
- 一个32位的通用寄存器,用于临时存储数据和内存访问。
- 一个累加器,用于在乘法和除法指令中被自动调用。
- 一个返回函数结果的寄存器,在win32中,一般用于保存函数的返回值。
- 一个可以拆分的寄存器,它的低16位是ax,ax的高8位是ah,低8位是al。
- 是64位寄存器rax的低32位