Показать сообщение отдельно

  #452  
Старый 04.12.2008, 04:46
bons
Участник форума
Регистрация: 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
 
Ответить с цитированием