下午好!
找不到好的键盘输入法。虽然停在ReadConsoleA
+ atodw
。但只有数字乘以 100 + 2428。
编码:
.386
.model flat, stdcall
_data segment
_data ends
_text segment
option casemap:none
ExitProcess proto :dword
GetStdHandle proto :dword
ReadConsoleA proto :dword,:dword,\
:dword,:dword,:dword
includelib C:\masm32\lib\kernel32.lib
include \masm32\include\masm32rt.inc
.data
stdin DWORD ?
stdout DWORD ?
cWritten DWORD ?
buff byte 16 dup (0)
cRead DWORD ?
sss dd 0
ddd dd 0
ifmt db "%d", 0
.code
start:
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, EAX
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, EAX
invoke ReadConsoleA, stdin, ADDR buff, sizeof buff, ADDR cRead, 0
;теперь buff содержит введенную строку
invoke atodw, offset buff
;почему-то после выполнения atodw число получается умноженым на 100 + 2428
;поправляем
mov sss, EAX
add sss, -2428 ;отнимаем 2428
mov EAX, sss
mov ddd, 100
div ddd ;делим на 100
mov sss, EAX
invoke wsprintf, ADDR buff, ADDR ifmt, sss ;форматируем число для вывода
invoke WriteConsoleA, stdout, ADDR buff,\
sizeof buff, ADDR cWritten, 0 ;выводим число
invoke ExitProcess, 0 ;завершаем процесс
end start
告诉我为什么会这样。还有什么其他方法可以从键盘输入数字?
最有可能
ReadConsoleA
将 Windows 中接受的回车放入缓冲区,即 两个字节 0x0D 和 0x0A。masm32 sdk 中的 atodw 函数,在将数字从 ascii 表示转换为二进制时,不会检查缓冲区中是否正好有数字,而是对输入字符串的每个字节执行标准操作,将 ascii 数字转换为二进制表示, IE。从一个字节中减去 0x30(忽略溢出)。所以我们得到了你的神秘号码 2428 ...
我建议在输入数据后检查它们是否为数字,一旦遇到第一个非数字就终止该行(就像许多编程语言在尝试将字符串转换为数字时所做的那样)并且只有在此之后才使用 atodw在一条清除了一切多余的线路上。
那些。像这样的东西(没有什么要检查的,代码没有检查):
或许masm32中对此有现成的功能,但我不知道这个。