2017-06-03 35 views
1
Include Irvine32.inc 

.data 
prompt1 BYTE "Bye!", 0 
prompt2 BYTE "Type an integer : ", 0 

.code 
MAIN PROC 

    mov edx, OFFSET prompt2 
    call WriteString 

    call ReadInt 

    exit 
MAIN ENDP 

end main 

我想結束程序的時候我只是按回車鍵, 和我寫整數值(-2^15〜2^15-1)時的打印值。如何區分當我按下輸入並在彙編中寫入0?

我有一個問題,我不知道如何讓編譯器區分,當我寫0值並按回車鍵。當我寫入0並按下確認鍵時,所有的標誌和寄存器值都是相同的。所以我無法區分它的代碼。

我可以解決這個問題,當我打電話給WriteChar並檢查第一個字符是否輸入,但它是非常複雜的代碼。當我在寫WriteChar的情況下編寫值時,我不得不將字符串的值更改爲整數。

有沒有簡單的方法可以解決這個問題?

回答

0

不行!你必須重寫Irvine的ReadInt程序。

原函數使用ReadString並將結果存儲在ECX中。但是,由於USES ecx edx,前一個值ECX將在過程結束時恢復。只需將其更改爲USES edx即可解決問題。 ECX現在包含輸入字符串的大小。

Include Irvine32.inc 

.data 
prompt1 BYTE "Bye!", 0 
prompt2 BYTE "Type an integer : ", 0 
promptBad BYTE "Invalid input",0 

.code 
MAIN PROC 

    mov edx, OFFSET prompt2 
    call WriteString 

    read: 
    call myReadInt 

    jo error 
    jecxz error 

    call WriteInt 
    exit 

error: 
    mov edx,OFFSET promptBad 
    call WriteString 
    exit 
MAIN ENDP 

myReadInt PROC USES edx 
LOCAL digitBuffer[50]:BYTE 

    lea edx, digitBuffer 
    mov ecx,50 
    call ReadString 
    mov ecx,eax ; save length in ECX 

    call ParseInteger32 ; returns EAX, CF 

    ret 
myReadInt ENDP 

end main 
+0

非常感謝你!!!! – uninopkn