我知道内存中的字符串不像存储数字或字符那么容易。我正在尝试使用.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
答案 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模式。
在您的编译器上,一切都可能会改变,但我概述了方法。首先看看编译器生成的东西,接下来自己编写汇编。