2016-08-26 2 views
-2

(1) 다음 코드는 무엇을 의미합니까? 나는 어디에서나 ds : [] 문법에 대한 어떤 언급도 찾을 수 없다. 그것은 ds가없는 것과 어떻게 다릅니 까? 다음 명령에서Windows x86 어셈블리 언어 구문

cmp eax,dword ptr ds:[12B656Ch] 

(2)

movsx eax,word ptr [esi+24h] 

ESI를 레지스터 대상은 무엇입니까? 그런 희귀 한 레지스터를 사용하여 원래의 C 코드가 무엇을하고 있는지 추측 할 수 있습니까?

+1

* ds가없는 경우와 다른 점은 무엇입니까? *. 그것은 아닙니다, 당신의 디스어셈블러는 단지 장황 해지고 있습니다. –

+0

* 사용 된 esi 레지스터는 무엇입니까? * 주소 지정 모드의 기본 주소. 하나의 명령 만이 아니라 전체 기능을 살펴 본다면 원래 C가 무엇을하고 있는지 알 수 있습니다. –

+0

'ds' - 데이터 세그먼트. 그것은 단지 포인터 일뿐입니다. –

답변

2

DS은 데이터 세그먼트를 나타냅니다.
Win32에서 CS = DS = ES = SS = 0
이 세그먼트는 중요하지 않으며 플랫 32 비트 주소 공간이 사용됩니다.

데이터 세그먼트는 메모리에 액세스 할 때의 기본 세그먼트입니다. 일부 디스어셈블러는 기본 세그먼트를 나열하는 목적이 없더라도 실수로 나열합니다.
세그먼트 재정의를 사용하여 원하는 경우 다른 세그먼트를 나열 할 수 있습니다.
CS은 점프 및 호출의 기본 세그먼트 인 코드 세그먼트이며 SS은 ESP 기반 주소의 기본값 인 스택 세그먼트입니다.
ES은 문자열 지침에 사용되는 추가 세그먼트입니다.

Win32에서 의미가있는 유일한 세그먼트 재정의는 FS입니다 (F은 무엇이든 나타내지는 않지만 E 이후 임).
FS은 스레드 특정 데이터를 저장하는 스레드 정보 블록 (TIB)에 연결되며 스레드 로컬 저장소 및 일반적으로 멀티 스레딩에 매우 유용합니다.
GS도 있으며 나중에 Win32에서 사용하기 위해 예약되어 있으며 Win64의 TIB에 사용됩니다.
Linux에서는 그림이 다소 차이가 없습니다.

당신은 레지스터는 특별한 목적을 가지고 있다는 생각을 놓아해야한다
에 대한 레지스터 X 무엇입니까.
x86에서는 거의 모든 목적으로 거의 모든 레지스터를 사용할 수 있습니다.
몇 가지 복잡한 명령어 만 특정 레지스터를 사용하지만 일반 명령어는 모든 레지스터를 사용할 수 있습니다.
컴파일러는 가능한 한 많은 레지스터를 사용하여 메모리 사용을 피합니다.

EAX : accumulator, some instructions using this register have 'short versions'. 
EDX : overflow for EAX, used to store 64 bit values when multiplying or dividing. 
ECX : counter, used in string instructions like rep mov and shifts. 
EBX : miscellaneous general purpose register. 
ESI : Source Index register, used as source pointer for string instructions 
EDI : Destination Index register, used as destination pointer 
ESP : Stack pointer, used to keep track of the stack 
EBP : Base pointer, used in stack frames 

당신은 ESP을 제외하고, 제발 당신과 같이 거의 모든 레지스터를 사용할 수 있습니다

다음과 같이 8 개의 x86 레지스터의 원래 목적은 말했다 가졌어요. ESP가 많은 지침에서 작동하지만 스택을 추적하는 것은 너무 어색합니다.

희귀 한 레지스터를 사용하여 원본 C 코드가 무엇을하고 있는지 추측 할 수 있습니까?

내 생각 엔 : 일부 구조 또는 객체에 대한

struct x { 
    int a,b,c,d,e,f,g,h,i,j; //36 bytes 
    short s }; 
.... 
int i = x.s; 

ESI 가능성이 포인트. 오프셋 24h (36)에서는 int로 변환되는 단락이 있습니다. (따라서 서명 확장이있는 mov).
ESI은 로컬 변수를 연결하지 않습니다.이 경우 EBP 또는 ESP이 사용되기 때문입니다.
c 코드에 대해 더 자세히 알고 싶으면 더 많은 컨텍스트가 필요합니다.
많은 c 구문은 여러 cpu 명령으로 변환됩니다.

가장 좋은 방법은 c 코드를 작성하고 생성 된 cpu 코드를 검사하는 것입니다.

+0

이 질문은 http://stackoverflow.com/questions/38843403/which-segment-register-is-used-by-default의 사본으로 마감되었을 것입니다.나는 다시 열지 않고 닫을 수없는 오래된 dup-target으로 닫아 두었어야했습니다. –