Assembly 气体汇编器-Fgets功能故障
当我尝试使用FGET时,这个简单的程序会出错。我试着用read函数代替Assembly 气体汇编器-Fgets功能故障,assembly,arm,fgets,gnu-assembler,Assembly,Arm,Fgets,Gnu Assembler,当我尝试使用FGET时,这个简单的程序会出错。我试着用read函数代替 ldr r1, =input_string mov r3, #80 mov r0, #0 bl read 但这一点在某些情况下是行不通的 读取(0,0x210443201061676)=-1 EINVAL(无效参数) 所以我尝试使用fgets。我的字符串缓冲区好像有问题 .data .balign 4 message1: .asciz "Ple
ldr r1, =input_string
mov r3, #80
mov r0, #0
bl read
但这一点在某些情况下是行不通的
读取(0,0x210443201061676)=-1 EINVAL(无效参数)
所以我尝试使用fgets。我的字符串缓冲区好像有问题
.data
.balign 4
message1: .asciz "Please type a string: \n"
.balign 4
input_string:
.asciz ""
.zero 80
return: .word 0
.text
.global main
main:
push {lr}
ldr r0, =message1
bl printf
mov r0, #0
bl fflush
ldr r0, =input_string
mov r1, #80
mov r2, #0
bl fgets
mov r0, r1
bl printf
pop {lr}
bx lr
.end
.global printf
.global read
.global fgets
编辑:
我试图按照评论中给出的示例使用stdin,但编译失败,原因是:
错误:立即表达式需要一个#前缀--'mov r2,=stdin'
对于“stdin”,似乎没有像C中那样的预定义宏,那么如何告诉它使用stdin呢
ldr r0,=input_string
mov r1,#80
ldr r2,=stdin
ldr r2,[r2]
bl fgets
答案是使用LDR和stdin当您为
文件*
fgets的第三个参数传递NULL
指针时,您期望得到什么read
采用Unix文件描述符(作为第一个参数),fgets
采用stdio文件*
作为最后一个参数。显示如何使用fgets
。刚才注意到您的read
调用正在传递r3
中的长度,这是一个不存在的第四个参数,而不是r2
(第三个参数)。此外,在asm中,内联svc
系统调用指令而不是调用libc包装器是相当常见的。(电话号码为R7,IIRC)。我将字符串缓冲区传递为arg1,比特数传递为arg2,我认为是stdin,但您链接到的示例似乎显示了预定义的stdin。但当我尝试它时,它不起作用。ldr r0,=输入字符串mov r1,#80 mov r2,=stdin ldr r2,[r2]是,FILE*stdin
是一个全局指针变量,由libc启动代码初始化,指向文件
结构。我本以为这会奏效,至少如果你做到了ldrr2,=stdin
而不是mov
。查看C编译器输出()
ldr r0,=input_string
mov r1,#80
ldr r2,=stdin
ldr r2,[r2]
bl fgets