[Os] Debug a.exe 상에서CS레지스터값은 어떻게 설정이 되나요?
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라고 볼수 있는것인가요?
답변부탁드립니다.
INT 21H 는 도스 시스템 콜로 소프트웨어 인터럽트를 사용합니다. 도
INT 21H 는 도스 시스템 콜로 소프트웨어 인터럽트를 사용합니다. 도스 모드에서 인터럽트가 뜨면 0000:0000 에 있는 인터럽트 벡터 테이블에서 해당 인터럽트 서비스 루틴의 주소를 페치해서 그 주소를 call 합니다. CS 가 바뀐것은 이것 때문이고, 어셈블리나 C 사용의 여부에 상관없습니다.
CS 는 코드 세그먼트인데, 도스 모드에서는 CS * 0x10 + IP 가 물리 번지입니다.
일례로 CS=1816 IP=005F 일때 물리번지는 0x18160 +0x5f = 0x181bf 이 됩니다.
댓글 달기