无法在ARMv8程序集中打印总和

时间:2016-10-04 06:11:57

标签: assembly arm64

我一直试图在ARMv8中打印我的总和,但我似乎无法让它工作。我可以编译并运行但没有显示输出。

这是我的代码:

       .balign 4
       .global main
main:
        stp     x29, x30, [sp, -16]! 
        mov     x29, sp              

        mov     x19, 1              
        mov     x20, 2
        add     x21, x20, x19

        mov     w0, 0                
        ldp     x29, x30, [sp], 16   
        ret                     

1 个答案:

答案 0 :(得分:1)

如@Michael所示,您没有使用任何说明将您的金额“打印”到屏幕上。您可以使用syscalls或printf。下面的示例ARMv8代码使用printf和一些简单的简单宏;这是没有必要的。

我建议您学习ARMv7,因为有很多教程,然后查看ARMv8指令集概述和AArch64的ARM过程调用标准。

1 /*
  2         David @InfinitelyManic
  3         http://stackoverflow.com/questions/39845288/cant-print-sum-in-armv8-assembly
  4         $ uname -a
  5         Linux alarm 3.10.65-4-pine64-longsleep #16 SMP PREEMPT Sun Apr 3 10:56:40 CEST 2016 aarch64 GNU/Linux
  6         $ cat /etc/os-release
  7         NAME="Arch Linux ARM"
  8         gcc -g print_sum.s -o print_sum
  9 */
 10 .bss
 11 .data
 12         fmt:    .asciz  "%d + %d = %d\n"
 13 .text
 14         .global main
 15
 16         // macros
 17         // push2
 18         .macro push2, xreg1, xreg2
 19         .push2\@:
 20                 stp     \xreg1, \xreg2, [sp, #-16]!
 21         .endm
 22
 23         // pop2
 24         .macro  pop2, xreg1, xreg2
 25         .pop2\@:
 26                 ldp     \xreg1, \xreg2, [sp], #16
 27         .endm
 28
 29         // exit
 30         .macro _exit
 31         .exit\@:
 32                 mov x8, #93             // exit see /usr/include/asm-generic/unistd.h
 33                 svc 0
 34         .endm
 35
 36 main:
 37         mov x1, 1
 38         mov x2, 2
 39         add x3, x1, x2
 40         bl write
 41
 42 _exit
 43
 44 write:
 45         push2 x29, x30
 46         ldr x0,=fmt
 47         bl printf
 48         pop2 x29, x30
 49         ret

输出:

 $./print_sum
1 + 2 = 3