网站建设:上海珍岛,怎么免费建设网站,网站服务器不稳定怎么办,网站外链接自己可以怎么做的机器字长
x86是32位系统 64是64位系统
这里的32和64#xff0c;指的都是机器字长
机器字长是
能直接进行整数/位运算的大小指针的大小(索引内存的范围) 容易与机器字长混淆的概念#xff1a;字 字
字存储字长 字是MDR寄存器的位数#xff0c;代表每个主存存储体中的存储…机器字长
x86是32位系统 64是64位系统
这里的32和64指的都是机器字长
机器字长是
能直接进行整数/位运算的大小指针的大小(索引内存的范围) 容易与机器字长混淆的概念字 字
字存储字长 字是MDR寄存器的位数代表每个主存存储体中的存储单元可以存放的数据位数
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位是axax的高8位是ah低8位是al。是64位寄存器rax的低32位
汇编指令 mov %esp%eax
esp指向的地址的值移动到eax指向的地址
汇编指令 lea 0x1c(%esp),%eax
lea是load effective address的缩写意思是加载有效地址。它的作用是把一个内存地址表达式的值而不是该地址处的内容存入一个寄存器。例如lea eax, [ebx4ecx]就是把ebx4ecx的结果一个地址值存入eax寄存器而不是把该地址处的数据存入eax寄存器。lea指令可以用来进行一些简单的算术运算比如乘法和加法。 lea 0x1c(%esp),%eax 就是把esp上移0x1c个地址(7个栈帧)然后把这个地址值传给eax
汇编指令 push %eax
汇编指令 push 是将源操作数复制到堆栈中同时减少栈指针 ESP 的值
就是把eax寄存器的值放到esp指向的栈帧地址然后把esp下移1个栈帧
而结合上一步lea的指令来看eax寄存器存放的是eap上移7个栈帧的地址
汇编指令 call 510 bar
把返回地址放到esp指向的位置然后esp下移1个栈帧。
寄存器 64位不再用堆栈去传递参数直接用6个参数寄存器去传递 rip寄存器
rip寄存器是一个64位的指令指针寄存器用来保存当前正在执行的指令的地址或下一条要执行的指令的地址。rip寄存器可以用来实现一种新的寻址模式称为rip相对寻址使用这个模式有效地址的计算方式变为rip指向下一条指令加上位移量。 汇编命令lea (%rdi,%rsi,1) %r9d。lea是load effective address的缩写意思是加载有效地址。它的作用是把一个内存地址计算出来然后存放到目的寄存器中2。它不会访问内存也不会改变标志位。在这个命令中%r9d是目的寄存器(%rdi,%rsi,1)是源操作数表示一个内存地址。这个地址的计算方法是把%rdi和%rsi的值相加然后乘以1即不变再加上一个偏移量如果有的话。在这里没有偏移量所以就是%rdi%rsi。所以这个命令的意思是把%rdi%rsi的结果存放到%r9d中。这个命令可能用于计算数组元素的地址或者进行简单的算术运算。 bss是计算机编程中的一个术语表示包含静态分配的未初始化变量的内存区域。bss的全称是block started by symbol源自IBM 704的汇编语言。bss区域通常不占用目标文件的空间而是由程序加载器在加载程序时分配内存。bss区域中的变量通常被初始化为零或空指针。在C语言中如果一个静态分配的对象没有显式的初始值它就会被放在bss区域。
inline assembly
inline assembly是一种编译器的特性它允许在C或C程序中使用asm关键字嵌入汇编语言的源代码 。它在C中是有条件支持和实现定义的但在C中不支持。它可以使用作用域内的任何变量或函数名比单独的汇编器更方便。它通常用于提高速度经常用于系统编程。