надо в меседжбоксе вывести содержание переменной, как реализовать? Great: В этой теме задаем простые вопросы по ассемблеру (специально для новичков)
Элементарно: Code: ... .data msgtext db "Hello, WORLD", 0h msgcap db "It is ASM!!! =)", 0h ... .code start: INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0 end start
гг..ты немного...а точнее совсем нетак понял. Значение в переменную заносится во время работы проги, например я от функции получаю число. и его надо вывести на месседж бокс вот примерный код: ................... Code: .data msgtext db "Hello, WORLD", 0h msgcap db "It is ASM!!! =)", 0h messedg db ? ............... Code: code start: mov messedg, 15 INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0 end start Использовал вместо функции MOV, соответственно как на месседж бокс вывести содержание переменной messedg (число 15)
Просто так вывести нельзя. так число - это не строка. Поэтому нужно перевести из числа в строку. Можно сделать это вручную, но лучше юзать API функцию. Вот код на FASM. Выводит содержимое регистра. Code: format PE GUI entry _start include 'd:\coding\fasm\include\win32ax.inc' include 'd:\coding\fasm\include\encoding\win1251.inc' include 'd:\coding\fasm\include\apia\user32.inc' section '.data' data readable writeable formats db "%d",0 zagolovok db "Содержимое регистра",0 temp db 256 dup(?) section '.code' code readable executable _start: mov eax,-1234568 invoke wsprintf,temp,formats,eax invoke MessageBox,0,temp,zagolovok,MB_OK invoke ExitProcess,0 section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',user32,'USER32.DLL' include 'd:\coding\fasm\include\apia\kernel32.inc'
Решил тоже ассемблер поизучать. Пишется таким способом тяжело, зато инжектится в чужой процесс элементарно. IMНO зачем тогда ассемблер нужен. INVOKE wvsprintf,offset outst,offset inst,var1,var2, ..... h ttp://msdn2.microsoft.com/en-us/library/ms647551.aspx Преобразует содержание переменной(ых) в строку. Code: .486 .model flat,stdcall option casemap :none kernel32 EQU edx user32 EQU ebx CallFunc MACRO reg,zText:VARARG LOCAL m1 call m1 db zText,0 m1: push reg call ebp call eax ENDM cText MACRO zText:VARARG LOCAL m1 call m1 db zText,0 m1: ENDM ;---------------------------------------------- .code start: mov edx,[esp] call sfind_kern_b ; edx kernel32.dll ModuleHandle ; ebx User32.dll ModuleHandle ; ebp = GetProcAddress(GetModuleHandle('kernel32.dll),'GetProcAddress'); push kernel32 ;--1 cText 'user32.dll' CallFunc kernel32,'LoadLibraryA' mov user32,eax pop kernel32 ;--1 ;-------------------------------------------------- CallFunc kernel32,'GetCurrentProcessId' ;-------------------------------------------------- ; INVOKE wvsprintf,offset outst,offset inst,var1,var2, ..... ; http://msdn2.microsoft.com/en-us/library/ms647551.aspx ;------------------- mov ecx,10 m1: push 0 loop m1 ;10*4+ mov ecx,esp ;offset outst push ebp ;--1 push ebx ;--2 push eax ;ProcessId var1 push esp ;var1 cText 'It is MASM!!! =)%#8IX',0 ;//offset inst push ecx ;offset outst CallFunc user32,'wvsprintfA' add esp,4 ; var1 dellete pop ebx ;--2 pop ebp ;--1 mov ecx,esp ;offset outst ;--------------------------------------------------- ;-- MessageBox ---------------------------------- push 0 cText 'ProcessId' push ecx ;offset outst push 0 CallFunc user32,'MessageBoxA' add esp,10*4 ;10*4- ret ; exit proocess ;------------------------------------------- ;-- No comments -- Не отлажено ------ sfind_kern_b: ;edx base sfind_kern_bs: and edx,0ffff0000h cmp word ptr [edx],05A4Dh jz sfind_kern_b1 sub edx,1000h jmp sfind_kern_bs sfind_kern_b1: mov eax,[edx+3ch] mov ebx,edx add ebx,eax cmp word ptr[ebx],04550h jz sfind_kern_b2 sub edx,1000h jmp sfind_kern_bs GPA db 'GetProcAddress',0 sfind_kern_b2: mov esi,offset GPA mov ebx,EDX add ebx,03Ch mov eax,[ebx] mov ebx,EDX add ebx,eax add ebx,160h-0e8h mov ecx,EDX add ecx,[ebx] add ecx,12 ; adr export mov ebx,EDX add ebx,[ecx] mov edi,ebx xor eax,eax sadrxor: push edi push esi sgpa_fefe: pop edi pop esi inc esi push esi push edi mov ecx,0Fh repe cmpsb cmp ecx,0 jz sgpa_fef mov cl,0 cmp [esi],cl jnz sgpa_fefe inc eax jmp sgpa_fefe sgpa_fef: pop edi pop esi push eax mov ebx,EDX add ebx,03Ch mov eax,[ebx] mov ebx,EDX add ebx,eax add ebx,160h-0e8h mov ecx,EDX add ecx,[ebx] pop ebx dec ebx MOV EAX,[ECX+24h] add eax,edx MOV bx,[eax+ebx*2] MOV EAX,[ECX+1ch] add eax,edx MOV EAX,[eax+ebx*4] add eax,edx mov ebp,eax ret end start Как бы все это попроще писать? Особенно переменные в стеке.
2 da_ff. Типа сумничал? Можно и сделать деление, но это только в тех случаях когда пишешь под DOS. потому что там нет API функций. Если нужно под дос, то могу выложить примерчик!
О! крута.... ну раз такой сабж забили, то посоветуйте книги/статьи попроще, ибо я ваще в этом не шарю
В.Юров учебник+справочник, калашникова рекомендуют (не читал) ЗЫ. Зубкова еще рекомендуют, сам не читал ) ЗЫЫ. Вообще, моё имхо, рано или поздно по любой книге можно выучить асм. Точнее, не по одной, а если купить несколько книг, мозг в конце концов научится отфильровывать ненужное.
Какраз Икзелиона туторы для начала будут сложные. Лутше начинай с Калаша, потом Самоучитель Ассемблер IBM PC (Галисеева) ну и под конец Assembler для DOS, Win , Unix (Зубкова) Как по мне это три основные книжки, от Калаша узнаеш вообще что такое асм там всё очень доходчиво описано, Самоучитель - это уже следуйщий уровень, описана работа под Вынем и некоторые интересные алгоритмы, Зубков - это классика тут уже высший уровень. Линки не давал потому что у меня эти книжки в печатном варианте. Назвал основу но конечно чем больше инфы прочитаеш ( и запомниш! ) тем лутше для тебя (Тот же Икзелион). Так что гугл тебе в руки, сейчас литературы очень много!
Берешь список инструкций МП и этого уже будет достаточно. Ну и как всегда Справочник по Api функциям и прерываниям Dos
Во что компилить - это уже во что захочешь. т.е. есть опции для компиляции, также внутри файла есть маханькие описания. типа если файл создает из сегмента кода, данныйх итд, то никогда ты его не скомпилишь в ком файл. Вроде масм компилит по умолчанию в EXE. Для того чтобы компильнуть под COM нужно делать так: ml.exe [имя_файла].asm /AT
мой любимый способ: создаешь example.bat туды пишешь Code: ;@echo off ;goto make .386 .model flat,stdcall option casemap:none include D:\masm32\include\windows.inc include D:\masm32\include\user32.inc include D:\masm32\include\kernel32.inc includelib D:\masm32\lib\kernel32.lib includelib D:\masm32\lib\user32.lib .data s_title db "Хэкк",0 s_zzz db "хэккерский хэккк",0 .code start: invoke MessageBox,0,addr s_zzz,addr s_title,0 invoke ExitProcess,0 end start :make set asmname=D:\example title %asmname%.bat D:\masm32\bin\ml /c /coff %asmname%.bat D:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:D:\masm32\lib %asmname%.obj del %asmname%.obj echo pause запускаешь батник >>> .exe готов!! что компилятору и линкеру скажешь, то он и сделает.. (.exe .com .dll .sys .....) на wasm.ru кажется были опции
Командами: ml /c /coff /Cp *.asm link /SUBSYSTEM:CONSOLE *.obj Флаги различны в зависимости от того, что на выходе хочешь. Навскидку что обозначают к сожалению уже не помню - смотри на wasm.ru Оу, что-то не понял прикола, прошу пояснений. Твой способ у меня не сработал к сожалению. =) Да ну, имхо фигня эти все ide для асма. Максимум нужны только в крупных проектах, чтоб не запутаться.