- 此问题在此处已有答案**:
Calling printf from aarch64 asm code on Apple M1 / MacOS(1个答案)
19小时前关门了。
我是汇编编程的新手,但我已经通过谷歌搜索和反复试验了解了很多东西,我正在尝试编写一个简单的程序,提示用户输入一个数字(使用_printf),然后读取并保存该数字(_scanf),然后使用存储的数字打印出一条消息(_printf)。
我能够让_printf代码在aarch64(Apple Silicon)汇编下工作,但无论我做什么,我似乎都无法让_scanf工作。我浏览了ARM开发者文档,查看了HelloSilicon github页面,并在谷歌上搜索了几个小时,但我无法找到任何有效的东西。
在我的代码中(包括在下面),如果我注解掉下面代码中的"read_from_keyboard"分支,printf函数就可以正常工作,但是当我包括"read_from_keyboard"代码时,我得到一个"分段错误:11 "错误。
我错在哪里?
.global main
.align 4
main:
// PRINT MESSAGE
ADRP X0, message@PAGE
ADD X0, X0, message@PAGEOFF
BL _printf
// BL read_from_keyboad
// READ NUMBER FROM DATA AND MOVE TO STACK FOR PRINTING
ADRP X10, num@PAGE
ADD X10, X10, num@PAGEOFF
LDR X1, [X10]
STR X1, [SP, #-16]!
// LOAD THE PRINTF FORMATTED MESSAGE
ADRP X0, output_format@PAGE
ADD X0, X0, output_format@PAGEOFF
end:
BL _printf
mov X16, #1
svc 0
read_from_keyboard:
ADRP X0, input_format@PAGE
ADD X0, X0, input_format@PAGEOFF
ADRP X11, num@PAGE
ADD X11, X11, num@PAGEOFF
BL _scanf
ret
.data
.balign 4
message: .asciz "What is your favorite number?\n"
.balign 4
num: .word 32
.balign 4
input_format: .asciz "%d"
.balign 4
output_format: .asciz "Your favorite number is %d \n"
1条答案
按热度按时间oogrdqng1#
在调用
_printf
时,你的变量参数在[sp]
中,在调用_scanf
时,你把它放在x11
中,为什么?只要做你在_printf
上做的同样的str xN, [sp, #-16]!
,就可以修复你的segfault。另外,你还需要一个
read_from_keyboard
的堆栈帧,bl _scanf
会破坏x30
,所以下面的ret
会陷入无限循环。修复这两个问题,您的代码将正常工作: