Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 气体汇编器-Fgets功能故障_Assembly_Arm_Fgets_Gnu Assembler - Fatal编程技术网

Assembly 气体汇编器-Fgets功能故障

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

当我尝试使用FGET时,这个简单的程序会出错。我试着用read函数代替

       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