mat*_*ack 0 c assembly gcc undefined-behavior
我想我发现 gcc 编译器处理函数的方式有问题。
我不知道这是一个错误还是我多年来忽略的东西从来没有分心。实际上,通过声明一个函数并定义后者具有返回值,编译器将在函数范围内分配的第一个变量的值存储在 EAX 寄存器中,然后依次将其存储在一个变量中。例子:
#include<stdio.h>
int add(int a, int b)
{
int c = a + b;
;there isn't return
}
int main(void)
{
int res = add(3, 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
5
Run Code Online (Sandbox Code Playgroud)
这是具有 intel 语法的 x86-64 程序集:
功能添加:
push rbp
mov rbp, rsp
mov DWORD PTR[rbp-0x14], edi ;store first
mov DWORD PTR[rbp-0x18], esi ;store second
mov edx, DWORD PTR[rbp-0x14]
mov eax, DWORD PTR[rbp-0x18]
add eax, esx
mov DWORD PTR[rbp-0x4], eax
nop
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
主要功能:
push rbp
mov rbp, rsp
sub rsp, 0x10
mov esi, 0x2 ;first parameter
mov edi, 0x3 ;second parameter
call 0x1129 <add>
;WHAT??? eax = a + b, why store it?
mov DWORD PTR[rbp-0x4], eax
mov eax, 0x0
leave
ret
Run Code Online (Sandbox Code Playgroud)
如您所见,它保存了参数a和b变量的总和c,但随后它将我保存在res包含它们总和的 eax 寄存器中,就好像函数返回值一样。
这是因为函数是用返回值定义的吗?
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |