|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме: 1777055
Репутация:
347
|
|
Ребят, помогите пожалуйста... Через консоль должно вводиться шестнадцатиричное число. Для ввода использую ReadConcole. Как работать с переменной, куда ввел все это, как с числом в шестнадцатиричной системе, а не как со строкой...
вот пример ввода строки, содержащей 16-ое число. процедура Ascii2Hex переводит ее именно в числовой вид
Код:
.386
.model flat, stdcall
option casemap :none
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
Ascii2Hex PROTO :DWORD
cprintf PROTO C :DWORD, :DWORD, :VARARG
.data
msgStart db "# Enter num: "
outformat db "%u", 0
buf db 128 dup (0)
.data?
hOut dd ?
hIn dd ?
bw dd ?
.code
start:
invoke GetStdHandle, STD_INPUT_HANDLE
mov hIn, eax
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hOut, eax
invoke WriteFile, eax, offset msgStart, sizeof msgStart, offset bw, 0
invoke ReadFile, hIn, offset buf, sizeof buf - 1, offset bw, 0
mov esi, bw
mov BYTE PTR [buf + esi - 2], 0
invoke Ascii2Hex, offset buf
invoke cprintf, hOut, offset outformat, eax
invoke ExitProcess, 0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Перевети hex-строку в число
Ascii2Hex proc uses ebx esi lpHexString:DWORD
mov esi, lpHexString
xor eax, eax
xor ebx, ebx
@@:
mov al, BYTE PTR [esi]
test al, al
jz @exit
shl ebx, 4
.IF al > 040h
sub al, 007h
.ENDIF
xor al, 030h
or ebx, eax
inc esi
jmp @B
@exit:
mov eax, ebx
ret
Ascii2Hex endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Печатать форматированный текст в консоли
cprintf proc C hOutHandle:DWORD, lpFormat:DWORD, arglist:VARARG
LOCAL locbuf[2048] :BYTE
LOCAL dwWritten :DWORD
invoke wvsprintf, addr locbuf, lpFormat, addr arglist
mov ecx, eax
invoke WriteFile, hOutHandle, addr locbuf, ecx, addr dwWritten, 0
ret
cprintf endp
end start
|