[완료] 어셈블리어 질문입니다..

anster의 이미지

안녕하세요~ 처음뵙겠습니다.

OS 커널 구조와 원리 라는 책을 보고 공부중에 있는데요. ^^;

부트로더와 커널을 분리하는 과정이 다음과 같이 책에 나와 있어서 따라서 실습해 보았습니다.

소스는 아래와 같습니다.

;boot.asm

[org 0 ]
[bits 16 ]
jmp 0x07C0:start

start:
mov ax, cs
mov ds, ax

mov ax, 0xB800
mov es, ax
mov di, 0
mov ax, word [msgBack]
mov cx, 0x7D0

draw:
mov word [es:di], ax
add di, 2
dec cx
jnz draw

read:
mov ax, 0x1000
mov es, ax
mov bx, 0 ; Road Kernel ES:BX, 100:0000

mov ah, 2 ; Read
mov al, 1 ; Serctors to read count
mov ch, 0 ; Cyilnder : 0-79
mov cl, 2 ; Sector : 1-18
mov dh, 0 ; Head : 0-1
mov dl, 0 ; Drive : Floppy A

int 0x13 ; interrupt 13h

jc read

jmp 0x1000:0000

end:

msgBack db ' ', 0x7F
times 510-($-$$) db 0
dw 0xAA55

; kernel.asm

[org 0]
[bits 16]

kernel_start:
mov ax, cs
mov ds, ax
xor ax, ax
mov ss, ax

lea si, [msgKernel]
mov ax, 0xB800
mov es, ax
mov di, 0

call printf
jmp $

printf:
push eax

printf_loop:
mov al, byte [si]
mov byte [es:di], al
or al, al
jz printf_end
inc di
mov byte [es:di], 0x0F
inc si
inc di
jmp printf_loop

printf_end:
pop eax
ret

msgKernel db "We are in kernel program", 0

TIMES 1474048-($-$$) db 0

boot.asm와 kernel.asm의 내용이고 이부분으로부터 boot.img와 kernel.img가 생성되고 이 둘을 바이너리 형식으로 합쳐 하나의 img 파일로 만들어서 A: 에 넣고 실행시켰습니다.

BIOS가 부트로더를 0x7C00으로 로드하면 커널부분을 0x1000:0000 으로 로드합니다.

제가 궁금한것은, 책의 내용중에서 kernel.asm 에서 세그먼트를 초기화 설정 후

1. 왜 스택에 eax 값을 밀어 넣는가(용도)
2. 어째서 16bit 프로그램에서 32bit 확장레지스터 eax를 사용하는데 컴파일 에러가 나지 않는가

이 두가지입니다 ^^;; 제가볼땐 ret 이후의 부분에서 eax 를 사용하는 부분이 없고 주석처리에도 특별히 컴파일 에러가 나지 않는데 왜 사용하는지 잘 모르겠습니다..

읽어주셔서 감사합니다.

dalant019의 이미지

먼저, 레지스터들은(eax, ecx 등등) "공용"이다는 것을 기억하고 계셔야 합니다.
공용이라 함은 이를 공유하는 "여러 사람들"이 있다는 말이죠^^
문맥에따라, 이 여러 사람의 정체가 다를 수 있습니다. 일단 전 이 사람들을 "함수"라 할께요.
시나리오는 이렇습니다
함수1이 신이나게 저 레지스터들을 가지고 작업을 하고 있습니다. 그런데 작업을 마무리하려면 함수2의 도움이 중간에 필요합니다.
그래서 함수2를 호출합니다. 문제는 여기서 발생합니다. 함수2도 같은 레지스터들(eax, 등등)을 자기 입맛대로 사용하기 때문입니다. 함수1이 이 아이들을(레지스터들) 어떻게 사용하고 있었냐는 전혀 고려하지 않죠^^ 그러니 함수1은 자신의 값들(레지스터들에 들어있는)을 보호해야 겠죠.
감을 잡으셨는지요?

두번째에 대한 제 답변은
님이 논리적으로 잘못됐다고 생각하시는 부분들이 컴파일을 통과했다면 사용하시는 컴파일러가(여기서는 어셈블러라고 해야겠죠) 수정해 줬구나 하고 생각하시면 될 것 같아요. 중요한 건 어셈블해서 나온 기계가 님의 예상(님의 논리 그리고 그 논리의 표현인 코드)과 일치하는 가입니다. 물론 어셈블리어 레벨에서 부터 그런 일대일 대응시킨다면 님의 프로그램의 가독성이 훨씬 좋아지겠죠
음... 제 말은 너무 언어의 문법적인 부분에 치우치지 마시고 책을 보세요. 그 책을 보실 때 어셈블리 문법책 보다는 컴퓨터 구조를 같이 보시면 더 유용하리라 생각됩니다.(이는 순전히 제 생각 ==;)

쓰고 나니 저도 이게 도움이 될까? 하고 확신할 수 없네요. 다른 분들이 잘못됐거나 모자란 곳들을 채워주세요~

ifree의 이미지

일단 printf 루틴에서 ax 를 변화시키기 때문에 eax 를 push and pop 하는 것 같네요.
다른 범용 레지스터를 건드렸다면 그 레지스터도 마찬가지로 처리할 것 같습니다.

16 비트 프로그램에서도 32비트 레지스터를 쓸 수 있으며 에러가 나지 않습니다.
주소 연산만 16비트로 하면 됩니다.

anster의 이미지

답변 감사합니다.^^ 즐거운 하루되십시오.

===================

복군의 이글루
http://anster.egloos.com

댓글 달기

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