Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Macos Mac OS x86程序集:为什么初始化的内存量会更改?_Macos_Assembly - Fatal编程技术网

Macos Mac OS x86程序集:为什么初始化的内存量会更改?

Macos Mac OS x86程序集:为什么初始化的内存量会更改?,macos,assembly,Macos,Assembly,大约一周前我才开始学习汇编,在调试程序时,我遇到了一些奇怪的内存使用情况。由于某种原因,以下代码(参见本文末尾)被分成两个文件 如果我编译并运行 gcc main.s ./a.out gcc main.s print.s ./a.out 只有代码块1在运行(代码块2被注释掉),然后程序打印“8”,这意味着当我的程序启动时,Mac OS会自动在堆栈上放入8字节的内容,然后让我的程序去做它自己的事情 但是,如果我编译并运行 gcc main.s ./a.out gcc main.s print

大约一周前我才开始学习汇编,在调试程序时,我遇到了一些奇怪的内存使用情况。由于某种原因,以下代码(参见本文末尾)被分成两个文件

如果我编译并运行

gcc main.s
./a.out
gcc main.s print.s
./a.out
只有代码块1在运行(代码块2被注释掉),然后程序打印“8”,这意味着当我的程序启动时,Mac OS会自动在堆栈上放入8字节的内容,然后让我的程序去做它自己的事情

但是,如果我编译并运行

gcc main.s
./a.out
gcc main.s print.s
./a.out
只有代码块2在运行(代码块1被注释掉),然后程序打印“16”,这意味着Mac OS最初将16个字节放在堆栈上,而不是8个字节。发生这种情况时,应用于rsp以实现16字节对齐的偏移量保持不变,这意味着每当调用外部函数时,堆栈的开始部分将偏移8字节

我还尝试将
\u printNum
函数与
main.s
放在同一个文件中,但差异仍然存在。我尝试的另一件事是添加另一个格式字符串,稍后在程序中使用它,以查看与格式字符串有关的内容是否使用了内存,但没有任何区别

我认为是这样的:当我的程序终止到堆栈上时,Mac OS会将下一条指令的指令指针推到堆栈上,然后将旧的基本堆栈指针推到堆栈上,这两个指针都是32位的,总共有8个字节。当我包含一个函数调用(无论是本地调用还是主文件外部调用)时,似乎汇编程序决定使用64位地址而不是32位地址,使用的内存增加了一倍,因此使用了16个字节

为什么会发生这种情况?如果我错了,Mac OS会对堆栈做什么?额外的堆栈对我有价值吗?计算机是否在做其他事情,而不是从32位寻址切换到64位寻址?谢谢

主程序(main.s):

打印功能(print.s):


没有理由假设RBP有任何特定的价值。调用方可以将其用于任何目的。请注意,您自己的
\u main
函数没有设置RBP,因此它调用的任何函数都无法通过从RBP中减去RSP来确定堆栈
\u main
使用了多少。因此在_main中,RBP不一定是堆栈的开始?如果没有,那么设置为什么?我觉得它不是堆栈的开始有点不安全。我不知道。您必须查看调用_main的代码才能确定这一点。没有理由假设RBP有任何特定的值。调用方可以将其用于任何目的。请注意,您自己的
\u main
函数没有设置RBP,因此它调用的任何函数都无法通过从RBP中减去RSP来确定堆栈
\u main
使用了多少。因此在_main中,RBP不一定是堆栈的开始?如果没有,那么设置为什么?我觉得它不是堆栈的开始有点不安全。我不知道。您必须查看调用_main的代码才能确定这一点。没有理由假设RBP有任何特定的值。调用方可以将其用于任何目的。请注意,您自己的
\u main
函数没有设置RBP,因此它调用的任何函数都无法通过从RBP中减去RSP来确定堆栈
\u main
使用了多少。因此在_main中,RBP不一定是堆栈的开始?如果没有,那么设置为什么?我觉得它不是堆栈的开始有点不安全。我不知道。您必须查看调用_main的代码才能确定这一点。