assembly 如何在Apple Silicon(aarch64 macos)汇编中使用_scanf来读取用户输入?[duplicate]

zazmityj  于 2023-01-13  发布在  Mac
关注(0)|答案(1)|浏览(131)
    • 此问题在此处已有答案**:

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"
oogrdqng

oogrdqng1#

在调用_printf时,你的变量参数在[sp]中,在调用_scanf时,你把它放在x11中,为什么?只要做你在_printf上做的同样的str xN, [sp, #-16]!,就可以修复你的segfault。
另外,你还需要一个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"

相关问题