获得后测试为0

时间:2012-10-24 12:45:27

标签: assembly control-flow instructions

嘿,我有一段对我来说没有意义的汇编代码

.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之后的jzgets感到困惑。

“为什么输入为0?”。然后我想 “确定。字符串由nullbyte终止,因此空字符串应该导致测试设置ZF”

但是当我在实践中测试它时,jz从未被采用过。即使我刚刚按下提示输入。

我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

gets() reference给出了何时返回NULL的答案;

  

返回值

     

成功完成后,gets()将返回s。 如果流是在   文件结束,应设置流的文件结束指示符   gets()将返回一个空指针。 如果发生读取错误,则会出错   应设置流的指示符,gets()应返回null   指针,[CX]并设置errno以指示错误。

换句话说,gets()可能会在文件末尾或读取错误时返回NULL,而不是正常的“按返回”操作。