2012-07-02 2 views
1

방법 C++에서 시각적 내가 인라인 어셈블리를 사용해야하는 경우에 대한 레이블을 설정할 수 있습니다, 그래서 예를 들어 이런 식으로 뭔가 같을 것이다 ... VAR가 값 또는 주소로 링크를 varables인라인 어셈블리에서 레이블을 설정하는 방법은 무엇입니까?

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

?

나는이

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: 물건을 잊어. 이제 플랫 랜드에 있습니다. 문앞에서 세그먼트 레지스터를 확인하십시오.

관련 문제