繁体   English   中英

如何在 Apple Silicon (aarch64 macos) 程序集中使用 _scanf 来读取用户输入?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM