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 코드를 검사하는 것입니다.
* ds가없는 경우와 다른 점은 무엇입니까? *. 그것은 아닙니다, 당신의 디스어셈블러는 단지 장황 해지고 있습니다. –
* 사용 된 esi 레지스터는 무엇입니까? * 주소 지정 모드의 기본 주소. 하나의 명령 만이 아니라 전체 기능을 살펴 본다면 원래 C가 무엇을하고 있는지 알 수 있습니다. –
'ds' - 데이터 세그먼트. 그것은 단지 포인터 일뿐입니다. –