例如,我已经看到_startas.global _start和.globl _start。似乎我可以互换使用它们。两者之间有什么区别吗?
我有一些字符串,foo我希望能够运行类似的东西as foo.s -o foo.o.如果是这样的话printf,我就可以做到printf("as %s.s -o %s.o", foo, foo);.我希望能够做的就是这样,除了system功能.我怎样才能做到这一点?使用相同的方法printf给我一个错误,说我已经传递了太多的论点.
在我的代码中,我有:
for (int i = 1; i < argc; i++) {
system("as %s.s -o %s.o", *(argv + i), *(argv + i));
}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误,说我有太多的论点.我想我可以经历循环遍历字符数组的痛苦过程,但我宁愿避免这种情况.
为什么32位C将所有函数参数直接推送到堆栈上,而64位C将前6个参数放入寄存器而其余的放在堆栈中?
所以32位堆栈看起来像:
...
arg2
arg1
return address
old %rbp
Run Code Online (Sandbox Code Playgroud)
虽然64位堆栈看起来像:
...
arg8
arg7
return address
old %rbp
arg6
arg5
arg4
arg3
arg2
arg1
Run Code Online (Sandbox Code Playgroud)
那么为什么64位C会这样做呢?将所有内容都推送到堆栈而不是将前6个参数放在寄存器中以便将它们移动到函数序言中的堆栈中是不是更容易?