Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› Fasm |
Посл.ответ | Сообщение |
|
Создано: 08 октября 2006 23:59 · Личное сообщение · #1 1.Как в Fasm обеспечиь рекурсивный вызов макросов если это возмжно 2.как определять данные из одного места (внутри программы) которые должны находится в другом проще говоря как бы ясделал в Masm: .data str0 db 'привет',0 str1 db 'чуваки',0 .code invoke MessageBox,0,addr str0,addr str1,0 и не нужно было бы определять строки таким карявым способом когда мы их складываем внутри кода а потом джампуем вниз до следущей команды PS. не надо говорить про COFF я знаю про него но надо бы чтонибуть мультиплатформеное |
|
Создано: 09 октября 2006 01:48 · Поправил: Av0id · Личное сообщение · #2 |
|
Создано: 09 октября 2006 02:04 · Поправил: TOR · Личное сообщение · #3 1. Явно нельзя,но поизвращаться можно.Например: macro AMacro i ; i - depth { push endmA ;---- var init xor ebx,ebx ;------------ mov eax,i @@: ;-- you code inc ebx ;sample ;retn ;-for exit ;----------- dec eax test eax,eax jz @F call @B @@: retn endmA: } В коде: AMacro 2 2.Нихрена не понял. Чем тебе такое не нравиться: push MB_OK push DWORD str0 push DWORD str1 push 0 call [MessageBox] jmp @F str0 db 'привет',0 str1 db 'чуваки',0 align 4 @@: .... |
|
Создано: 09 октября 2006 03:35 · Личное сообщение · #4 |
|
Создано: 09 октября 2006 03:53 · Личное сообщение · #5 Насчет: push DWORD str0 ;то можно и так конечно: push str0 ,кто-как привык но лучше явно указать. глюков при компиляции будет меньше. call MessageBox ;у тебя не пройдет, так как тебе нужно взять адресс функции из таблицы импорта,и обращаться(call) по этому адресу. правильно : call [MessageBox] Это, конечно, верно при такой структуре программы: section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32,'user32.dll' include '%fasminc%\apia\KERNEL32.INC' include '%fasminc%\apia\User32.INC' Можно и подругому,как кому нравиться извращаься с кодом. |
|
Создано: 12 октября 2006 01:11 · Личное сообщение · #6 Av0id пишет: section '.idata' data readable writeable str0 db "превед",0 str1 db "учаснеги",0 section '.code' code readable writable executable start: invoke MessageBox,0,str0,str1,0 invoke ExitProcess,NULL ЭТО НЕ УДОБНО!!! TOR пишет: macro AMacro i ; i - depth { push endmA ;---- var init xor ebx,ebx ;------------ mov eax,i @@: ;-- you code inc ebx ;sample ;retn ;-for exit ;----------- dec eax test eax,eax jz @F call @B @@: retn endmA: } господа так никогда не делайте это точно извращение ! (и насилие над стеком) TOR пишет: 2.Нихрена не понял. Чем тебе такое не нравиться: push MB_OK push DWORD str0 push DWORD str1 push 0 call [MessageBox] jmp @F str0 db 'привет',0 str1 db 'чуваки',0 align 4 @@: мне это не нравится тем что мы делаем ненужные джампы и кроме того не каждый дизассемблер мне покажет такую вот штуку: jmp @f str0 db 'это вот не код',0 @@: xor eax,eax ;а это код ............ в том виде в каком она есть а как я буду отлаживать тогда АААА? |
|
Создано: 12 октября 2006 04:04 · Поправил: TOR · Личное сообщение · #7 HUMan45 пишет: господа так никогда не делайте это точно извращение ! (и насилие над стеком) Ок,тогда при реализации рекурсивного вызова через вызов функции,у тебя в стек попадет: _stdcall: адресс возврата пераметр 1 _fastcall: адрес возврата параметр 1 пойдет через регистр Мой код приближен к _fastcall,чем тебе это не нравиться? Если реально очень много раз должен вызываться тот же код,что тебе мешает это сделать не макросами,не процедурами,а просто в цикле? HUMan45 пишет: мне это не нравится тем что мы делаем ненужные джампы и кроме того не каждый дизассемблер мне покажет такую вот штуку: jmp @f str0 db 'это вот не код',0 @@: xor eax,eax ;а это код Обьясняю на пальцах.Этот код будет выглядеть так(эквивалент).: jmp метка: str0 db 'это вот не код',0 метка: код... Уверяю,ИДА тебе это нормально покажет. |
|
Создано: 12 октября 2006 05:49 · Личное сообщение · #8 HUMan45 пишет: section '.idata' data readable writeable str0 db "превед",0 str1 db "учаснеги",0 section '.code' code readable writable executable ЭТО НЕ УДОБНО!!! Не понял. Это классика программирования. Для этого секции и придумали. Т.к. речь в т.ч. и про макросы, то советую книжки читать. Никто не заставляет тебя писать все данные в одном месте ( секция данные), а прогу отдельно. Изначально подразумевалось как раз, что ты напишешь так : section '.code' code readable writable executable start: invoke MessageBox,0,str0,str1,0 section '.idata' data readable writeable str0 db "превед",0 str1 db "учаснеги",0 section '.code' code readable writable executable invoke ExitProcess,NULL ==================== Я fasm не знаю, но нормальные ассемблеры собирают(собирали) код в одну секцию, а данные в другую. Именно поэтому их ассемблерами(сборщиками) и назвали. А вот проклятая фирма ИБМ писала свои макросы именно с джампом |
|
Создано: 12 октября 2006 05:56 · Личное сообщение · #9 |
|
Создано: 12 октября 2006 06:40 · Поправил: TOR · Личное сообщение · #10 |
|
Создано: 12 октября 2006 21:00 · Личное сообщение · #11 |
|
Создано: 15 октября 2006 22:27 · Личное сообщение · #12 S_T_A_S_ нельзя ли поподробнее об uglobals\iglobals и fresh tundra37 пишет: section '.code' code readable writable executable start: invoke MessageBox,0,str0,str1,0 section '.idata' data readable writeable str0 db "превед",0 str1 db "учаснеги",0 section '.code' code readable writable executable invoke ExitProcess,NULL ==================== это фасм т.е. плоский асемблер при этом создается три секции две из них одноименные '.code' и вобще чуваки по второму вопросу я решил сам проблему так: macro makeglobs { } macro globalparam [args] { forward macro makeglobs /{ makeglobs args /} } теперь я определяю так globalparam <str0 db 'sdfsdg',0> а ниже пишу makeglobs но есть одно ограничение мыне можем определить globalparam ниже makeglobs он не видит макрос теперь продолжаю вопрос : есть ли такая опция двойного прохода макросов чтобы mekeglobs увидел изменения от globalparam короче в масме такая приблуда есть |
eXeL@B —› Программирование —› Fasm |