想要读取字符串并在汇编中输出相同的字符串

时间:2014-10-29 19:09:06

标签: gcc assembly arm

我知道内存中的字符串不像存储数字或字符那么容易。我正在尝试使用.word指令存储字符串,我知道这可能是错误的。我不知道如何将字符串存储在内存中然后输出它。将字符串存储为一堆%c然后逐个输出每个字符的唯一选项?我试图看看是否有更简单的方法。我尝试使用.string指令而不是.word,但这被认为是有效的指令。

.data

.balign 4

input_name: .asciz "enter name: "

.balign 4

output_name: .asciz "name entered : %s\n"

.balign 4

scan_pattern: .asciz "%s"

.balign 4

name_read: .word 0

.balign 4

return: .word 0

.global main

main:

        ldr r1, =return       

        str lr, [r1]


        ldr r0, =input_name

        bl printf


        ldr r0, =scan_pattern

        ldr r1, = name_read

        bl scanf


        ldr 0, =ouput_name

        ldr r1, =name_read

        ldr r1, [r1]

        bl printf


        ldr lr, =return

        ldr lr, [lr]

        bx lr

1 个答案:

答案 0 :(得分:0)

解决此类问题的一般方法是“询问编译器”。你知道,你想做的是:

#include <stdio.h>

char str[1024];

int
main (void)
{
  scanf("%s", str);
  printf ("%s\n", str);
  return 0;
}

现在选择任何交叉编译器。不知道你的汇编语法,这很奇怪,但问题被标记为“gcc”,所以对于这个例子我们可以Linaro GCC

gcc-linaro-2014.01/bin/arm-linux-gnueabihf-gcc -S -O2 test.c

输出组件是:

    .thumb
    .file   "test.c"
    .section        .text.startup,"ax",%progbits
    .align  2
    .global main
    .thumb
    .thumb_func
    .type   main, %function
main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    push    {r4, lr}
    movw    r4, #:lower16:str
    movt    r4, #:upper16:str
    movw    r0, #:lower16:.LC0
    mov     r1, r4
    movt    r0, #:upper16:.LC0
    bl      __isoc99_scanf
    mov     r0, r4
    bl      puts
    movs    r0, #0
    pop     {r4, pc}
    .size   main, .-main
    .comm   str,1024,4
    .section        .rodata.str1.4,"aMS",%progbits,1
    .align  2
.LC0:
    .ascii  "%s\000"
    .ident  "GCC: (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) 4.8.3 20140106 (prerelease)"
    .section        .note.GNU-stack,"",%progbits

我认为一切都很清楚 - 您可以看到.comm指令用于字符串缓冲区,.ascii用于printf模式。

在您的编译器上,一切都可能会改变,但我概述了方法。首先看看编译器生成的东西,接下来自己编写汇编。