【发布时间】:2014-10-29 19:09:05
【问题描述】:
我知道内存中的字符串不像存储数字或字符那么容易。我正在尝试使用 .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
【问题讨论】:
-
我不太确定你指的是什么字符串,也许是 scanf 的输出?首先有一堆其他的 cmets:有一堆明显的错字(例如 ldr 0,=output_name)可能只是复制/粘贴的东西,因为我看不出它是如何构建的。 C 方法需要一个堆栈——也许它已经在某个地方设置好了。代码在 .data 部分,通常进入 .text。不是像那样操纵 lr,而是 (a) 在最后调用 'b main' 以返回开始。 (b) 将 lr 压入堆栈并弹出到 pc 中。
-
接下来 - 分配空间。您可以使用 .space 指令。假设您想为您的字符串分配 64 个字节。
mystring: .space 64将 scan_pattern 分配给 r0 并将 myspace 分配给 r1 以调用 scanf 并再次调用以下 printf。这是gas ARM directives的备忘单@