CRACKL@B Оригинальный DVD-ROM крэкера: CRACKL@B DVD !
Домой | Статьи | RAR-cтатьи | Форум | Программирование | Скачать | DVD-ROM
Новичку | FAQ | Ссылки | Интервью | Архив | Новости | Связь


Русский / Russian English / Английский

Сейчас на форуме: vovanchik-77, SVLab (+5 невидимых пользователей)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 CRACKL@B —› Программирование —› Переопределение инструкции mov макросом.
Посл.ответ Сообщение
Sl4y[e]r

Ранг: 4.0 (гость)
Статус: Участник

Создано: 21 августа 2009 19:14:41
Личное сообщение #1

Здравствуйте! Возникла проблема:
Нужно переопределить макросом инструкцию mov. Для чего? Для удобства написания базонезависимого кода. По примеру будет понятно:
Code:
  1. macro mov arg1,arg2
  2. {
  3.    
  4.    
  5.    if (arg1 eqtype [0]) | (arg2 eqtype [0]) | (arg2 eqtype '')
  6.        
  7.         mov arg1,arg2
  8.    
  9.    else if (arg1 eqtype eax) & (arg2 eqtype eax)
  10.         
  11.         mov arg1,arg2
  12.         
  13.    else if (arg1 eqtype eax)
  14.        
  15.         mov arg1,dword[ebx + arg2 - DELTA]
  16.         
  17.    else if (arg2 eqtype eax)
  18.         
  19.         mov dword[ebx + arg1 - DELTA],arg2
  20.         
  21.    end if  
  22.    


Так вот ругается "Invalid Operand" при коде вида

Code:
  1. mov dwAnyDword,0xDEAD


Будьте добры, подскажите как поправить макрос.
Coderess

Ранг: 167.4 (ветеран)
Статус: Участник

Создано: 21 августа 2009 21:14:20 · Поправил: Coderess
Личное сообщение #2

...

-----
Gutta cavat lapidem
um0v

Ранг: 11.8 (новичок)
Статус: Участник

Создано: 21 августа 2009 21:26:33
Личное сообщение #3

Да вроде и в первом варианте нет ошибок. Только нужно
Code:
  1. mov [dwAnyDword],0xDEAD

Coderess
Вы внутри макроса _mov используете его же, такой рекурсии Fasm не воспринимает.
Coderess

Ранг: 167.4 (ветеран)
Статус: Участник

Создано: 21 августа 2009 21:56:09
Личное сообщение #4

Ага, ошибся

-----
Gutta cavat lapidem
Sl4y[e]r

Ранг: 4.0 (гость)
Статус: Участник

Создано: 21 августа 2009 22:14:50
Личное сообщение #5

um0v ведь если написать
Code:
  1. mov [dwAnyDword],0xDEAD

то так и скомпилится. а мен надо что бы в результате было(например):
Code:
  1. mov [ebx+0x10],1

то есть с учетом дельты..

или может я прогнал, тогда простите, забыл уже что такое сон ..
um0v

Ранг: 11.8 (новичок)
Статус: Участник

Создано: 21 августа 2009 22:25:44
Личное сообщение #6

Sl4y[e]r
А Вы приведите код целиком, с ошибкой. А то как я не стараюсь, оную получить не могу
Sl4y[e]r

Ранг: 4.0 (гость)
Статус: Участник

Создано: 21 августа 2009 23:30:35 · Поправил: Sl4y[e]r
Личное сообщение #7

Значт. Для теста пишу:

Проблема вот в чем, пишу:

Code:
  1. mov eax,eax
  2.     mov eax,1
  3.     mov eax,szTest
  4.     mov szTest,eax
  5.     mov eax,dwTest
  6.     mov dwTest,eax
  7.     mov dwTest,1
  8.     mov eax,[dwTest]
  9.     mov [dwTest],eax


Получаю:

Code:
  1. MOV EAX, EAX
  2.   MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]
  3.   MOV EAX, DWORD PTR DS:[EBX-12]
  4.   MOV DWORD PTR DS:[EBX-12], EAX
  5.   MOV EAX, DWORD PTR DS:[EBX-9]
  6.   MOV DWORD PTR DS:[EBX-9], EAX
  7.   MOV EAX, DWORD PTR DS:[401009]
  8.   MOV DWORD PTR DS:[401009], EAX

Вообще, возможно ли сделать полную замену макросом, что бы только где надо был учет дельты?
Sl4y[e]r

Ранг: 4.0 (гость)
Статус: Участник

Создано: 22 августа 2009 13:17:15 · Поправил: Sl4y[e]r
Личное сообщение #8

В общем, утро вечера мудренее:

Code:
  1. macro mov arg1,arg2
  2. {
  3.   if (arg1 eqtype DELTA) & ((arg2 eqtype eax) | (arg2 eqtype 0))
  4.   
  5.     mov dword[ebx + arg1 - DELTA],arg2
  6.     
  7.   else if (arg2 eqtype DELTA) & ((arg1 eqtype eax) | (arg1 eqtype 0))
  8.   
  9.     mov arg1, dword[ebx + arg2 - DELTA]
  10.   
  11.   else
  12.   
  13.     mov arg1, arg2
  14.     
  15.   end if
  16.    
  17.   
  18.    
  19. }


Не работает только такая:

mov eax,1

конструкция. Хотя, вроде же явно указал.. не знаю даже.

Ассемблируется

MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]

Как бы поправить, подскажите пожалуйста.
um0v

Ранг: 11.8 (новичок)
Статус: Участник

Создано: 22 августа 2009 14:45:20
Личное сообщение #9

Почему не работает? Выполняется второе условие
Code:
  1. mov arg1, dword[ebx + arg2 - DELTA]

DELTA=0x401012, -DELTA=inc(not(DELTA))==0xFFBFEFEE, 0xFFBFEFEE +1==0xFFBFEFEF
Code:
  1. MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]
Sl4y[e]r

Ранг: 4.0 (гость)
Статус: Участник

Создано: 22 августа 2009 15:27:10
Личное сообщение #10

так вот и я не пойму почему оно выполняется.. ведь второй аргумент не метка. мне нужно что бы и получалось в итоге mov eax,1.
um0v

Ранг: 11.8 (новичок)
Статус: Участник

Создано: 22 августа 2009 16:02:36
Личное сообщение #11

А если так:
Code:
  1. else if (arg2 eqtype ptr DELTA) & ((arg1 eqtype eax) | (arg1 eqtype 0))
Sl4y[e]r

Ранг: 4.0 (гость)
Статус: Участник

Создано: 22 августа 2009 16:30:13
Личное сообщение #12

тогда код вида
Code:
  1. mov eax,szTest

компилится без учета дельты. блин. совсем запутался, вродеж легче легкого а туплю..
 CRACKL@B —› Программирование —› Переопределение инструкции mov макросом.
    Для печати 


Оригинальный DVD-ROM крэкера: CRACKL@B DVD !


Вы находитесь на форуме сайта CRACKLAB.RU
Проект ReactOS