嘿,我有一段对我来说没有意义的汇编代码
.text:004016C5 prompt_uid: ; "[ User %d ]\t"
.text:004016C5 mov [esp+0Ch+var_C], offset aUserD
.text:004016CC mov ecx, [ebp+arg_0]
.text:004016CF mov [esp+0Ch+var_8], ecx
.text:004016D3 call printf
.text:004016D8 mov [esp+0Ch+var_C], esi
.text:004016DB call gets
.text:004016E0 test eax, eax ; test eax=0
.text:004016E2 jz short prompt_uid
起初我对test eax,eax
之后的jz
和gets
感到困惑。
“为什么输入为0?”。然后我想 “确定。字符串由nullbyte终止,因此空字符串应该导致测试设置ZF”
但是当我在实践中测试它时,jz从未被采用过。即使我刚刚按下提示输入。
我的错误在哪里?
答案 0 :(得分:1)
gets() reference给出了何时返回NULL的答案;
返回值
成功完成后,gets()将返回s。 如果流是在 文件结束,应设置流的文件结束指示符 gets()将返回一个空指针。 如果发生读取错误,则会出错 应设置流的指示符,gets()应返回null 指针,[CX]并设置errno以指示错误。
换句话说,gets()
可能会在文件末尾或读取错误时返回NULL,而不是正常的“按返回”操作。