|  | 27 | ((p 27) 마지막 줄. 실행 예) nasm [생략]ndisasm [생략]
 ==>
 nasmw [생략]
 ndisasmw [생략]
 
 * p 27, 28, 29
 | 2006-10-25 | 1 | 
|  | 27 | ((p. 27) 아래에서 첫번째) ndisasm -b16 boot.bin==>
 ndisasmw -b16 boot.bin
 | 2006-10-25 | 1 | 
|  | 28 | ((p. 28) 네번째 줄) ndisasm -b16 boot.bin > disasm.txt==>
 ndisasmw -b16 boot.bin > disasm.txt
 | 2006-10-25 | 1 | 
|  | 29 | ((p. 29) 아래에서 두 번째) C:CHAP1>ndisam -b16 boot.bin > disasm.txt==>
 C:CHAP1>ndisasmw -b16 boot.bin > disasm.txt
 | 2006-10-25 | 1 | 
|  | 29 | ((p. 29) 아래에서 네번째) C:CHAP1>ndisasm -b16 boot.bin > disasm.txt==>
 C:CHAP1>ndisasmw -b16 boot.bin > disasm.txt
 | 2006-10-25 | 1 | 
|  | 37 | ((p37 그림 1-5)) 7654      3210글자색   배경색
 ==>
 0000      0110
 글자색   배경색
 | 2006-10-25 | 1 | 
|  | 38 | ((p 38) 다섯번째 문단) 그리고 0x06을 넣어 "A"자를 갈색 바탕에 검은 글씨로 나타냅니다.==>
 그리고 0x06을 넣어 "A"자를 검은 바탕에 갈색 글씨로 나타냅니다.
 | 2006-10-25 | 1 | 
|  | 39 | (p.39 위에서 7번째줄, 9,10번째줄) **현재 등록되어 있는 내용이 틀렸습니다
 본문내용
 times 510-($-$$) db 0 명령은 이 번지에서부터 510번지까지 0으로 채우
 라는 뜻입니다.
 
 그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 510번지까지 0으로
 채웠으므로 511번지에는 0xAA가, 512번지에는 0x55가 들어가게 됩니다.
 
 수정
 times 510-($-$$) db 0 명령은 이 번지에서부터 509번지까지 0으로 채우
 라는 뜻입니다.
 
 그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 509번지까지 0으로
 채웠으므로 510번지에는 0x55가, 511번지에는 0xAA가 들어가게 됩니다.
 
 수정근거:
 00000000  EA0500C007        jmp 0x7c0:0x5
 00000005  8CC8              mov ax,cs
 ~~~~
 000001FA  0000              add [bx+si],al
 000001FC  0000              add [bx+si],al
 000001FE  55                push bp
 000001FF  AA                stosb
 
 디스어셈블한 파일을 보면 위와 같다.
 000001FE는 10진수로 변환하면 510
 000001FF는 10진수로 변환하면 511    이라는 것을 확인할수 있다
 
 그리고 MBR영역은 512바이트인데
 주소로 보면  00000000~000001FF 까지 임을 알수있다
 ==>
 **현재 등록되어 있는 내용이 틀렸습니다
 
 본문내용
 times 510-($-$$) db 0 명령은 이 번지에서부터 510번지까지 0으로 채우
 라는 뜻입니다.
 
 그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 510번지까지 0으로
 채웠으므로 511번지에는 0xAA가, 512번지에는 0x55가 들어가게 됩니다.
 
 수정
 times 510-($-$$) db 0 명령은 이 번지에서부터 509번지까지 0으로 채우
 라는 뜻입니다.
 
 그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 509번지까지 0으로
 채웠으므로 510번지에는 0x55가, 511번지에는 0xAA가 들어가게 됩니다.
 
 수정근거:
 00000000  EA0500C007        jmp 0x7c0:0x5
 00000005  8CC8              mov ax,cs
 ~~~~
 000001FA  0000              add [bx+si],al
 000001FC  0000              add [bx+si],al
 000001FE  55                push bp
 000001FF  AA                stosb
 
 디스어셈블한 파일을 보면 위와 같다.
 000001FE는 10진수로 변환하면 510
 000001FF는 10진수로 변환하면 511    이라는 것을 확인할수 있다
 
 그리고 MBR영역은 512바이트인데
 주소로 보면  00000000~000001FF 까지 임을 알수있다
 | 2006-10-25 | 1 | 
|  | 43 | ((p. 43) 18줄) dw 0aa55h==>
 dw 0xaa55h
 | 2006-10-25 | 1 | 
|  | 54 | ((p.54) 아래에서 여섯 번째) [org0]==>
 [org 0]
 | 2006-10-25 | 1 | 
|  | 68 | (68page 아래서 2번째줄) db 0xCF ; G:1, D:1 , limit 16~19 bit: 0xF
 
 위 내용은 57페이지의 실제 소스 내용과 다릅니다.
 
 db 0x40 ; G:0, D:1 , limit 16~19 bit: 0x0
 
 이 되어야 합니다.
 ==>
 확인중
 | 2006-10-25 | 1 | 
| 3 | 70 | (두 번째 항목) 0x1234*0xFFFF=0x1234FFF=>
 0x1234*0xFFF=0x1234FFF
 | 2009-09-12 | 2 | 
|  | 70 | (70p 중간에 ..) Limit의 20비트를 모두 채워서 0xFFFFF를 기재해....G 비트가 0이면  세그먼트의 크기는 1바이트가 될 것입니다.
 
 1메가바이트이어야 할것같습니다.
 ==>
 확인중
 | 2006-10-25 | 1 | 
| 3 | 73 | (소스 코드) db 0x00      ; base 24~32bit =>
 db 0x00      ; base 24~31bit
 
 | 2009-09-12 | 2 | 
|  | 76 | ((p 76) 두번째 문단 둘째줄) 그래서 이 세그먼트는 물리 주소 0xB8000 ~ 0xFFFF 값 사이의 메모리 영역을 지칭한다는 사실을 알 수 있습니다.
 .................................
 
 그래서 이 세그먼트는 물리 주소 0xB8000 ~ 0xC7FFF (0xB8000 + 0xFFFF) 값 사이의 메모리 영역을 지칭한다는 사실을 알 수 있습니다.
 
 물리주소이므로 0xFFFF를 더해야 합니다.
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 77 | ((p77) 첫번째줄) 원문) CPU에는 GDTR이라는 레지스터가 있습니다. 이 레지스터는 48바이트의
 수정) 48바이트의 -> 48비트의
 ==>
 확인중
 | 2006-10-25 | 1 | 
| 2 | 89 | (p 89 첫 두줄) <p.88 끝부분 코드>jmp $+2
 nop
 nop
 
 <p.89 앞 부분 설명>
 "이 점프 명령어는 두개의 명령(2개의 nop)을 점프하여 그 다음 명령으로 가는데..."
 
 이렇게 되어있지만, jmp $+2에서 $는 이 기계어가 있는 메모리 오프셋을 가리키므로,
 $+2는 두번째 nop를 가리키게 됩니다.
 따라서, jmp $+2가 실행되면, 첫번째 nop를 건너뛰어 두번째 nop를 실행합니다.
 
 아직 실행해보진 않았지만, 실제 실행에는 문제가 없을것 같습니다.
 
 <확인중>
 
 저자분이 별도 수정은 필요 없을 것 같다고 합니다.
 감사합니다.
 | 2007-02-01 | 1 | 
|  | 95 | ((p 95) 세번째 문단) 80*2*20+2*10은 10번째 열의 10번째 칸에서...
 ...
 
 한 열의 칸 수 * 2 * 써야할 열 번호 + 2 * 써야할 칸 번호
 ==>
 80*2*20+2*10은 11번째 열의 11번째 칸에서...
 
 ...
 
 한 열의 칸 수 * 2 * 써야할 열 번호 - 1 + 2 * 써야할 칸 번호 - 1
 | 2006-10-25 | 1 | 
|  | 97 | ((p 97) 12번~17번줄 코드) mov bx, SysDataSelectormov ds, bx
 mov es, bx
 mov fs, bx
 mov gs, bx
 mov ss, bx
 
 p 97의 12번째~17번째 코드는 필요 없는 것 같습니다.
 ==>
 확인 중
 | 2006-10-25 | 1 | 
|  | 104 | (p104 14번째 줄부터 19번째 줄까지 (빈줄은 세지 않았음)) mov bx, SysDataSelectormov ds, bx
 mov es, bx
 mov fs, bx
 mov gs, bx
 mov ss, bx
 
 이 코드가 불필요 한 것 같습니다.
 
 p105 의 kernel.asm 에서 중복되기도 하거니와
 
 이 시점에서 아직 32bit 로 jmp 되지 않았기 때문에
 
 의미도 없어보입니다...
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 107 | (p107 idtr: 부분) idtr:dw 256 * 8 - 1
 
 부분에서 idt 의 크기를 나타내는데 왜 -1 을 해야하는지 모르겠습니다.
 
 idt 의 마지막 주소라면 모르지만 크기라면
 
 256 * 8 이 맞지 않나요?
 
 이 경우의 코드라면 boot.asm 의 gdt 설정부분과 일관성을 유지하여
 
 idtr:
 dw 256 * (idt_end - idt - 1)
 dd 0
 idt:
 dw isr_ignore
 dw SysCodeSelector
 dw 0x8e00
 dw 0x0001
 
 idt_end:
 
 가 더 적절하지 않을까요?
 ==>
 확인 중
 | 2006-10-25 | 1 | 
|  | 114 | ((p 114) 두번째줄) 원문) IDT도 등록을 위해 48바이트의 변수가 필요한데,
 수정) 48바이트의 -> 48비트의
 
 로 되어야 하지 않나요?
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 144 | (4장 6의 예외 부분) devide==>
 divide
 | 2006-10-25 | 1 | 
|  | 169 | ((p 169) 위에서 세번째 줄) 해당 줄에서 "... 이 영역을 TSS(Task Statement Segment)라고 합니다.."
 
 이렇게 적어놓으셨는데, TSS의 풀이말이 좀 틀린 것 같습니다.
 Statement가 아니라 State아닌가요?
 
 인텔 메뉴얼을 찾아보니 State라고 되어 있더군요. 의미상으로도
 Statement가 아니라 State가 되어야 할 것 같습니다.
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 170 | (170p 아래에서 5째줄) GDTR,IDTR,CR0~CR0 를
 GDTR,IDTR,CR0~CR2
 로..
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 197 | (p 197 세번째 단락에서) 1. "만약 오프셋에 0xFFFC를 지정하고, 이곳에 더블워드의 ..... 안 됩니다."
 2. "그리고 오프셋에 0xFFFD를 지정하고, 워드 값으로..."
 ==>
 1. "만약 오프셋에 0xFFFD를 지정하고, 이곳에 더블워드의 ..... 안 됩니다."
 
 * 이유 : 0xFFFC까지되고, 0xFFFD부터 안됩니다.
 
 2. "그리고 오프셋에 0xFFFF를 지정하고, 워드 값으로..."
 
 * 이유 : 0xFFFD, 0xFFFE까지되고 0xFFFF부터 안됩니다.
 | 2006-10-25 | 1 | 
|  | 206 | (206쪽, 244쪽, 243쪽) 206쪽 그림 6-6의 오른쪽 그림에서
 EIP
 
 
 243쪽 마지막 단락에서
 
 첫번째, 세번째줄의 "그림 7-3" => "그림 7-5"
 
 다섯번째줄의 "그림 6-6" => "그림 6-7"
 
 
 
 
 
 
 
 244쪽 그림 7-5에서
 
 EIP, CS의 위치가 서로 바뀌었고, ESP화살표는 EDI를 가리켜야함
 ==>
 206쪽 그림 6-6의 오른쪽 그림에서
 
 ESP
 
 첫번째, 세번째줄의 "그림 7-5"
 
 다섯번째줄의  "그림 6-7"
 | 2006-10-25 | 1 | 
|  | 215 | (소스코드 가운데 부분) lea esp, [PM_Start - 256]
 push dword UserDataSelector
 push esp
 push dword 0x200
 ...
 ==>
 lea eax, [PM_Start - 256]
 
 push dword UserDataSelector
 push eax
 push dword 0x200
 ...
 
 * 이유
 p224의 맨 아래단락에서 스택영역을 PM_Start - 256 이라고 하는데, 엄밀하게 스택영역은 PM_Start - 256 - 4임.
 
 (위의 코드에서 esp값을 lea로 가져온후, 첫번째 push에서 값이 변경되기 때문에)
 
 PM_Start - 256이라고 하려면, 위의 코드에서 lea esp, [PM_start - 256]과 push esp를 lea eax, [PM....], push eax로 변경해야함
 | 2006-10-25 | 1 | 
| 7 | 225 | (225) 지적해주신 부분이 맞습니다.반영하였습니다.
 | 2008-04-30 | 3 | 
|  | 236 | (p236 , p237 총 5곳) User1regs:dd 0, 0, 0, 0, 0, 0, 0, 0 : EDI, ESI, EBP, EBX, EDX, ECX, EBX, EAX
 
 를...
 
 User1regs:
 dd 0, 0, 0, 0, 0, 0, 0, 0 : EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX
 
 로 고쳐야 합니다.
 
 User2regs:
 User3regs:
 User4regs:
 User5regs:
 도 마찬가지 입니다...
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 244 | (244p 그림 7-5.) ret_from_int 함수 호출시!! 라고 했으므로..ESP 가 가리키는 곳은 EDI 아래가 아닌 EDI 이어야 합니다.
 만일 architecture 의스택구조가 감소후 저장이 아닌 저장후 감소하는 형이라면
 [esp+52] 가 아닌 [esp+56] 이 되어야 합니다.
 ==>
 확인중
 | 2006-10-25 | 1 | 
| 7 | 246 | (246 페이지 상단) dd 0,0,0,0,0,0,0,0 ; EDI,ESI,EBP,EBX,EDX,ECX,EBX,EAX=>
 dd 0,0,0,0,0,0,0,0 ; EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
 
 | 2008-04-30 | 1 | 
|  | 254 | (p 254 그림 7-7) 화살표 방향이 반대라고 생각됨==>
 확인중
 | 2006-10-25 | 1 | 
|  | 346 | (p 346 4번째 문단) 0x1234==>
 0x3412
 | 2006-10-25 | 1 | 
|  | 363 | (p 363 페이지 디렉토리 설정하는곳) mov edi, PAGE_DIRmov eax, 0x103000    ; 상수로 바꿀수 있음.
 or  eax, 0x01
 mov [es:edi], eax
 
 mov edi, PAGE_DIR+0x200*4
 mov eax, 0x102000    ; 상수로 바꿀수 있음. user 영역 페이지 테이블 설정
 or  eax, 0x07
 mov [es:edi], eax
 
 mov edi, PAGE_DIR+0x300*4
 mov eax, px101000    ; 상수로 바꿀수 있음.
 or  eax, 0x01
 mov [es:edi], eax
 
 
 
 에러는 아니고 상수가 정의 되어 있는데 굳이 숫자로 쓸 필요가 없다고 생각 되어서 아래처럼 고쳤으면 합니다.
 
 mov edi, PAGE_DIR
 mov eax, PAGE_TAB_LOW       ; 1M 이하 영역 페이지 테이블 설정
 or  eax, 0x01
 mov [es:edi], eax
 
 mov edi, PAGE_DIR+0x200*4
 mov eax, PAGE_TAB_USER      ; user 영역 페이지 테이블 설정
 or  eax, 0x07
 mov [es:edi], eax
 
 mov edi, PAGE_DIR+0x300*4
 mov eax, PAGE_TAB_KERNEL    ; kernel 영역 페이지 테이블 설정
 or  eax, 0x01
 mov [es:edi], eax
 ==>
 확인중
 | 2006-10-25 | 1 | 
|  | 367 | ((p 367) init.h소스 맨 아래.) #define NUM_MAX_TASK를 숫자로 정의하지 않았습니다.그래서 process.c파일을 컴파일할 때, 전혀 이상한 컴파일 문법에러가 났습니다.
 
 #define NUM_MAX_TASK를
 ==>
 #define NUM_MAX_TASK 4로 고쳐야 합니다.
 | 2006-10-25 | 1 | 
|  | 402 | (ReadSector 함수 마지막 행) return 1;}
 ==>
 }
 | 2006-10-25 | 1 | 
|  | 403 | (FloppySeek 함수 변수 선언부) int i, j;char result[7]
 ==>
 int i;
 char result[7]
 | 2006-10-25 | 1 | 
|  |