我非常确定命令行上的输入参数应该是一个字符串,但是当我执行"call __isoc99_sscanf“时,eax寄存器的值为0。我真的不知道“调用__isoc99_sscanf”是如何工作的,但我知道堆栈指针是这样排序的:
.LC1 |V
在"call __isoc99_sscanf“为33之前,.LC1为"Input:%s”和eax,并在内存中保存一个字符串。在任何情况下,调用__isoc99_sscanf的结果都是1?
.code32
.file "mystery.c"
.text
.LCO:
.string "Incorrect number of command line arguments given"
.LC1:
.string "Input:%s"
.align 4
.LC2:
.string "Incorrect format for command line argument"
.LC3:
.string "Output: \"%s\"\n"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
cmpl $2, 8(%ebp)
je .L18
movl $.LC0, (%esp)
call puts
movl $1, %eax
jmp .L19
.L18:
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call strlen
movl %eax, %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
movl %eax, (%esp)
call malloc
movl %eax, 28(%esp)
movl $.LC1, %edx
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl 28(%esp), %ecx
movl %ecx, 8(%esp)
movl %edx, 4(%esp)
movl %eax, (%esp)
call __isoc99_sscanf
cmpl $1, %eax
je .L20
movl $.LC2, (%esp)
call puts
movl $1, %eax
jmp .L19
.L20:
movl 28(%esp), %eax
movl %eax, (%esp)
call foo
movl $.LC3, %eax
movl 28(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl 28(%esp), %eax
movl %eax, (%esp)
call free
jmp .L17
.L19:
.L17:
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
.section .note.GNU-stack,"",@progbits
发布于 2014-03-19 04:01:51
我认为这很有帮助:
man scanf:
These functions return the number of input items successfully matched
and assigned, which can be fewer than provided for, or even zero in the
event of an early matching failure.
发布于 2019-06-09 06:06:15
基本上,它返回您刚刚在计算机中键入的输入总数。如果你在"1 4“中输入两个数字,它会将%rax设置为2。
https://stackoverflow.com/questions/22489434
复制相似问题