x86 어셈블리에서 세그먼트와 오프셋

declspec의 이미지

MOV EAX, 5E1050 ; 가상주소 0x005E1050 를 EAX로.
XOR BYTE PTR DS:[EAX], 01

olly 디버거로 프로그램을 분석하던중 위와같은 어셈블리 코드를 보았습니다.
저기에서

DS:

는 왜 있어야 하고 무슨 역할을 하나요?
EAX 에 온전한 32비트 가상주소가 있으니까 그걸 참조하면 될것일터...

책에서는 세그먼트 : 오프셋 주소 지정방식은
옜날 시스템에서 사용했다고하는데
요즘의 일반적인 32비트 ELF, PE 들을 디스어셈블 해보면
여전히 저런식으로 DS:레지스터, CS:레지스터
이런 표현이 많이 있는걸 볼 수 있는데요...
인텔 x86 메뉴얼을 봐도 잘 모르겠고
위키피디아 설명을 봐도 왜 있어야하고 무슨 역할을 하는건지...
32비트 flat addressing 모델을 쓰는데...
"세그먼트를 참조하기 위한것이다" 라는 설명으로는 이해가 안가네요
조언부탁드립니다

익명 사용자의 이미지

고수분들이 계시겠지만, 제가 아는 한도내에서 말씀드리면,

일반적으로 모든 프로그램은 메모리에 올라갈때 다음과 같이 구분되서 올라갑니다.

Code Segmentation(파일포멧상으로는 Code Section, .text) : Code를 담고 있는 영역(예, C언어의 메인함수), 일반적으로 CS Register가 이영역의 정보를 담고 있습니다.
Data Segmentation(파일포멧상으로는 Data Section, .data일겁니다.) : 프로그램 실행에 필요한 데이터를 담고 있는 영역(예, C언어에서의 문자열), 일반적으로 DS Register가 이영역의 정보를 담고 있습니다.
Stack Segmentation(파일포멧상으로는 Stack Section, .bss일겝니다.) : 프로그램 실행시 임시변수등의 생성과 관련된 영역(예, C언어에서 함수 내부의 변수 사용시 Stack 공간에 변수의 공간이 잡힙니다.), 일반적으로 SS Register가 이 영역의 정보를 담고 있습니다.
기타 : ES로 표현합니다만 일단 여기서는 중요하지 않으니 무시...

입니다. DS Register에 대해서는 위에서 간단하게 설명드렸으니, 왜 이것을 사용해야 하느냐는 다음과 같습니다. 이것의 장점은 여러가지지만, 지금 생각나는 거 한가지는 동일한 프로그램을 여러개 실행시킬때, 매번 프로그램 전체를 메모리에 올릴필요없이(올린다면 매모리 낭비겠죠?), 이렇게 Section이 나누어져있다면, (이미 이전에 동일한 프로그램이 메모리에 올라가 있다면,) Code와 Data는 그대로 둔체 새로 실행하는 프로그램의 Stack 영역만 별도로 잡으면 되겠죠? 이럴때 쓸수있습니다.

그럼 다음질문이 왜 Code와 Data가 하나의 Section에 있지 않고 따로 분리되어 있느냐인데, 컴파일러 입장에서 보면 이렇게 나누는게 이득이 됩니다. 왜 그러냐면, Code와 Data를 한데 두면, 가뜩이나 각각의 함수와 데이터의 메모리 계산하기 귀찮은데 하나로 둬서 더 복잡하게 둘 필요가 없다는 것입니다.(는 제 추측입니다--;;) 실제로 Code와 Data를 하나로 둬도 상관은 없을 겝니다.(이러한 Section의 구분은 다분히 임의적이라고 볼수있습니다.(라고 생각합니다.))

이 설명은 정말 Rough하게 드린 것입니다. 좀더 내용을 아실려면 OS쪽 내용을 약간 보셔야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.