Assembly 汇编程序中的函数
我对堆栈的用途进行了一点哲学思考,经过一些编码,我了解了它的优点。我胃痛的唯一原因是它是如何发挥作用的?我试着用通用寄存器做一些简单的函数来增加两个数字,但我想这不是C语言中的工作原理。。所有参数、局部变量和结果存储在哪里 您将如何将其重写为汇编程序?(C编译器将如何重写它?)Assembly 汇编程序中的函数,assembly,function,callstack,Assembly,Function,Callstack,我对堆栈的用途进行了一点哲学思考,经过一些编码,我了解了它的优点。我胃痛的唯一原因是它是如何发挥作用的?我试着用通用寄存器做一些简单的函数来增加两个数字,但我想这不是C语言中的工作原理。。所有参数、局部变量和结果存储在哪里 您将如何将其重写为汇编程序?(C编译器将如何重写它?) 我知道这个例子有点糟糕。。但通过这种方式,我可以理解所有的可能性您所寻找的是有关的信息。函数的调用和返回方式取决于许多因素,包括处理器体系结构、编译器和操作系统。调用者和被调用者必须就约定达成一致,以便正确传递参数和返回
我知道这个例子有点糟糕。。但通过这种方式,我可以理解所有的可能性您所寻找的是有关的信息。函数的调用和返回方式取决于许多因素,包括处理器体系结构、编译器和操作系统。调用者和被调用者必须就约定达成一致,以便正确传递参数和返回值。Aaron所说的调用约定是正确的答案。对于我个人对这个主题的探索,我发现在堆栈框架的角色以及当它被破坏时会发生什么是一个很好的练习。Finlay我推荐使用这个工具,它将介绍重要的汇编程序概念,以及使用调试器可以做的有趣的事情 >首先,引用(<代码> int和<代码>)不在C中,只是C++。< /P> 如果您想使用gcc查看引擎盖下发生的情况,请使用
-s
标志。你不需要有一个实际的程序
g++ -S func.c
创建一个文件func.s
,该文件包含(在x86框上减去标题等):
注意C++名称的修改(<代码>现在我们给g++一个
-O2
标志:
.text
.align 4,0x90
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl (%rsi), %ecx
movl %ecx, %eax
imull %edi, %eax
addl (%rdx), %eax
incl %ecx
movl %ecx, (%rsi)
leave
ret
-O3
给出相同的代码;实际上没有任何其他东西需要优化
玩组装游戏的乐趣^_^ 调用约定也称为应用程序二进制接口(ABI).maaan!!!那个视频。。。哇哇!!解释了一切,甚至那些令人沮丧的段寄存器现在对我来说都清楚了!T H X A L O T!!!
.text
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movq %rdx, -24(%rbp)
movq -16(%rbp), %rax
movl (%rax), %edx
movl %edx, %ecx
imull -4(%rbp), %ecx
movq -24(%rbp), %rax
movl (%rax), %eax
addl %eax, %ecx
incl %edx
movq -16(%rbp), %rax
movl %edx, (%rax)
movl %ecx, %eax
leave
ret
.text
.align 4,0x90
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl (%rsi), %ecx
movl %ecx, %eax
imull %edi, %eax
addl (%rdx), %eax
incl %ecx
movl %ecx, (%rsi)
leave
ret