2014-12-20 10 views
-1

부트 섹터를 디버그하고 플로피 디스크를 읽습니다. 나는 bochs에서 그것을 디버그하고 그것이 성공적으로 또는 실패를 읽는지 확인하고 싶다. 나는 AH 레지스터가 코드를 반환 할 수 있지만 읽는 것을보고 싶어하므로 실제 메모리에서 es : bx 스택을 확인하려고하지만 0x00은 모두 확산된다. 왜?디버그 int 13h 02h bochs의 부트 섹터의 기능

이 코드는 as86에 의해 작성되었으며 ld86에 의해 링크되었습니다. bochs Disk Image Creation Tool을 사용하여 플로피 이미지를 생성하고이 부팅 가능 플로피 이미지를 생성하려면 dd bs=32 if=boot of=/dev/fd0 skip=1 명령을 사용했습니다.

액션이 오류가 없음을 나타내는 CF가 0이되도록 플래그가 다시 돌아 갔음을 발견했습니다. 그러나 ax 레지스터는 0x0201입니다. 아 레지스터는 0x02입니다. 왜 그런지 몰라? 여기

megs: 16 

romimage: file=$BXSHARE/BIOS-bochs-latest 
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest 

floppya: 1_44="floppya.img", status=inserted 

ata0-master: type=disk, path="hd.img", cylinders=365, heads=16, spt=63 

boot: a 

log: bochsout.txt 

panic: action=ask 
error: action=report 
info: action=report 
debug: action=ignore 

cpu: ips=15000000 
clock: sync=both 

vga: extension=vbe, update_freq=15 

mouse: enabled=0 

코드입니다 :

BOOTSEG = 0x07c0 
SYSSEG = 0x1000 

entry start 
start: 
    jmpi go, #BOOTSEG 
go: mov ax, cs 
    mov ds, ax 
    mov ss, ax 
    mov sp, #400 

    mov dx, #0x0000 
    mov cx, #0x0002 
    mov ax, #SYSSEG 
    mov es, ax 
    xor bx, bx 
    mov ax, #0x201 
    int 0x13 

.org 510 
    .word 0xAA55 
    .word 0xFFFF 

코드 AS86 쓴 내가 두 번째 부문의 시작 부분에 하나 개의 단어를 추가

다음은 내 Bochs와 파일입니다.

나는 bochs에 디버그 정보를 붙여 넣습니다. 또한 말하지 않았다)

======================================================================== 
00000000000i[  ] reading configuration from bochsrc 
00000000000i[  ] installing win32 module as the Bochs GUI 
00000000000i[  ] using log file bochsout.txt 
Next at t=0 
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b   ; ea5be000 
f0 
<bochs:1> b 0x7c00 
<bochs:2> c 
(0) Breakpoint 1, 0x0000000000007c00 in ??() 
Next at t=61419250 
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): jmpf 0x07c0:0005   ; ea0500c0 
07 
    <bochs:3> s 
Next at t=61419251 
(0) [0x000000007c05] 07c0:0005 (unk. ctxt): mov ax, cs    ; 8cc8 
<bochs:4> s 
Next at t=61419252 
(0) [0x000000007c07] 07c0:0007 (unk. ctxt): mov ds, ax    ; 8ed8 
<bochs:5> s 
Next at t=61419253 
(0) [0x000000007c09] 07c0:0009 (unk. ctxt): mov ss, ax    ; 8ed0 
<bochs:6> s 
Next at t=61419254 
(0) [0x000000007c0b] 07c0:000b (unk. ctxt): mov sp, 0x0400   ; bc0004 
<bochs:7> s 
Next at t=61419255 
(0) [0x000000007c0e] 07c0:000e (unk. ctxt): mov dx, 0x0000   ; ba0000 
<bochs:8> s 
Next at t=61419256 
(0) [0x000000007c11] 07c0:0011 (unk. ctxt): mov cx, 0x0002   ; b90200 
<bochs:9> s 
Next at t=61419257 
(0) [0x000000007c14] 07c0:0014 (unk. ctxt): mov ax, 0x1000   ; b80010 
<bochs:10> s 
Next at t=61419258 
(0) [0x000000007c17] 07c0:0017 (unk. ctxt): mov es, ax    ; 8ec0 
<bochs:11> s 
Next at t=61419259 
(0) [0x000000007c19] 07c0:0019 (unk. ctxt): xor bx, bx    ; 31db 
<bochs:12> s 
Next at t=61419260 
(0) [0x000000007c1b] 07c0:001b (unk. ctxt): mov ax, 0x0201   ; b80102 
<bochs:13> s 
Next at t=61419261 
(0) [0x000000007c1e] 07c0:001e (unk. ctxt): int 0x13     ; cd13 
<bochs:14> s 
Next at t=61419262 
(0) [0x0000000fe3fe] f000:e3fe (unk. ctxt): jmp .-19908 (0x000f963d) ; e93cb2 
<bochs:15> r 
rax: 00000000_00000201 rcx: 00000000_00090002 
rdx: 00000000_00000000 rbx: 00000000_00000000 
rsp: 00000000_000003fa rbp: 00000000_00000000 
rsi: 00000000_000e0000 rdi: 00000000_0000ffac 
r8 : 00000000_00000000 r9 : 00000000_00000000 
r10: 00000000_00000000 r11: 00000000_00000000 
r12: 00000000_00000000 r13: 00000000_00000000 
r14: 00000000_00000000 r15: 00000000_00000000 
rip: 00000000_0000e3fe 
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf 
<bochs:16> sreg 
es:0x1000, dh=0x00009301, dl=0x0000ffff, valid=1 
     Data segment, base=0x00010000, limit=0x0000ffff, Read/Write, Accessed 
cs:0xf000, dh=0x0000930f, dl=0x0000ffff, valid=1 
     Data segment, base=0x000f0000, limit=0x0000ffff, Read/Write, Accessed 
ss:0x07c0, dh=0x00009300, dl=0x7c00ffff, valid=7 
     Data segment, base=0x00007c00, limit=0x0000ffff, Read/Write, Accessed 
ds:0x07c0, dh=0x00009300, dl=0x7c00ffff, valid=1 
     Data segment, base=0x00007c00, limit=0x0000ffff, Read/Write, Accessed 
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1 
     Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed 
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1 
     Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed 
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1 
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1 
gdtr:base=0x00000000000fa1f7, limit=0x30 
idtr:base=0x0000000000000000, limit=0x3ff 
<bochs:17> xp /40bx 0x10000 
[bochs]: 
0x0000000000010000 <bogus+  0>: 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 
0x0000000000010008 <bogus+  8>: 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 
0x0000000000010010 <bogus+  16>: 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 
0x0000000000010018 <bogus+  24>: 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 
0x0000000000010020 <bogus+  32>: 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 

답변

0

마지막으로 s 단계가 인터럽트 처리기에 입력됩니다 (주소는 f000:e3fe이며 BIOS 내부에 있음). 아직 아무 것도하지 않았으므로, ax은 인터럽트에 전달한 값을 유지합니다. 코드로 돌아갈 때까지 단계를 수행하거나 인터럽트 이후 중단 점을 두어 계속 진행해야합니다. 그래야만 CF 및 기타 레지스터를 검사해야합니다.

+0

예. 그것은. 나는 마지막 명령 대신에 명령을 내리고 그 결과를 얻었다. 감사! – viscroad

0

당신은 당신이 (어쩌면 당신이 잘못된 주소를보고 있었다) 시도 명령을 무엇을하고 플로피 이미지가로드 분야에서 0 바이트가 아닌 다른 뭔가가 있는지 여부를 표시하는 것을 잊었다 어떤 어셈블러를 사용했는지 그리고 어떻게 이미지를 생성했는지를 알 수 있습니다. nasm 사용하여이 코드로 테스트 한

:

mov dx, 0x0000 
    mov cx, 0x0002 
    mov ax, 0x1000 
    mov es, ax 
    xor bx, bx 
    mov ax, 0x201 
    int 0x13 
    jmp $ 

times 510 - ($-$$) db 0 
dw 0xAA55 ; signature 
times 512 db 0xaa ; fill 2nd sector with 0xaa 
times 1474560 - ($-$$) db 0 ; fill rest of image with 00 

bochs에서 생성 된 이미지 부팅 :

(0) [0x0000000000007c10] 0000:7c10 (unk. ctxt): int 0x13     ; cd13 
<bochs:9> 
Next at t=529 
(0) [0x0000000000007c12] 0000:7c12 (unk. ctxt): jmp .-2 (0x00007c12)  ; ebfe 
<bochs:10> r 
rax: 0x00000000_00000001 rcx: 0x00000000_00000002 
rdx: 0x00000000_00000000 rbx: 0x00000000_00000000 
rsp: 0x00000000_0000ffd6 rbp: 0x00000000_00000000 
rsi: 0x00000000_000e91b9 rdi: 0x00000000_0000ffac 
r8 : 0x00000000_00000000 r9 : 0x00000000_00000000 
r10: 0x00000000_00000000 r11: 0x00000000_00000000 
r12: 0x00000000_00000000 r13: 0x00000000_00000000 
r14: 0x00000000_00000000 r15: 0x00000000_00000000 
rip: 0x00000000_00007c12 
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf 
<bochs:11> xp/32bx 0x10000 
[bochs]: 
0x0000000000010000 <bogus+  0>: 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 
0x0000000000010008 <bogus+  8>: 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 
0x0000000000010010 <bogus+  16>: 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 
0x0000000000010018 <bogus+  24>: 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 

당신은 AH=0 (오류를 의미하지 않음) 것을 볼 수 있습니다, AL=1 (1 의미를 섹터로드) 실제로 데이터는 메모리에 있습니다.

+0

나는 비슷한 디버그를하지만 ax 레지스터에는 항상 0201이 있습니다. bochs에 디버그 정보를 붙여 넣습니다. – viscroad

+0

나는 코드를 다시 작성하고 자신이하는 것처럼 시도하기 위해 nasm을 사용했다. 하지만 결과에 실패하고 항상 내 결과에 0x00이 있습니다. 아마 내 bochs 또는 호스트 컴퓨터에서 일부 구성 오류가 있습니까? – viscroad