Gcc 要在程序集中读取字符串并输出相同的字符串吗
我知道记忆中的字符串不像存储数字或字符那么容易。我试图用.word指令存储字符串,我知道这可能是错误的。我不确定如何将字符串存储在内存中,然后输出它。是将字符串存储为一组%c,然后逐个输出每个字符的唯一选项吗?我想看看是否有更简单的方法。我尝试了.string指令而不是.word指令,但该指令被识别为有效指令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
.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