Недавно начал изучать АСМ (с Делфи и ВБ я на ТЫ) и сразу возник у меня такой вопрос (собственно САБЖ). К примеру, в EAX есть число и я хочу отобразить его через MessageBoxA. Как?...
Фишка в том, что у меня три книги по АСМу, но я там ничего об этом не вычитал. Спасибо за dwtoa, atodw - поищу, почитаю...
К примеру, в EAX есть число и я хочу отобразить его через MessageBoxA. Так ? Код (Text): mov eax,123 invoke wsprintfA,offset buf,$CTA0("%u"),eax invoke MessageBox,0,offset buf,offset buf,0
;fasm buf rb 16 fmt db '%u',0 ;u - беззнакоковое целое, d или i - знаковое invoke wsprintfA,buf,fmt,eax
Потому что нужно просто wsprintf без всякого "A" Используй invoke, но после нее добавь add esp,4*3 (т.к. wsprintf это не stdcall и после нее нужно удалять переданные параметры из стека, что и делает add esp)
Кажись все работает... Вот, привожу текст проги (FASM), которая выдает серийный номер ТОМА (не винчестера) диска С:\. Но у меня возникают сомнения, правильный ли результат, мож кто протестит? Код (Text): include 'C:\Program Files\TwR\fasmw164\INCLUDE\win32ax.inc' .code start: invoke GetVolumeInformation, 'c:\', Bfr, 255,dword ptr SN, a, b, 0, 0 cmp EAX, 0 je err mov eax, SN push fmt push buf call [wsprintf] add esp,4*3 invoke MessageBox,0,buf,"Serial Number of C\:",0 jmp exit err: invoke MessageBox,0, _errmsg, _txt,0 exit: invoke ExitProcess,0 .end start buf rb 16 fmt db '%u',0 SN dw ? a dw ? b dw ? Bfr dw 255 dup(0) _txt db 'Volume Information',0 _errmsg db 'Error. Program will terminate',0
По-моему хрень получается! Что бы я не клал в EAX перед вызовом wsprintf в сообщении отображается "2088856911"...
Да, у тебя ошибка на ошибке. 1) переменные SN,a,b должны быть dd а не dw 2) в фасме mov eax,SN заносит в eax адрес SN, а тебе нужно значение по этому адресу, т.е. mov eax,[SN] 2) ты забыл сделать push eax (или push dword [SN] без всякого mov)
Так? Код (Text): include 'C:\Program Files\TwR\fasmw164\INCLUDE\win32ax.inc' .code start: invoke GetVolumeInformation, "c:\", Bfr, 255,dword ptr SN, a, b, 0, 0 cmp EAX, 0 je err push dword [SN] push fmt push buf call [wsprintf] add esp,4*3 invoke MessageBox,0,buf,"Serial Number of C\:",0 jmp exit err: invoke MessageBox,0, _errmsg, _txt,0 exit: invoke ExitProcess,0 .end start buf rb 16 fmt db '%u',0 SN dd ? a dd ? b dd ? Bfr dw 255 dup(0) _txt db 'Volume Information',0 _errmsg db 'Error. Program will terminate',0 Но теперь он выдает "0"...
Код (Text): xor ebx,ebx invoke GetVolumeInformation,szVol,pVolName,nVolName,dwSer,ebx,ebx,ebx,ebx movzx eax,word[dwSer] movzx ecx,word[dwSer+2] cinvoke wsprintf,buf,szFmt,szVol,pVolName,eax,ecx invoke MessageBox,ebx,buf,szCaption,MB_ICONINFORMATION invoke ExitProcess,ebx align 32 szCaption db 'Volume information',0 szVol db 'c:\',0 szFmt db 'Volume [%s]',13,10,'Name: %s, Serial: %02X-%02X',0 dwSer dd 0 nVolName = 260 pVolName rb nVolName buf rb 128