如何区分我在 Assembly 中按回车键和写入 0 的时间?

how to differentiate between when i press enter and write 0 in Assembly?

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 并按回车键时,所有标志和寄存器值都相同。所以我无法在代码上区分它。

当我调用 WriteChar 并检查第一个字符是否输入时,我可以解决这个问题,但它是非常复杂的代码。当我写值以防调用 WriteChar 时,我不得不将值从字符串更改为整数。

有什么简单的方法可以解决这个问题吗?

不可能!您必须重写 Irvine 的 ReadInt 程序。

原函数使用ReadString,结果存入ECX。但是,由于 USES ecx edxECX 的前值将在过程结束时恢复。只需将其更改为 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