wsprintf



Writeconsole

Автор KVADRO задал вопрос в разделе Другие языки и технологии

Как осуществить вывод в консоль (ASSEMBLER, MASM32) и получил лучший ответ

Ответ от Миоко Таканава[гуру]
Классический пример. Использование WinAPI функции wsprintf вместе с lstrlen для преобразования числа в его символьное представление, определения длины получившейся строки и вывод в консоль функцией WriteConsole:
.386
.model flat, stdcall
option casemap :none
include masm32includewindows.inc
include masm32includekernel32.inc
include masm32includeuser32.inc
includelib masm32libkernel32.lib
includelib masm32libuser32.lib
.data
Format db '%d', 0
.data?
hStdOut dd ?
Buff db 16 dup (?)
.code
start:
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hStdOut, eax
mov eax, 2
add eax, 3
invoke wsprintf, addr Buff, addr Format, eax
invoke lstrlen, addr Buff
invoke WriteConsole, hStdOut, addr Buff, eax, 0, 0
invoke GetStdHandle, STD_INPUT_HANDLE
invoke ReadConsole, eax, addr Buff+4, 12, addr Buff, 0
ret
end start
Можно использовать Runtime библиотеку Си (совсем просто) :
.386
.model flat, C
option casemap :none
include masm32includemsvcrt.inc
includelib masm32libmsvcrt.lib
.data
Format db '%d', 0
.code
start:
mov eax, 2
add eax, 3
invoke crt_printf, addr Format, eax
invoke crt__getch
invoke crt__exit, 0
end start
А можно самостоятельно сформировать строку с символьным представлением числа и вывести её функцией WriteConsole или WriteFile:
.386
.model flat, stdcall
option casemap :none
include masm32includewindows.inc
include masm32includekernel32.inc
includelib masm32libkernel32.lib
.data?
hStdOut dd ?
Buff db 16 dup (?)
Len dd ?
.code
start:
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hStdOut, eax
mov eax, 2
add eax, 3
lea edi, Buff
xor ecx, ecx
cdq
xor eax, edx
sub eax, edx
test dl, dl
jz @F
mov byte ptr [edi], '-'
inc edi
inc ecx
@@:
mov ebx, 10
@@:
xor edx, edx
div ebx
push edx
inc ecx
test eax, eax
jnz @B
mov ebx, ecx
@@:
pop eax
or al, 30h
stosb
loop @B
invoke WriteFile, hStdOut, addr Buff, ebx, addr Len, NULL
invoke GetStdHandle, STD_INPUT_HANDLE
invoke ReadConsole, eax, addr Buff, 16, addr Len, 0
invoke ExitProcess, 0
end start

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Как осуществить вывод в консоль (ASSEMBLER, MASM32)
Printf на Википедии
Посмотрите статью на википедии про Printf
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*