Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
汇编函数调用是否会将所有寄存器推送到堆栈上? 我对执行汇编代码VisualC++中的调用< /COD>指令时发生的事情感兴趣。 我认为调用指令本身会将所有上下文推送到堆栈上(寄存器内容,PC,…),并更新PC。但是,我想知道是否所有上下文都被推。在许多情况下,并非所有寄存器都在调用的函数中使用。编译器是否检测到这一点并只推送由函数修改的上下文,还是推送所有在硬件级别实现的上下文,这样就可以一直这样做?_C++_Assembly_Function Calls - Fatal编程技术网

汇编函数调用是否会将所有寄存器推送到堆栈上? 我对执行汇编代码VisualC++中的调用< /COD>指令时发生的事情感兴趣。 我认为调用指令本身会将所有上下文推送到堆栈上(寄存器内容,PC,…),并更新PC。但是,我想知道是否所有上下文都被推。在许多情况下,并非所有寄存器都在调用的函数中使用。编译器是否检测到这一点并只推送由函数修改的上下文,还是推送所有在硬件级别实现的上下文,这样就可以一直这样做?

汇编函数调用是否会将所有寄存器推送到堆栈上? 我对执行汇编代码VisualC++中的调用< /COD>指令时发生的事情感兴趣。 我认为调用指令本身会将所有上下文推送到堆栈上(寄存器内容,PC,…),并更新PC。但是,我想知道是否所有上下文都被推。在许多情况下,并非所有寄存器都在调用的函数中使用。编译器是否检测到这一点并只推送由函数修改的上下文,还是推送所有在硬件级别实现的上下文,这样就可以一直这样做?,c++,assembly,function-calls,C++,Assembly,Function Calls,这一切都取决于ABI(),它指示调用方还是被调用方将内容推送到堆栈上。因为您没有指定平台(尽管VisualStudio有点像x86),所以答案取决于 通常,调用方不知道被调用函数将做什么,因此编译器无法根据函数内部的信息进行优化 通常,在任何平台上都不会自动将上下文推送到堆栈上,但有几个平台有宏和优化的指令来快速执行。通常,自动从堆栈中推送和弹出的唯一对象是PC 编辑:对于x86,有几个ABI。您应该查看此文件以查看它们(cdecl、stdcall等)。关于调用方或被调用方是否保存上下文,每种方

这一切都取决于ABI(),它指示调用方还是被调用方将内容推送到堆栈上。因为您没有指定平台(尽管VisualStudio有点像x86),所以答案取决于

通常,调用方不知道被调用函数将做什么,因此编译器无法根据函数内部的信息进行优化

通常,在任何平台上都不会自动将上下文推送到堆栈上,但有几个平台有宏和优化的指令来快速执行。通常,自动从堆栈中推送和弹出的唯一对象是PC


编辑:对于x86,有几个ABI。您应该查看此文件以查看它们(cdecl、stdcall等)。关于调用方或被调用方是否保存上下文,每种方法都有不同的规则。

指令
CALL
不会将寄存器推送到堆栈中。它只推送函数应该返回的地址

INT
指令(其作用类似于调用)也会推送
标志
寄存器的内容

如果程序需要在函数调用期间保留一些其他寄存器,则需要通过显式
推送
指令将这些寄存器存储在堆栈中,然后通过
弹出
指令将其还原

当我们谈论高级语言时,存储什么以及具体如何存储只取决于编译器。编译器可以自由地使用任何约定,但通常它们会遵守标准约定,以便能够链接用不同语言编写的模块


在汇编编程中,保存策略完全取决于程序员。他可以使用一些标准约定或自定义约定,具体取决于他的编程目标。

我使用的是x86。当我有一个只被翻译成汇编代码“call…”的函数调用时。我想知道为什么我没有看到任何东西被推到堆栈上。电脑是否由“呼叫”指令推动?那么旗子呢,它们也被推到堆栈上了吗?可能是因为Visual Studio优化了或让被叫方负责所有这些?请阅读此处以了解x86指令的详细说明:@ClickyButton.com我使用指向x86呼叫约定的链接更新了答案。事实上,这并不是对所问问题的回答。