如何区分我在 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 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
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 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