Wsprintf FASM лишние символы - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, не могу никак решить проблему с консольной программой на FASM Мне необходимо заданное число перевести в строку и вывести на экран, без лишних символов :\ Делаю так:
format pe console 4.0
entry start
include 'win32w.inc'
include 'encoding/win1251.inc'
include 'api/kernel32.inc'
include 'api/user32.inc'
section '.idata' import data readable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
 
struc TCHAR [data]
{
common
    . TCHAR data
    .length = ($ - .) / sizeof.TCHAR 
}
 
section '.data' data readable writeable
    hOut dd ?
    hIn dd ?
    dNumWri dd ?
    Buffer TCHAR 100h dup ?
 
    bufferforstring_q db 16h dup (' --- --- --- ---')
    bufferforstring_e TCHAR 16h dup (' --- --- --- ---')
 
szformat_q TCHAR 'x=%u'
szformat_e TCHAR 'y=%u'
 
;------------------------------------------------------------------
 
section '.code' code readable executable
    str_title TCHAR 'lab 6', 0
    str_end TCHAR 'exit...', 0
 
start:
 invoke SetConsoleTitle, str_title
 
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov [hOut], eax
    invoke GetStdHandle, STD_INPUT_HANDLE
    mov [hIn], eax
 
mov ebx, 15
invoke wsprintf, bufferforstring_q, szformat_q, ebx
invoke WriteConsole, [hOut], bufferforstring_q, 16, 0, 0
 
invoke ReadConsole, [hIn], Buffer, Buffer.length-1, dNumWri, 0
invoke ExitProcess,0
Пробовал по всякому, но не понимаю почему после wsprintf в bufferforstring_q забивается всякая фигня, как можно от нее избавиться?

Решение задачи: «Wsprintf FASM лишние символы»

textual
Листинг программы
format pe console 4.0
entry start
 
include 'include\win32w.inc'
include 'include\encoding/win1251.inc'
include 'include\api/kernel32.inc'
include 'include\api/user32.inc'
 
section '.idata' import data readable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
 
struc TCHAR [data]
{
common
    . TCHAR data
    .length = ($ - .) / sizeof.TCHAR 
}
 
section '.data' data readable writeable
    hOut dd ?
    hIn dd ?
    Buffer TCHAR 100h dup ?
    dNumWri dd ?
  
szformat_q TCHAR 'x=%u',0
szformat_e TCHAR 'y=%u',0
szformat_res TCHAR 'x+y=%u',0
szformat_res2 TCHAR 'x-y=%u',0
szformat_res3 TCHAR 'x*y=%u',0
szformat_res4 TCHAR 'x/y=%u',0
str_title TCHAR 'lab 6', 0
str_end TCHAR 'exit...', 0
 
section '.code' code readable executable
 
;------------------------------------------------------------------
ish_zn:
mov ebx, 4
mov ecx, 3
ret
;------------------------------------------------------------------
 
proc printf,arg1,arg2
 
 
cinvoke wsprintf, Buffer, [arg1], [arg2]
mov dword [Buffer+eax*2],0a000dh
add eax,2
invoke WriteConsole, [hOut], Buffer, eax, 0, 0
 
ret
 
endp
; -------------------------------------------------------------------------
 
start:
 invoke SetConsoleTitle, str_title
 
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov [hOut], eax
    invoke GetStdHandle, STD_INPUT_HANDLE
    mov [hIn], eax
 
call ish_zn
stdcall printf,szformat_q,ebx
 
call ish_zn
stdcall printf,szformat_e,ecx
  
call ish_zn
mov edx, ebx
add edx, ecx
 
stdcall printf,szformat_res,edx
 
call ish_zn
mov edx, ebx
sub edx, ecx
 
stdcall printf,szformat_res2,edx
 
call ish_zn
mov edx, ebx
imul edx, ecx
 
stdcall printf,szformat_res3,edx
  
call ish_zn
xor edx,edx ; обнуляем edx - это важно, т.к. edx тоже участвует в делении.
mov eax,ebx
idiv ecx ; делим содержимое eax на ecx, результат в eax, остаток в edx.
 
stdcall printf,szformat_res4,eax
 
invoke ReadConsole, [hIn], Buffer, 1, dNumWri, 0
invoke ExitProcess,0

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы