Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Fasm
Посл.ответ Сообщение

Ранг: 4.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 я знаю про него но надо бы чтонибуть мультиплатформеное



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 09 октября 2006 01:48 · Поправил: Av0id
· Личное сообщение · #2


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




Ранг: 16.8 (новичок)
Активность: 0.030
Статус: Участник

Создано: 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
@@:
....



Ранг: 52.2 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 09 октября 2006 03:35
· Личное сообщение · #4

TOR

push MB_OK
push DWORD str0
push DWORD str1
push 0
call [MessageBox]

А чё не так:

push 0
push str0
push str1
push 0
call MessageBox



Ранг: 16.8 (новичок)
Активность: 0.030
Статус: Участник

Создано: 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'

Можно и подругому,как кому нравиться извращаься с кодом.



Ранг: 4.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 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 ;а это код
............
в том виде в каком она есть а как я буду отлаживать тогда АААА?



Ранг: 16.8 (новичок)
Активность: 0.030
Статус: Участник

Создано: 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
метка:
код...
Уверяю,ИДА тебе это нормально покажет.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 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 не знаю, но нормальные ассемблеры собирают(собирали) код в одну секцию, а данные в другую. Именно поэтому их ассемблерами(сборщиками) и назвали. А вот проклятая фирма ИБМ писала свои макросы именно с джампом



Ранг: 16.8 (новичок)
Активность: 0.030
Статус: Участник

Создано: 12 октября 2006 05:56
· Личное сообщение · #9

tundra37 пишет:
section '.idata' data readable writeable

str0 db "превед",0

Только не так!Это хоть и правильно, но не грамотно! Лучше :

section '.data' data readable writeable
str0 db "превед",0 [/i]

название секции '.idata', подразумевает обьявление импорта.



Ранг: 16.8 (новичок)
Активность: 0.030
Статус: Участник

Создано: 12 октября 2006 06:40 · Поправил: TOR
· Личное сообщение · #10

У Зомбы была реализация макроса на ассемблере, позволяющая инициализировать данные прямо в коде.
lea edi, temparea
mov eax, "W\:C"
stosd
mov eax, "ODNI"
stosd
mov eax, "*\SW"
stosd
mov eax, "EXE."
stosd
xor eax, eax
stosd
; temparea=data
Может, тебе нужен такой метод инициализации данных?



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 12 октября 2006 21:00
· Личное сообщение · #11

1. См. inc файлы из комплекта фасма. invoke давно должен поддерживать рекурсию.
2. Если правильно понял, нужны макросы uglobals\iglobals из Fresh. Я тоже делал подобное, но тормоза при компиляции напрягали, COFF + линкер может оказаться лучше.



Ранг: 4.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 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
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати