2012-10-24 62 views
1

嘿,我有彙編代碼片段沒有意義對我測試爲0後得到

.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混淆跟隨gets

「爲什麼輸入是0?」。然後,我認爲 「好吧,字符串被零字節終止,所以空字符串應導致測試設置ZF」

但是當我在實踐中測試它時,jz從未被採用。即使我只是按提示輸入。

我的錯誤在哪裏?

回答

1

gets() reference給出了何時返回NULL的答案;

返回值

成功完成後,gets()函數將返回秒。 如果流爲 文件結束,則應設置流的文件結束指示符,並且get()應返回空指針。 如果發生讀錯誤,則應設置流的錯誤 指示符,gets()應返回空指針[CX]並設置errno以指示錯誤。

換句話說,gets()可能會在文件結尾或讀取錯誤時返回NULL,而不是在正常的「press return」操作中。

+0

啊!我在這裏犯了兩個錯誤:a)我忘記了結果實際寫入了作爲參數提供的緩衝區b)我沒有考慮EOF。 – er4z0r