16bit, 32bit 어셈블러의 차이가...???

kkojiband의 이미지

부트 코드 만드는 중에 궁금한게 생겼습니다...^^;

일단 보호 모드로 들어가려면 gdt 만들어주고 gdtr과 CR0 셋하고 나서,

gdt의 어느 한 디스크립터로 far jump 해주면 그때야 진정으로(?) 32bit 보호 모드로 들어가는걸로 알고 있는데요...^^;

근데 책에 보니 32bit 보호 모드로 들어가기 위해서는 32bit 어셈을 사용해야 된다고 하더군요...

아직까지 보호 모드를 해본 일이 없어서 nasm 으로 무난히 사용해왔었는데,

간단히 보호 모드 진입만을 하는 코드를 만들어봤는데, 계속 리부팅이 되더라구요...

그래서 말인데요...^^;;;

16bit 와 32bit 어셈의 차이가 뭐죠??

제가 만든 부트 코드와 gas 로 만든 코드를 디셈블해서 보니까 딴건 잘 모르겠고,

jump, call 에서 인자가 2바이트, 4바이트 차이더군요...

그 외엔...모르겠더라구요...--;;

아시는 분들 좀 도와주세요~

charsyam의 이미지

뭐, 젤 간단하게 말하자면, 32비트 코드는 주소 범위가 32비트 까지 지정을 할 수 있다 정도로 보시면 될껍니다. ^^ 혹시나, 보호모드로 들어가시고 난 다음,
IDT를 설정하기 전에, 인터럽트 콜을 사용했다거나 하면 바로 리부팅됩니다. ^^

=========================
CharSyam ^^ --- 고운 하루
=========================

Necromancer의 이미지

보호모드 진입했다고 모두 32bit가 아니고
보호모드 진입 이후에 32bit code descriptor로 점프를 해야 합니다.
32bit 모드 전환 이후에는 스택 push라든가 명령어 처리 등이 모두
32bit 기준에 맞추어지기 때문에 기계어 코드에 변화가 있죠.
가장 대표적인게 prefix 기계어 코드인 0x66(operand size prefix),
0x67(address size prefix)로써. 32bit 진입시에는 이들의 특성이
완전히 바뀝니다. (16bit 어셈블러를 단순히 확장시킨 걸로는
이거 절대 커버 못하져)

그외에 call 명령뿐만 아니라 push, pop 명령으로 세그먼트 레지스터 push시
32bit 단위로 push되고, IDT핸들링도 약간 바뀌죠.
자세한 내용은 인텔 cpu 매뉴얼 참조하세요. (volume 1인가 3인가에서
mixing 16bit and 32bit code 절에서 이 내용을 다루고 있습니다)

그리고 nasm이요.. 32bit 코드 출력에 지장 전혀 없습니다.
bits 32를 쓰면 그 이후로는 모두 32bit 코드로 간주하고 거기에 맞게
만들어 줍니다. (nasm 메뉴얼 찾아보세요)

또 주의할꺼는. 보호모드 전환프로그램 만든다면 IRQ와 NMI처리를
세심하게 해야 합니다. 이거 디버그하기 엄청 골때립니다. 안하면 기냥
시스템 다운이나 리부팅입니다.

제가 여태껏 보호모드 프로그래밍 해본 경험으로 본다면...
님의 프로그램이 리부팅된다는거는 분명 IRQ와 NMI 처리를 전혀 안했거나
이거 핸들링하는데 버그가 있다는 얘기밖에 없습니다.

Written By the Black Knight of Destruction

익명 사용자의 이미지

항상 느끼는 것이지만 흑시사님의 말씀은 Very good이군요.

정확한 이해를 통달하신 분 같네요.

혹시 이건 개인적인 부탁이지만

흑기사님이 개발하여 공개하신것이 있다면

소개좀 해주세요. 한수 배우고 싶네요.

kkojiband의 이미지

답변 감사드립니다~ ^^

일단 하는데까지 해보구 또 안되면 물어볼께요...T.T

머가 이리 어려운지...--;

즐거운 하루 보내세요~!

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.