ARMv7 程序集 - 从文件和命令行读取
ARMv7 Assembly - Read from file and command line
我在调用程序时从命令行读取一些参数时遇到问题。
我需要使用 ./try number string
调用它,
例如:./try 0 dfjjg
当我 运行 它时,我得到一个总线错误。有谁能够帮助我?我是组装新手,这很难
非常感谢!
.data
.balign 4
file_operation: .asciz "r[=10=]0"
.balign 4
file_name: .asciz "data.txt[=10=]0"
.balign 4
end_line: .asciz "%[^2][=10=]0"
.balign 4
output: .asciz "data from the file: %s[=10=]0"
.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
它从文件读取并打印到控制台时工作正常,但是当我添加部分 "READ FROM COMMAND LINE" 时它显示 "BUS ERROR"。
函数调用会覆盖寄存器 r0、r1、r2 和 r3,因此当您说
LDR r1, [r1, #4]
已经不存在了。此时 r1 中的任何内容都可能不是有效指针,因此您的程序会崩溃。要解决此问题,请将原始 r1 保存到函数开头的堆栈或 r4 到 r11 范围内的寄存器中,因为这些寄存器不会被其他函数覆盖。
我在调用程序时从命令行读取一些参数时遇到问题。
我需要使用 ./try number string
调用它,
例如:./try 0 dfjjg
当我 运行 它时,我得到一个总线错误。有谁能够帮助我?我是组装新手,这很难
非常感谢!
.data
.balign 4
file_operation: .asciz "r[=10=]0"
.balign 4
file_name: .asciz "data.txt[=10=]0"
.balign 4
end_line: .asciz "%[^2][=10=]0"
.balign 4
output: .asciz "data from the file: %s[=10=]0"
.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
它从文件读取并打印到控制台时工作正常,但是当我添加部分 "READ FROM COMMAND LINE" 时它显示 "BUS ERROR"。
函数调用会覆盖寄存器 r0、r1、r2 和 r3,因此当您说
LDR r1, [r1, #4]
已经不存在了。此时 r1 中的任何内容都可能不是有效指针,因此您的程序会崩溃。要解决此问题,请将原始 r1 保存到函数开头的堆栈或 r4 到 r11 范围内的寄存器中,因为这些寄存器不会被其他函数覆盖。