我正在学习苹果M1的组装。我想写一个程序,进入一个无限循环,然后在按下control-c时以状态123退出。我写了如下程序:
// foo.s
.align 2
.text
.global _main
_main:
mov x0, #2
adrp x1, sigint_handler@page
add x1, x1, sigint_handler@pageoff
mov x2, #0
mov x8, 0x8c
svc 0
loop:
b loop
sigint_handler:
mov x0, #123
mov x16, #1
svc 0
字符串
它可以与以下部件组装:
as foo.s -arch arm64 -o foo.o
ld -arch arm64 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -lSystem -o foo foo.o
型
并运行:
./foo
型
当我按下control-c时,程序退出,状态为130:
echo $?
130
型
由于sigint_handler的原因,我期望的状态码是123。
我想我没有正确注册sigint_handler。我做错了什么?
谢啦,谢啦
编辑:
在根据Nate的评论进行了更多的尝试之后,我现在有了以下代码:
.align 2
.data
nsa: .skip 24
.text
.global _main
_main:
// Populate the __sigaction nsa struct:
// https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/sys/signal.h.auto.html
adrp x0, nsa@page
add x0, x0, nsa@pageoff
adrp x1, sigint_handler@page
add x1, x1, sigint_handler@pageoff
str x1, [x0, #0]
// I'm not sure what to do here:
mov x1, #0
str x1, [x0, #8]
str x1, [x0, #16]
// Make service call 46:
// int sigaction(int signum, struct __sigaction *nsa, struct sigaction *osa);
// https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master
mov x0, #2 // SIGINT
adrp x1, nsa@page
add x1, x1, nsa@pageoff
mov x2, #0 // NULL
mov x16, #46
svc 0
loop:
b loop
sigint_handler:
mov x0, #123
mov x16, #1
svc 0
型
我正在尝试构建一个__sigaction *nsa
结构体,以便可以进行有效的sigaction服务调用。这不起作用,当我控制-c时,我得到了一个分段错误。我不是很确定这个结构体的大小以及如何正确地填充它的字段。
1条答案
按热度按时间7vux5j2d1#
我使用这个相对简单的代码让它工作:
字符串
我从一个简单的C程序开始:
型
然后我使用gcc来输出assembly:
型
结果如下:
型
然后,我挑选出注册信号处理程序的行。我不确定_signal来自哪里-我假设它内置在macOS汇编器中。如果有人能解释这一部分,我将不胜感激。谢啦,谢啦