2013-05-13 70 views
0

我想要求任何人瞭解彙編代碼的幫助。我的問題是: 標籤L2之後的代碼很重要,它調用子程序函數。但在我看來,程序永遠不會到達標籤L2之後的代碼,因爲根據我的系統調用,讀取(在L1之後)總是讀取0,並且在將其與1比較之後,但零不會等於1,所以在我看來,程序永遠不會跳到L2。我想我一定是錯的。我真的很感謝所有幫助具有跳轉和系統調用讀取功能的彙編代碼(x86)

jmp L1 
L2: 
movzbl -0x11(%ebp), %eax 
movsbl %al, %eax 
mov %eax, (%esp) 
call SUBROUTINE_FNC 
<...> 

L1: 
mov $0x0, %ebx 
lea -0x11(%ebp), %ecx 
mov $0x1, %edx 
mov $0x3, %eax 
int $0x80 
mov %eax, -0x10(%ebp) 
cmpl $0x1, -0x10(%ebp) 
je L2 
+2

我猜我們正在談論Linux系統調用,但您可能想要添加OS到標籤。 – 2013-05-13 06:41:52

回答

1

的系統調用對應read,它看起來像你想在一次讀取一個字節。 read應該返回實際讀取字節數,因此,如果調用成功,那麼你會得到一個返回值1,比較會是真實的,你會跳轉到L2,即

L2: 
SUBROUTINE_FNC(...); 

if (read(fd, buff, 1) == 1) // read one byte 
    goto L2;    // if one byte read then loop to L2 

,或者在更結構化的形式:

while (read(fd, buff, 1) == 1) 
{ 
    SUBROUTINE_FNC(...) 
} 
+2

+1假設Linux eax =系統調用號(3) ebx =文件描述符 ecx =指向要讀取的緩衝區的指針 edx =要讀取的字節數(1)'。 – 2013-05-13 06:50:43

+0

非常感謝您的回答 – 2013-05-13 07:54:24