2016-09-06 2 views
3

는 이해가 안 : 내가 단계별로 코드 단계를 디버깅 할 경우조립 - 왜이 CALL 기능이 작동하지 않습니까? 이 코드에서 CALL 기능이 작동하지 않는 이유

#include<stdio.h> 

void main() { 

    __asm { 

     jmp L1 

     L2: 
     mov eax, 8 
     ret 

     L1: 
     call L2 
    } 
} 

는 라인을 'L1 전화'처리되지 않으며, 프로그램은 직접 건너 뜁니다 종료. 뭐가 잘못 되었 니? VisualStudio2015에서 Intel 32 비트 레지스터로 작업하고 있습니다.

+2

디버거는 종종 인라인 어셈블리를 완전히 이해하지 못합니다. 코드가 제대로 실행되고 있지만 디버거가 올바르게 추적하지 못하고 있습니까? 'jmp L1 '이전에 EAX를 8 이외의 값으로 설정 한 다음'L2 호출 다음에 값을 검사하면 알 수 있습니다. 디버거가 아닌 코드에서이 작업을 수행하십시오. – zwol

+1

또한 이와 같은 코드를 작성하려면 C 함수에 삽입 된 "인라인 어셈블리"가 아닌 독립형 .asm 파일을 사용하는 것이 좋습니다. 컴파일러가 파울 가능성이 훨씬 적습니다. (특히 컴파일러는 'call'을 사용하거나 어셈블리 포인터 내에서 스택 포인터를 이동하는 경우 매우 혼란스러워합니다.) – zwol

+2

또한 컴파일러에서 생성 된 최종 바이너리의 디스 어셈블리를 살펴보십시오. 분기가 기대 한 곳으로 가거나 컴파일러가 잘못 컴파일 했습니까? –

답변

4

사용하면 당신은 step overF10 and step intoF11.

사이의 차이를 발견했습니다
문제는 (기본값) step overcall는 무시 나타납니다.
step into 코드가 필요하고 디버거가 예상대로 동작합니다. 이 step over 작동

단계
이상의 방법은 디버거가 정지 해, 다음 명령에 중단 점을 설정하고 다시 다음 명령에 중단 점을 이동한다는 것입니다.
Step over은 약 (조건부) 점프 및 계정을 알고 있지만 호출 문을 무시 (단계별)합니다. call을 다른 서브 루틴으로 점프하는 것으로 해석하고 현재 컨텍스트 내에서 머물고 싶다고 가정합니다.
이러한 자동 중단 점은 취소 할 때까지 유지되는 수동 중단 점과 달리 일시적입니다.

단계
Step into 동일한 않고 또한 모든 착신에 중단 점을 설정한다; 실제로 모든 서브 루틴을 가로 지르는 숲 속으로 당신을 안내합니다.

밖으로 단계
당신이 Shift 키를 사용하여 서브 루틴 Visual Studio allows you to step out '에'너무 깊이 밟아야 경우F11; 발신 통화 후 다음 명령으로 다시 돌아갑니다.
일부 다른 디버거는이 기능의 이름을 "return until return"으로 지정합니다.

디버거는 소스 코드 라인마다 목표 어드레스의리스트를 유지한다 (예를 들어 C) 높은 언어의 소스 코드를 처리하는 경우에는 높은 수준의 코드를 디버깅
. 그것은 소스 코드의 라인 당 중단 점을 계획 할 것입니다.
하이 레벨 코드의 모든 라인이 0 개 이상의 라인으로 변환된다는 것 외에도, 원시 어셈블리 코드를 단계별로 실행하는 것과 동일하게 작동합니다.

+0

아마 둘 사이의 차이점을 설명 할 수 있습니다. step-over가 현재 명령 다음에 중단 점을 넣으려고 시도 할 때 (명령 = 고급 언어의 명령 행). Step-into는 현재 라인을 먼저 분석하고, 어떤 호출이 관련되어 있다면, 브레이크 포인트를 그 안에 넣을 것입니다 (상위 레벨 호출 또는 ASM에서 직접'call'이 고려됩니다). 디버거는 종종 현재 단계 ("ASM에서"RET ")를 벗어날 때까지 현재 코드를 계속 실행하는"스텝 아웃 "기능을 사용합니다. 실수로"스텝 - 인 "으로 너무 깊숙이 들어가면 편리 할 수 ​​있습니다. – Ped7g

+0

어셈블리 언어의 경우 위 단계 중 하나 대신 "단계 단일 명령"을 원할 수 있습니다. 문서에서 Visual Studio로이 작업을 수행 할 수 있는지는 알 수 없지만 [WinDbg에서 가능할 것으로 보입니다] (https://msdn.microsoft.com/en-us/library/windows/hardware/ff540661%) 28v = vs.85 % 29.aspx). – zwol

관련 문제