[Os] Debug a.exe 상에서CS레지스터값은 어떻게 설정이 되나요?

gyxor의 이미지

D:\Cpp_test>debug a.exe
-r
AX=0000  BX=0008  CX=A60B  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1805  ES=1805  SS=1815  CS=1815  IP=0054   NV UP EI PL NZ NA PO NC
1815:0054 0E            PUSH    CS
-q

D:\Cpp_test>debug test.exe
-r
AX=0000  BX=0009  CX=D19E  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1806  ES=1806  SS=1816  CS=1816  IP=0054   NV UP EI PL NZ NA PO NC
1816:0054 0E            PUSH    CS
-

이렇게 서로 다른 두개의 프로그램을 디버그 해봤습니다.
exe실행프로그램이 로딩될때 소스상에서 IP 레지스터의 초기값은
org 지시자에 의해서(어셈블이어의 경우엔) 셋팅을 바꿀수 있는것으로
알고있습니다.

첫째,
그렇다면 CS레지스터의 값..
곧, 프로그램이 로딩되는 위치은 Os가 관리해 주는것인가요?

둘째,
위 내용에서 보면 CS값은 실행파일마다 조금씩 달랐는데요..그런데,
하나의 실행파일을 다른 프로그램을 실행시킨뒤에 반복해서 다시 실행을 해봐도 그 위치가 바뀌지는 않았습니다. 그렇지만..
특정 프로그램이 메모리의 특정 위치를 독점하는것이 아니므로
원래는 CS 의 위치값은 메모리 상태에 따라서
바뀌어야 하는것이 아닌가요?

셋째, 단순히 어셈블리어로 짜여진 프로그램을 debug했을때는 cs 값이
trace하면서 바뀌지가 않았습니다.
그런데 c++ 로 짜여진 프로그램의 경우에는 debug초기에는
어셈블리어로 짜여진 프로그램과 거의 동일한 위치에 cs레지스터가
설정이 되었지만 위에서도 보이듯이 push cs 로 일단 cs레지스터값을 저장하고
계속 trace해보니 그값이 매우 다른 위치로 바뀌는것을 볼 수 있었습니다.

D:\Cpp_test>debug test.exe
-t

AX=0000  BX=0009  CX=D19E  DX=0000  SP=075E  BP=0000  SI=0000  DI=0000
DS=1806  ES=1806  SS=1816  CS=1816  IP=0055   NV UP EI PL NZ NA PO NC
1816:0055 1F            POP     DS
-t

AX=0000  BX=0009  CX=D19E  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1816  ES=1806  SS=1816  CS=1816  IP=0056   NV UP EI PL NZ NA PO NC
1816:0056 8C1E2400      MOV     [0024],DS                          DS:0024=0000
-t

AX=0000  BX=0009  CX=D19E  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1816  ES=1806  SS=1816  CS=1816  IP=005A   NV UP EI PL NZ NA PO NC
1816:005A 8C066007      MOV     [0760],ES                          DS:0760=1806
-t

AX=0000  BX=0009  CX=D19E  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1816  ES=1806  SS=1816  CS=1816  IP=005E   NV UP EI PL NZ NA PO NC
1816:005E FC            CLD
-t

AX=0000  BX=0009  CX=D19E  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1816  ES=1806  SS=1816  CS=1816  IP=005F   NV UP EI PL NZ NA PO NC
1816:005F B430          MOV     AH,30
-t

AX=3000  BX=0009  CX=D19E  DX=0000  SP=0760  BP=0000  SI=0000  DI=0000
DS=1816  ES=1806  SS=1816  CS=1816  IP=0061   NV UP EI PL NZ NA PO NC
1816:0061 CD21          INT     21
-t

AX=3000  BX=0009  CX=D19E  DX=0000  SP=075A  BP=0000  SI=0000  DI=0000
DS=1816  ES=1806  SS=1816  CS=0B9F  IP=0487   NV UP DI PL NZ NA PO NC
0B9F:0487 EAA0046503    JMP     0365:04A0
-

이러한 점으로 미루어봤을때
어셈블리어로 짜여진 프로그램은 loding time에 physical address로 binding 된다고 봐야하고
c++로 짜여진 프로그램은 execute time 에 physical address로
binding 된다고 봐야하는것인가요?

넷째,
원론적인 이야기지만..
IP 가 logical Address이고
CS 가 relocatable Address이고
CS : IP 가 physical address라고 볼수 있는것인가요?

답변부탁드립니다.

hb_kim의 이미지

INT 21H 는 도스 시스템 콜로 소프트웨어 인터럽트를 사용합니다. 도스 모드에서 인터럽트가 뜨면 0000:0000 에 있는 인터럽트 벡터 테이블에서 해당 인터럽트 서비스 루틴의 주소를 페치해서 그 주소를 call 합니다. CS 가 바뀐것은 이것 때문이고, 어셈블리나 C 사용의 여부에 상관없습니다.

CS 는 코드 세그먼트인데, 도스 모드에서는 CS * 0x10 + IP 가 물리 번지입니다.

일례로 CS=1816 IP=005F 일때 물리번지는 0x18160 +0x5f = 0x181bf 이 됩니다.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.