1

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

.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,eaxjz跟随 a感到困惑gets

“为什么任何输入都是0?”。然后我想“好的。字符串由一个空字节终止,所以一个空字符串应该导致测试设置 ZF”

但是当我在实践中对其进行测试时,jz 从未被使用过。即使我只是在提示符下按回车。

我的错误在哪里?

4

1 回答 1

1

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

返回值

成功完成后,gets() 将返回 s。如果流位于文件末尾,则应设置流的文件结束指示符,gets() 应返回空指针。如果发生读取错误,则应设置流的错误指示符,gets() 应返回空指针 [CX] 并设置 errno 以指示错误。

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

于 2012-10-24T12:50:17.557 回答