Good day!
I can not find a good way to enter the keyboard. While stopped at ReadConsoleA + atodw . But only the number is multiplied by 100 + 2428.
Code:
.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 Tell me why it happens. And what other ways are there to enter numbers from the keyboard?
atodwmay not work correctly. As I understand it, this is a masm32-specific function, it is not in one standard dll, and only a fasm is at hand. In the evening I can look. Alternatively, you can usesscanffrommsvcrt.dllinstead. - insolorsub eax, 2428; mov ebx, 100; div ebxregisters were made so that operations are much faster than external memory ... - Mike