2013-09-26 72 views
0

我在寫一個簡單的NASM彙編程序。我有大約95%的結果。但是,我遇到了一個我似乎無法解決的問題。打到ctrl - d應該顯示再見消息,然後終止程序。下面是我有什麼NASM不讀ctrl-d字符

Section .bss 
    Buff resb2 
    BuffLen equ $-Buff 

loop: 
    ; some code 
    mov ecx, Buff 
    move edx, BuffLen 
    ; some code 
    cmp ecx, 0x04 
    je Exit 
    jne loop 

根據ASCII表的骨架,CTRL +d是0×04。我必須錯過簡單的東西。有沒有人有任何想法?

+0

1)您的程序是否可以正確地用於其他代碼,尤其是可打印的代碼? 2)根據您使用什麼類型的終端與您的程序進行交互,CTRL-D可能會被困在那裏或被翻譯出來。 –

+0

除了Chris提到的,你正在比較'buff'的地址'ecx'和'0x04'。不大可能!嘗試'cmp byte [ecx],0x04'。 –

+0

對不起,反應遲緩,正在寫另一份作業。我試着用ctrl_j(0x0A),並讓它工作得很好。這導致我相信ctrl + d出現了一些問題。弗蘭克,我也實施了你的建議。 –

回答

2

Ctrl - D您鍵入的內容不會成爲輸入的一部分。相反,它是您的終端向標準輸入文件流發送EOF條件的信號。你的程序應該響應處於EOF狀態的標準輸入。 (例如,在Posix上,read(2)系統調用將返回零)。

+0

'ctrl-d'只在空行輸入時才發送EOF。如果你在'ctrl-d'之前鍵入了一些文本,它只是「發送」那個文本(即使'read'返回)而不使它返回EOF。用「貓」來試試。 –

1

您可以嘗試「cmp eax,0」,而不是比較「cmp ecx,0x04」。因爲打到CTRL + D在Linux中讀取系統調用的返回值將爲0字節,並且該「0」將保存在eax-Register中。

PS:我不是100%確定它是如何工作的,因爲此刻我也有問題。但這樣我至少可以在大部分時間退出程序。