![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
汇编
ponnylv
这个作者很懒,什么都没留下…
展开
-
x86_64汇编之六:系统调用(system call)
本文将主要讲述如何在汇编语言代码中调用Linux的系统调用。一、32位系统的系统调用在32位x86 Linux系统中,可用的系统调用定义在/usr/include/asm/unistd_32.h头文件中。每个系统调用都对应一个编号 以及 若干个参数。如果想使用汇编语言调用系统调用,那么在调用之前,需要将系统调用编号存到%eax,将参数依次存到%ebx, %ecx, %edx, %esi, %edi, %ebp中,然后再执行int $0x80指令即可。每个系统调用的编号和参数列表可以参考:https:原创 2020-07-10 15:39:40 · 5982 阅读 · 0 评论 -
x86_64汇编之一:AT&T汇编语法
汇编语法主要有两大派系:AT&T语法 和 Intel语法。GAS (GNU Assembler) 编译器默认是基于AT&T语法;MASM、NASM等编译器默认基于Intel语法。需要说明的是,GAS汇编器除了支持AT&T语法之外,自己也定义了一些额外的directives,用于辅助完成汇编操作。关于GAS汇编器及其语法可以参考GAS的官方文档:https://sourceware.org/binutils/docs/as/由于AT&T语法在Linux平台上使用比较广泛,原创 2020-07-10 09:33:17 · 7904 阅读 · 1 评论 -
x86_64汇编之五:System V AMD64调用约定下的函数调用
之前提到了,System V AMD64调用约定是x86_64 Linux系统上使用最广泛的调用约定,gcc/g++等编译器都默认使用该调用约定。凡是遵循System V AMD64调用约定的汇编代码,都有一定的固定模式,比如函数开头做哪些处理,函数末尾做哪些处理等等。遵循该约定的函数一般是如下的模式。Caller的操作在调用callee之前,通常有以下操作:步骤1:设置参数到寄存器/栈中 mov xxx, %rdi # 第一个参数 mov xxx, %rsi # 第二个参数 mov xxx,原创 2020-07-09 19:33:21 · 2149 阅读 · 0 评论 -
x86_64汇编之四:函数调用、调用约定
一、栈栈一般从高地址往低地址生长,每个函数都在栈空间中对应一个栈帧。关于栈帧有两个重要的指针——栈基址指针BP和栈顶指针SP。其中,除了在函数的开头和结尾(后面会讲到),BP指针一般是固定不变的,通常以它为基准来寻址参数和局部变量,例如将第一个参数放入栈中的汇编代码可以是movq %rdi, -8(%rbp)。和栈相关的两个指令是push和pop。在x86_64架构的计算机上,push operand指令的作用是:将栈顶指针rsp减去8(即8字节)然后将目标操作数放入更新后的rsp所指向的地址原创 2020-07-09 18:26:09 · 10212 阅读 · 0 评论 -
x86_64汇编之二:x86_64的基本架构(寄存器、寻址模式、指令集概览)
一、x86_64中的寄存器x86_64架构中的寄存器可分为以下几类:通用寄存器 (General-Purpose registers)状态和控制寄存器(RFLAGS register)指令寄存器 (RIP)XMM、YMM、ZMM寄存器浮点控制和状态寄存器 (MXCSR)如下图所示:通用寄存器通用寄存器主要用于完成一些通用的功能,包括算数运算、逻辑运算、比较运算、数据转移、地址计算,还可以临时存放常量、中间结果、指针等内容。x86_64中的通用寄存器如下:x86_64中的一个通用原创 2020-07-08 13:28:16 · 11227 阅读 · 1 评论 -
x86_64汇编之三:x86_64汇编和x86_32汇编的区别
顾名思义,x86_64汇编是64位机器上使用的汇编,而x86_32汇编是32位机器上使用的汇编。1. 地址、操作数、寄存器使用上的区别x86_32汇编中的大部分指令在x86_64中都有对应,功能相同,只不过x86_64上的对应指令可能支持操作64位的地址、操作数和寄存器。需要注意的是,x86_64中操作的地址不一定非得是64位,也可以是32位的。例如,x86_64支持下面的指令:mov r10, [eax]其中,eax的内容就是地址,这个32位的地址前面会被补上32位的0,也就是说,eax 只能原创 2020-07-08 10:59:40 · 3034 阅读 · 0 评论