【问题标题】:ARMv7 Assembly - Read from file and command lineARMv7 程序集 - 从文件和命令行读取
【发布时间】:2018-06-20 13:49:49
【问题描述】:

我在调用程序时从命令行读取一些参数时遇到问题。

我需要使用./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

从文件读取并打印到控制台工作正常,但是当我添加“从命令行读取”部分时,它显示“总线错误”。

【问题讨论】:

    标签: assembly command-line-arguments argv armv7 argc


    【解决方案1】:

    函数调用会覆盖寄存器 r0、r1、r2 和 r3,所以当你说的时候,无论你期望在 r1 中是什么

    LDR r1, [r1, #4]
    

    已经不在了。此时 r1 中的任何内容都可能不是有效的指针,因此您的程序会崩溃。要解决此问题,请将原始 r1 保存到函数开头的堆栈或 r4 到 r11 范围内的寄存器中,因为这些寄存器不会被其他函数覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2015-12-25
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多