簡體   English   中英

ARMv7匯編-從文件和命令行讀取

[英]ARMv7 Assembly - Read from file and command line

我在調用程序時從命令行讀取一些參數時遇到問題。

我需要使用./try number string來調用它,例如: ./try 0 dfjjg

當我運行它時,出現總線錯誤。 有誰能夠幫助我? 我是組裝的新手,很難

非常感謝!

.data

.balign 4
file_operation: .asciz "r\000"

.balign 4
file_name: .asciz "data.txt\000"

.balign 4
end_line: .asciz "%[^\012]\000"

.balign 4
output: .asciz "data from the file: %s\000"

.balign 4
string: .asciz "ARGV: %s\n"

    .global main
    main:
    PUSH {fp, lr}
    ADD fp, sp, #4
    SUB sp, sp, #56

    @OPEN FILE
    LDR r1, addr_file_operation
    LDR r0, addr_file_name
    BL fopen
    MOV r3, r0
    STR r3, [fp, #-8]

    @READ FROM FILE
    SUB r3, fp, #60
    MOV r2, r3
    LDR r1, addr_end_line
    LDR r0, [fp, #-8]
    BL fscanf

    @READ FROM COMMAND LINE
    PUSH {ip, lr}
    LDR r1, [r1, #4]
    LDR r0, addr_string
    BL printf
    POP {ip, pc}

    @PRINT TO SCREEN
    SUB r3, fp, #60
    MOV r1, r3
    LDR r0, addr_output
    BL printf

    @CLOSE FILE
    LDR r0, [fp, #-8]
    BL fclose

    MOV r3, #0
    MOV r0, r3
    SUB sp, fp, #4
    POP {fp, lr}
    BX lr


 @DEFINE ADDRESSES
 addr_file_operation: .word file_operation
 addr_file_name: .word file_name
 addr_end_line: .word end_line
 addr_output: .word output
 addr_string: .word string

.global fscanf
.global fopen
.global fclose
.global printf

從文件讀取並打印到控制台可以正常工作,但是當我添加“從命令行讀取”部分時,它顯示為“ BUS ERROR”。

函數調用將覆蓋寄存器r0,r1,r2和r3,所以無論您說什么,都希望在r1中

LDR r1, [r1, #4]

不再在那里。 此時r1中的任何內容可能都不是有效的指針,因此您的程序將崩潰。 要解決此問題,請在函數開始時將原始r1保存到堆棧或r4到r11范圍內的寄存器中,因為這些寄存器不會被其他函數覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM