| Посл.ответ |
Сообщение |
|
Создано: 21 августа 2009 19:14:41 Личное сообщение #1
Здравствуйте! Возникла проблема: Нужно переопределить макросом инструкцию mov. Для чего? Для удобства написания базонезависимого кода. По примеру будет понятно:
- macro mov arg1,arg2
- {
-
-
- if (arg1 eqtype [0]) | (arg2 eqtype [0]) | (arg2 eqtype '')
-
- mov arg1,arg2
-
- else if (arg1 eqtype eax) & (arg2 eqtype eax)
-
- mov arg1,arg2
-
- else if (arg1 eqtype eax)
-
- mov arg1,dword[ebx + arg2 - DELTA]
-
- else if (arg2 eqtype eax)
-
- mov dword[ebx + arg1 - DELTA],arg2
-
- end if
-
- }
Так вот ругается "Invalid Operand" при коде вида
Будьте добры, подскажите как поправить макрос.
|
|
|
Создано: 21 августа 2009 21:14:20 · Поправил: Coderess Личное сообщение #2
...
----- Gutta cavat lapidem
|
|
Создано: 21 августа 2009 21:26:33 Личное сообщение #3
Да вроде и в первом варианте нет ошибок. Только нужно
CoderessВы внутри макроса _mov используете его же, такой рекурсии Fasm не воспринимает.
|
|
Создано: 21 августа 2009 21:56:09 Личное сообщение #4
Ага, ошибся
----- Gutta cavat lapidem |
|
Создано: 21 августа 2009 22:14:50 Личное сообщение #5
um0v ведь если написать
то так и скомпилится. а мен надо что бы в результате было(например):
то есть с учетом дельты.. или может я прогнал, тогда простите, забыл уже что такое сон ..
|
|
Создано: 21 августа 2009 22:25:44 Личное сообщение #6
Sl4y[e]rА Вы приведите код целиком, с ошибкой. А то как я не стараюсь, оную получить не могу
|
|
Создано: 21 августа 2009 23:30:35 · Поправил: Sl4y[e]r Личное сообщение #7
Значт. Для теста пишу: Проблема вот в чем, пишу:
- mov eax,eax
- mov eax,1
- mov eax,szTest
- mov szTest,eax
- mov eax,dwTest
- mov dwTest,eax
- mov dwTest,1
- mov eax,[dwTest]
- mov [dwTest],eax
Получаю:
- MOV EAX, EAX
- MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]
- MOV EAX, DWORD PTR DS:[EBX-12]
- MOV DWORD PTR DS:[EBX-12], EAX
- MOV EAX, DWORD PTR DS:[EBX-9]
- MOV DWORD PTR DS:[EBX-9], EAX
- MOV EAX, DWORD PTR DS:[401009]
- MOV DWORD PTR DS:[401009], EAX
Вообще, возможно ли сделать полную замену макросом, что бы только где надо был учет дельты?
|
|
Создано: 22 августа 2009 13:17:15 · Поправил: Sl4y[e]r Личное сообщение #8
В общем, утро вечера мудренее:
- macro mov arg1,arg2
- {
- if (arg1 eqtype DELTA) & ((arg2 eqtype eax) | (arg2 eqtype 0))
-
- mov dword[ebx + arg1 - DELTA],arg2
-
- else if (arg2 eqtype DELTA) & ((arg1 eqtype eax) | (arg1 eqtype 0))
-
- mov arg1, dword[ebx + arg2 - DELTA]
-
- else
-
- mov arg1, arg2
-
- end if
-
-
-
- }
Не работает только такая: mov eax,1 конструкция. Хотя, вроде же явно указал.. не знаю даже. Ассемблируется MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF] Как бы поправить, подскажите пожалуйста.
|
|
Создано: 22 августа 2009 14:45:20 Личное сообщение #9
Почему не работает? Выполняется второе условие
- mov arg1, dword[ebx + arg2 - DELTA]
DELTA=0x401012, -DELTA=inc(not(DELTA))==0xFFBFEFEE, 0xFFBFEFEE +1==0xFFBFEFEF
- MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]
|
|
Создано: 22 августа 2009 15:27:10 Личное сообщение #10
так вот и я не пойму почему оно выполняется.. ведь второй аргумент не метка. мне нужно что бы и получалось в итоге mov eax,1.
|
|
Создано: 22 августа 2009 16:02:36 Личное сообщение #11
А если так:
- else if (arg2 eqtype ptr DELTA) & ((arg1 eqtype eax) | (arg1 eqtype 0))
|
|
Создано: 22 августа 2009 16:30:13 Личное сообщение #12
тогда код вида
компилится без учета дельты. блин. совсем запутался, вродеж легче легкого а туплю..
|