
[英]Calling printf from aarch64 asm code on Apple M1 / MacOS
[英]How to use _scanf in Apple Silicon (aarch64 macos) assembly to read in user input?
我是汇编编程的新手,但我通过谷歌搜索和反复试验已经弄清楚了很多。 我正在尝试编写一个简单的程序,提示用户输入一个数字(使用 _printf),然后读入并保存该数字(_scanf),然后使用存储的数字(_printf)打印出一条消息。
我能够让 _printf 代码在 aarch64(Apple Silicon)程序集下工作,但无论我做什么,我似乎都无法让 _scanf 工作。 我查看了 ARM 开发人员文档,查看了 HelloSilicon github 页面,并在谷歌上搜索了几个小时,但我无法找到任何有用的东西。
在我的代码(包含在下面)中,如果我在下面的代码中注释掉“read_from_keyboard”分支,printf 函数就可以正常工作。 但是,当我包含“read_from_keyboard”代码时,出现“Segmentation fault: 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"
在调用_printf
时,您的可变参数位于[sp]
中。 在调用_scanf
时,您将其放入x11
中。 为什么? 只需执行相同的str xN, [sp, #-16]!
你在_printf
上做的,这将修复你的段错误。
此外,您还需要read_from_keyboard
的堆栈框架。 bl _scanf
破坏了x30
,所以接下来的ret
只会陷入无限循环。
解决这两个问题,您的代码就可以工作了:
.global _main
.align 4
_main:
// PRINT MESSAGE
ADRP X0, message@PAGE
ADD X0, X0, message@PAGEOFF
BL _printf
BL read_from_keyboard
// 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:
STP X29, X30, [SP, #-16]!
ADRP X0, input_format@PAGE
ADD X0, X0, input_format@PAGEOFF
ADRP X11, num@PAGE
ADD X11, X11, num@PAGEOFF
STR X11, [SP, #-16]!
BL _scanf
ADD SP, SP, #16
LDP X29, X30, [SP], #16
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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.