linux/arch/i386/boot/compressed/head.S를 보니까 궁금한 것이 한 두 가지가 아니네요...
처음에,
movl %eax, %ds
라는 부분에서, 4바이값을 2바이트에 억지로 집어 넣을수가 있나요?
je 1b
라는 부분에서도, 1b라는 레이블은 없고...
movl $(__KERNEL_DS), %eax
에서는, 어떤 때는 $xxx, 어떤 때는 $(xxx)를 쓰는지 궁금합니다.
이건 저도 잘 모르겠네요.
이건 익명 레이블을 쓰는 겁니다. 예를 들어서
0: orl %eax, %ebx je 0f jmp 0b 0:
이런식으로 앞뒤에 숫자로 된 동일한 레이블이 익명 레이블입니다. 즉, 실제로 이름이 임의로 붙는 방향성만을 가진 레이블입니다. 0f 에서 f의 의미는 앞의 해당숫자를 가진 익명레이블을 의미하고 0b에서 b의 의미는 뒤의 해당숫자를 가진 익명레이블을 의미합니다.
여기서 괄호가 의미하는 것은 주소값 자체인가 아니면 그 주소가 가르키는 곳의 값 자체인가를 구분하는 겁니다.
만약 __KERNEL_DS = 0x1000 이고 0x1000번지에 값이 0x12345678 이라고 한다면 다음과 같이 eax는 값을 갖게 됩니다.
movl $__KERNEL_DS, %eax 이경우 eax에는 0x1000 의 값을 갖습니다.
movl $(__KERNEL_DS), %eax 이경우 참조하는 곳이 0x12345678이므로 eax는 0x12345678 이 되겠네요.
많은 도움이 되었습니다^^
최후의 최후까지 바짝 잡고 있어라!
->
세그먼트레지스터에는 32bit 값을 집어넣는것도 가능합니다. 대신 상위 16bit는 무시됩니다.
실제 보호모드 진입한 후 32bit offset 모드로 들어갈 경우 far call이나 int 등과 같이 세그먼트 레지스터를 push해야 하는 상황에서는 32bit로 push됩니다. 또 그냥 push명령 써도 32bit이고요. 이때 하위 16비트는 세그먼트 레지스터 값이지만 상위 16bit는 0이 됩니다.
Written By the Black Knight of Destruction
텍스트 포맷에 대한 자세한 정보
<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]
[code:1]movl %eax, %ds[/code:1]이
이건 저도 잘 모르겠네요.
이건 익명 레이블을 쓰는 겁니다.
예를 들어서
0:
orl %eax, %ebx
je 0f
jmp 0b
0:
이런식으로 앞뒤에 숫자로 된 동일한 레이블이 익명 레이블입니다.
즉, 실제로 이름이 임의로 붙는 방향성만을 가진 레이블입니다.
0f 에서 f의 의미는 앞의 해당숫자를 가진 익명레이블을 의미하고
0b에서 b의 의미는 뒤의 해당숫자를 가진 익명레이블을 의미합니다.
여기서 괄호가 의미하는 것은 주소값 자체인가 아니면 그 주소가 가르키는 곳의 값 자체인가를 구분하는 겁니다.
만약 __KERNEL_DS = 0x1000 이고 0x1000번지에 값이 0x12345678
이라고 한다면 다음과 같이 eax는 값을 갖게 됩니다.
movl $__KERNEL_DS, %eax
이경우 eax에는 0x1000 의 값을 갖습니다.
movl $(__KERNEL_DS), %eax
이경우 참조하는 곳이 0x12345678이므로 eax는 0x12345678 이 되겠네요.
Minz님, 감사합니다.
많은 도움이 되었습니다^^
최후의 최후까지 바짝 잡고 있어라!
하나 추가
->
세그먼트레지스터에는 32bit 값을 집어넣는것도 가능합니다.
대신 상위 16bit는 무시됩니다.
실제 보호모드 진입한 후 32bit offset 모드로 들어갈 경우
far call이나 int 등과 같이 세그먼트 레지스터를 push해야 하는
상황에서는 32bit로 push됩니다. 또 그냥 push명령 써도 32bit이고요.
이때 하위 16비트는 세그먼트 레지스터 값이지만 상위 16bit는 0이 됩니다.
Written By the Black Knight of Destruction
댓글 달기