汇编语言与x64函数参数传递

简介: 汇编语言与x64函数参数传递

汇编语言作为编程语言与机器语言之间的桥梁,直接反映了硬件的工作方式。在不同的操作系统和硬件架构中,函数参数的传递方式可能有所不同。今天,我们将探讨x64位环境下函数参数如何传递,并通过一些代码示例来加深理解。

x64 Calling Conventions

在x64架构下,存在两种主要的调用约定:Microsoft x64 calling convention 和 System V AMD64 ABI。这两种约定规定了如何在函数调用中传递参数,以及如何从函数返回结果。

Microsoft x64 Calling Convention

在Windows操作系统下,x64体系结构遵循Microsoft x64 calling convention。在这种约定中,前四个整数或指针参数通过寄存器RCXRDXR8R9传递。如果参数多于四个,则额外的参数将通过栈传递。函数的返回值通过RAX寄存器返回。

示例代码:加法函数

; Microsoft x64 Calling Convention
; 函数将两个整数相加

section .text
global add_integers

add_integers:
    mov rax, rcx    ; 将第一个参数从 RCX 移到 RAX
    add rax, rdx    ; 将第二个参数 RDX 加到 RAX 上,结果存储在 RAX
    ret             ; 返回结果,结果在 RAX 中

System V AMD64 ABI

在Unix-like系统,例如Linux和macOS中,遵循的是System V AMD64 ABI。在这种约定中,前六个整数或指针参数通过RDIRSIRDXRCXR8R9寄存器传递。函数返回值通过RAX传递。

示例代码:求和函数

; System V AMD64 ABI
; 函数将两个整数相加

section .text
global sum_integers

sum_integers:
    mov rax, rdi    ; 将第一个参数从 RDI 移到 RAX
    add rax, rsi    ; 将第二个参数 RSI 加到 RAX 上,结果存储在 RAX
    ret             ; 返回结果,结果在 RAX 中

浮点参数传递

对于浮点参数,不论是在Windows还是Unix-like系统,都使用XMM0XMM7寄存器来传递前8个浮点参数。

示例代码:浮点数相加函数

; 浮点数相加,此代码适用于Windows和Unix-like系统

section .text
global add_floats

add_floats:
    movsd xmm0, xmm1    ; 将第二个参数从 XMM1 移到 XMM0
    addsd xmm0, xmm2    ; 将第三个参数 XMM2 加到 XMM0 上,结果存储在 XMM0
    ret                 ; 返回结果,结果在 XMM0 中


总结


在x64架构下,通过寄存器传递函数参数而不是通过堆栈,这种方法显著提高了函数调用的效率。微软和System V的调用约定虽然在参数传递的寄存器上有所区别,但都利用了寄存器来提供更快的参数访问和处理速度。以上的代码示例提供了在x64位环境下如何使用汇编语言进行函数参数传递的基础知识。在实际编程中,确保根据你的操作系统和工具选择正确的调用约定是至关重要的。



目录
相关文章
|
4天前
|
C语言
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
9 1
|
4天前
|
编译器 API C语言
在x86架构汇编语言中函数参数传递的三种约定
在x86架构汇编语言中函数参数传递的三种约定
16 2
|
4天前
理解汇编中的CALL指令和参数传递
理解汇编中的CALL指令和参数传递
16 1
|
存储
ARM64汇编的函数有那些需要重点注意?
ARM64汇编的函数有那些重点
413 0
ARM64汇编的函数有那些需要重点注意?
|
Android开发
【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
304 0
【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
|
rax 前端开发 iOS开发
用汇编实现add函数
平台 macOS 工具 nasm clang 文件 main.c #include int add(int a, int b); int main() { printf("the reuslt of 2 plus 3 is %d\n", add(2, 3)); return 0; } add.
1198 0
|
机器学习/深度学习 NoSQL
gdb反汇编详解C函数底层实现笔记(程序堆栈、内存分配)
以下是在读《深入理解计算机系统》前面的章节“程序的机器级表示”时,自己动手在linux上使用了gdb对一个简单的C程序进行反汇编,通过不懈的努力终于查清楚弄明白了绝大多数的语句。
1051 0
|
3天前
|
存储 编译器
C51汇编程序
C51汇编程序
10 5