如何区分何时按下输入并在汇编中写入0?

时间:2017-06-03 04:18:37

标签: assembly masm irvine32

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

我想按Enter键时结束程序, 当我写整数值(-2 ^ 15~2 ^ 15-1)时打印值。

我有一个问题,我不知道当我写0值并按回车键时如何让编译器区分。当我写0并按回车键时,所有标志和寄存器值都相同。所以我无法在代码上区分它。

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

有没有简单的方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

没办法!你必须重写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