2013-04-30 5 views
0

gdb에서 main을 디스 어셈블하려면 즉, gdb에서 main을 역 어셈블하여 다음 줄의 주소를 확인한 다음 원하는 줄로 건너 뛰었습니다. 우리가 main을 디스어셈트 (disassemble)하여 w/o가없는 다음 줄의 주소를 결정할 수있는 방법이 있는가? 즉 c. 또한 다른 방법이 있으면 언급하십시오.코드 줄을 건너 뛰는 코드

#include<stdio.h> 

fun() 
{ 
    int i,*j; 

    j=&i; 

    j++; 
    j++; 
    j++; 

    *j=*j+13; //to skip first printf +13 


    *j=*j+21; //to skip first and second printf +21 ie. 21 + 13 

    //*j=*j+13; //to skip first,second,third printf +13 ie. 21 + 13 + 13 
} 

main() 
{ 
    int a; 
    a=5; 

    fun(); 
    printf("hello1"); 
    printf("%d\n",a); 
    printf("hello2"); 

} 
+0

C 표준을 능가하는 방향으로 나아가고 있으며이 작업을 수행하는 데 이식성이 전혀 없습니다. 'fun'가 true 또는 false 값을 반환하도록하고,'printf'를 건너 뛰고 싶다면 왜 그렇게할까요? –

답변

0

짧은 대답은 아니오입니다. 다음 행의 주소를 판별하는 f}은 없습니다.

goto 문을 사용할 수 있으며 그 중 하나는 here입니다.

그러나 이것은 지저분하고 읽을 수없는 코드로 이어지기 때문에 여전히 권장하지 않습니다.

당신이하고있는 일은 다음 줄로 건너 뛰지 않고 사실 강제로 스택을 지워서 다음 함수 호출 (스택으로 푸시) 만 건너 뜁니다. 코드는 다음 "함수"를 건너 뛰고 다음 "선"은 건너 뛰지 않습니다. 나는이 동작을 디버거의 "스텝 오버"기능과 동일시한다. 함수에 대한 매개 변수를 저장하는 스택을 수정하지만 함수 "코드"를 반드시 저장할 필요는 없습니다.

스택 프레임을 직접 수정한다는 사실은 코드 머신/컴파일러에 달려 있습니다.

@dodgethesteamroller가 말했듯이, 원하는대로 실행을 완벽하게 제어 할 수있는 유일한 방법은 어셈블리를 사용하는 것뿐입니다. 인라인 어셈블리 코드로 재생하려는 경우 C에서 사용할 수있는 asm() 명령을 찾을 수 있습니다. here에 대한 자세한 내용을 볼 수 있으며이 또한 코드 머신에 종속적입니다.

코드 메모리가 데이터 메모리와 분리되어있을 수 있기 때문에 수행하려는 작업을 수행 할 수 없습니다.

1

는 OS에 기계 또는 OS로 시스템에서이 이식 할 수 없습니다뿐만 아니라, 심지어 다음에 프로그램의 하나 개의 실행에서 바로 작동한다고 보장 할 수 없습니다입니다. 일반적으로 링커가 코드를 RAM의 같은 위치에 넣을 수는 없습니다. 이제까지. 아주 작은 임베디드 시스템과 같이 매우 제한적이고 결정 론적 인 환경을 사용하지 않는 한. 그때조차도 연습을 추천하지는 않을 것입니다 - 당신이 총체적인 컨트롤을 원한다면 베어 메탈에 어셈블리 언어와 프로그램을 사용하십시오.

관련 문제