2012-07-02 2 views
1

как в C++ визуальных могу я установить метки для того, когда я должен использовать встроенный ассемблер, так что это будет выглядеть как-то вроде этого, например ...Как установить метки в встроенной сборке?

__asm 
{ 
    PUSH EAX 
    PUSH VAR1 
    MOV ECX,DWORD PTR DS:[VAR2] 
    CALL DWORD PTR DS:[VAR3] 
    JMP VAR4 
} 

где VAR varables ссылки на значение или адрес?

я попытался следующие

DWORD VAR2 = 0x991770; //0x991770 is the location of the function 

__asm 
{ 
    ..code 
    MOV ECX,DWORD PTR DS:[VAR2] 
    ..code 
} 

, но затем падает приложение, как это делается?

+0

Если вы жестко закодируете адрес, и он может меняться от запуска к запуску (загрузчиком PE), то в вашей программе нет ничего странного. Как насчет 'DWORD VAR2 = (DWORD) & SomeFunction'? –

ответ

1

Используйте offset variableName для доступа к переменным из встроенной сборки. См. Ссылку here.

Пример:

char format[] = "%s %s\n"; 
char hello[] = "Hello"; 
char world[] = "world"; 
int main(void) 
{ 
    __asm 
    { 
     mov eax, offset world 
     push eax 
     mov eax, offset hello 
     push eax 
     mov eax, offset format 
     push eax 
     call printf 
     //clean up the stack so that main can exit cleanly 
     //use the unused register ebx to do the cleanup 
     pop ebx 
     pop ebx 
     pop ebx 
    } 
} 
0

C имена переменных видны в инлайн сборки. Поэтому, если вам нужен доступ к данным, просто напишите имя var:

int var2 = 3; 
__asm 
{ 
    mov ecx, var2 

Это будет скомпилировано в соответствующую инструкцию доступа к памяти.

Для кодовых меток - вы просто объявить их, как и в реальной сборке:

Label1: 
    mov ecx, 0 
    jmp Label1  

Внешние функции рассматриваются в качестве меток, тоже. Однако применяется изменение имени.

Если вам нужно числовое значение текущего IP в регистр общего назначения, нет прямой команды, но очень простой обходной путь доступен:

call Next 
Next: 
    pop eax ; eax now is the value of IP at the current point 

О, и забыть о ds: вещи. Теперь вы находитесь в Фландрии - проверьте свои регистры сегментов у двери.

Смежные вопросы