Gcc 要在程序集中读取字符串并输出相同的字符串吗

Gcc 要在程序集中读取字符串并输出相同的字符串吗,gcc,assembly,arm,Gcc,Assembly,Arm,我知道记忆中的字符串不像存储数字或字符那么容易。我试图用.word指令存储字符串,我知道这可能是错误的。我不确定如何将字符串存储在内存中,然后输出它。是将字符串存储为一组%c,然后逐个输出每个字符的唯一选项吗?我想看看是否有更简单的方法。我尝试了.string指令而不是.word指令,但该指令被识别为有效指令 .data .balign 4 input_name: .asciz "enter name: " .balign 4 output_name: .asciz "name ente

我知道记忆中的字符串不像存储数字或字符那么容易。我试图用.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

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

#include <stdio.h>

char str[1024];

int
main (void)
{
  scanf("%s", str);
  printf ("%s\n", str);
  return 0;
}
输出组件是:

    .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
指令和printf模式的
.ascii


在您的编译器上,一切都可能发生变化,但我不支持这种方法。首先看看编译器生成的东西,然后自己编写汇编。

我不太确定您所指的字符串是什么,可能是scanf的输出?首先还有一堆其他的评论:有一堆明显的打字错误(例如ldr 0,=输出名称),可能只是复制/粘贴的东西,因为我不知道它是如何构建的。C方法需要一个堆栈——可能已经在某个地方设置好了。代码位于.data部分,它通常进入.text。与其像那样操纵lr,不如(a)在末尾调用“b main”返回开始。(b) 将lr推到堆栈上并将其弹出到pc中。下一步-分配空间。您可以使用.space指令。假设要为字符串分配64个字节
mystring:.space 64
将扫描模式分配给r0,将myspace分配给r1以调用scanf,并再次分配给以下printf。这是你的备忘单
    .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