2014-10-29 24 views
1

我知道內存中的字符串字符串不如存儲數字或字符那麼簡單。我試圖用.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

我不太確定你所指的字符串是什麼,也許是scanf的輸出? 還有一堆其他評論第一: 有一堆明顯的錯字(如ldr 0,= output_name),可能只是一個複製/粘貼的事情,因爲我不知道它是如何構建的。 C方法需要一個堆棧 - 也許已經安裝在某個地方。 代碼位於.data部分,通常會進入.text。 而不是像這樣操縱lr,要麼(a)在最後調用'b main'返回到開頭。 (b)將lr推入堆棧並將其彈入pc中。 – SilverCode 2014-10-29 21:52:14

+1

接下來 - 分配空間。您可以使用.space指令。假設你想爲你的字符串分配64個字節。 'mystring:.space 64'將scan_pattern分配給r0,將myspace分配給r1以便調用scanf,並再次分配給下面的printf。 這裏是[gas arm directives]的備忘單(http://www.coranac.com/files/gba/re-ejected-gasref.pdf) – SilverCode 2014-10-29 22:01:49

回答

0

解決此類問題的一般方法是「詢問編譯器」。你知道,你想要做什麼是:

#include <stdio.h> 

char str[1024]; 

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

現在採取任何交叉編譯器。不知道你的彙編語法,很奇怪,但問題是標籤爲「海灣合作委員會」,所以這個例子讓我們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模式。

在您的編譯器上,一切都可能改變,但我概述了方法。首先看編譯器生成的東西,然後自己寫下彙編。

相關問題