2013-10-16 2 views
0

64 비트 플랫폼에서 지원되지 않는 일부 어셈블리 코드가 포함 된 C++ 프로젝트의 32-64 비트 마이그레이션을 진행하고 있습니다. 마이그레이션해야하는 프로젝트에 대한 기본 정보를 제공하고자합니다. 내가 교체해야 그러니까 기본적으로인라인 어셈블리 코드를 C++로 대체하십시오.

int* a = Begin_args; 
int* b = End_args; (where Begin_args and End_args are int*) 
while (b > a) 
{ 
    int test = *(--b); 
    __asm push test 
} 
  • : 프로젝트의

    • 출력 어셈블리 코드를 포함하는 컨텍스트 또 다른 C++ 프로젝트 여기

    • 에서 사용하는 lib 디렉토리 파일입니다 성명서 __asm push test

    내가 직면하고 피소은 다음과 같습니다

    • 내가 프로젝트를 디버깅 할 수없는 나는 같은 푸시 문

    • 의 팝업 문을 찾을 수 없습니다 나는 프로젝트의 출력이 lib 디렉토리 파일이로 .

    • 스택, 배열, 대기열을 사용해 보았지만 제대로 작동하지 않았습니다. 컴파일 오류가 발생하지 않지만 응용 프로그램을 시작할 때 충돌이 발생합니다.

    그래서 제 질문은 :

    • 내가 누구의 출력 lib 디렉토리 파일에있는 모든 C++ 프로젝트를 디버깅 할 수 있나요?

    • 나는 누군가가 va_list을 시도하라고, 또 다른 포럼에이 질문을하지만 난 va_list__asm push test 대신 작동 방법을 이해 할 수없는 무엇입니까?

    • 마지막으로이 Asm 코드를 C++로 바꾸는 방법 /이 Asm 코드를 바꾸려면 어떻게해야합니까?

    오랫동안이 문제에 빠져 있으면 도움이 될 것입니다.

  • +0

    응용 프로그램과 라이브러리의 디버그 빌드를 수행하고 응용 프로그램에 대한 라이브러리의 디버그 빌드를 사용하는 경우 라이브러리를 디버깅 할 수 있어야합니다. –

    +0

    'va_list'는 아마 여기에 맞는 답 일 것입니다. 그것을 사용하는 방법의 예를 살펴 보셨습니까? –

    +0

    예 보였지 만 여기에서 사용하는 방법을 이해할 수는 없습니다. 내 코드에서 어떻게 사용할 수 있습니까? 감사합니다 – vsoni

    답변

    0

    이 아닐 수 있습니다.은 호출 규칙에 따라 달라 지므로 pop 문과 동일해야합니다. 예를 들어

    는 x86 호출 규약 중 하나가, sp 함수 동안 움직 bp은 상위 스택 프레임에서 (이전 sp 인 스택 포인터이다. A의 에필로그 코드 수단

    기능은 할 수있는 일이 같은 :

    mov sp, bp ; just set sp to previous sp 
    pop bp  ; pop previous sp 
    ret   ; and return 
    

    당신이 함수 내에서 sp와 무슨 짓을했는지 작은 문제.예를 들어

    func:    ; here, the stack has return address 
         push bp  ; push current bp 
         mov bp, sp ; put sp into bp 
    
         sub sp, 50 ; do whatever you want with sp here 
    
         mov sp, bp ; just set sp to previous sp 
         pop bp  ; pop previous sp 
         ret   ; and return 
    

    상기 해당 코드의 명령들은 sub 함수의 로컬 변수에 대한 공간을 할당을 위해 사용된다. 함수의 매개 변수는 호출 전에 푸시되었으므로 [bp+N]으로 액세스 할 수 있으며 로컬 변수는 [bp-N]으로 액세스 할 수 있습니다.

    관련 문제