【发布时间】:2014-08-31 11:25:20
【问题描述】:
我尝试编写一个简短的 32 位汇编程序来测试 mac os x 中的系统调用。
我编写了如下所示的第一个版本,调用 write() 函数在屏幕上打印一个字符串。它确实有效。
.data
str:
.ascii "Hello World\n"
.text
.globl _main
_main:
pushl $12
pushl $str
pushl $1
movl $4, %eax
subl $4, %esp
int $0x80
addl $16, %esp
pushl $0
movl $1, %eax
subl $12, %esp
int $0x80
在此之后,我决定编写另一个版本,使用 mkdir() 在“/tmp”中创建一个新目录,但我失败了。 mkdir() 的系统调用号是 0x88,我的代码如下所示。谁能告诉我我错在哪里。非常感谢。
.data
path:
.ascii "/tmp/new_dir"
.text
.globl _main
_main:
nop
pushl $path
pushl $0x1ff
movl $0x88, %eax
subl $8, %esp
int $0x80
addl $16, %esp
pushl $0
movl $1, %eax
subl $12, %esp
int $0x80
【问题讨论】:
-
OS X 需要堆栈以 16 字节对齐。我已经推送了 8 个字节。所以,我需要
subl $8来对齐堆栈。 -
堆栈对齐必须发生在你推送参数之前。否则,被调用者怎么知道在哪里可以找到参数?请参阅我的回答 here 了解更多关于发生了什么。
-
是的,你是对的。对齐应该放在 push 参数之前。谢谢。
标签: macos assembly system-calls 32-bit