【问题标题】:Assembly INT 0x13: Not getting an error when trying to read from disk程序集 INT 0x13:尝试从磁盘读取时未出错
【发布时间】:2015-10-15 21:04:24
【问题描述】:

每当我在 QEMU 中运行它时,我似乎都没有收到错误消息,但该消息没有打印在屏幕上,所以我不确定我看不到的实际情况。这是我的代码:

[org 0x7c00]
mov bp, 0x8000
mov sp, bp

mov si, name
call print_string
mov si, version
call print_string
call rd_dsk
mov si, testmsg
call print_string
jmp $

;Print
print_char:
  mov ah, 0x0e
  int 0x10
  ret
print_string:
  screen:
    lodsb
    cmp al, 0
    je screen_end
    mov ah, 0x0e
    int 0x10
    jmp screen
  screen_end:
  ret
print_hex:
  mov si, hex_temp
  mov bx, dx
  shr bx, 12
  mov bx, [bx+hex_alph]
  mov [hex_temp+2], bl
  mov bx, dx
  shr bx, 8
  and bx, 0x000f
  mov bx, [bx+hex_alph]
  mov [hex_temp+3], bl
  mov bx, dx
  shr bx, 4
  and bx, 0x000f
  mov bx, [bx+hex_alph]
  mov [hex_temp+4], bl
  mov bx, dx
  and bx, 0x000f
  mov bx, [bx+hex_alph]
  mov [hex_temp+5], bl
  call print_string
  ret

;Read
rd_dsk:
  mov ah, 0x02
  mov al, 0x01
  mov ch, 0x00
  mov dh, 0x00
  mov cl, 0x02
  mov bx, 0x00
  mov es, bx
  mov bx, 0x7c00 + 512
  int 0x13
  jc rd_dsk_error
   ret

; Error
rd_dsk_error:
  mov si, rd_dsk_error_msg
  call print_string
  jmp $

;Misc Data
name:
  db 'PurityOS ',0
version:
  db 'v0.0.1.2 ',0
hex_temp:
  db '0x????',0
hex_alph:
  db '0123456789ABCDEF'

; Error Messages
rd_dsk_error_msg:
  db 'Error reading the disk.',0

times 510-($-$$) db 0
dw 0xaa55

;Data beyond BootSector
testmsg:
  db 'Reading Second Sector',0

我希望得到这个输出:

PurityOS v0.0.1.2 Reading Second Sector

但是,我只得到这个:

PurityOS v0.0.1.2

另外,如果我把“call rd_dsk”放在顶部:

[org 0x7c00]
mov bp, 0x8000
mov sp, bp

call rd_dsk
mov si, name
call print_string
mov si, version
call print_string
mov si, testmsg
call print_string
jmp $

我没有得到任何输出,我只得到闪烁的光标,好像我只有“jmp $”

我使用 NASM 组装 .asm 文件,并使用 QEMU 运行它。 “qemu -fda ...”不起作用。我得到“程序'qemu'可以在以下软件包中找到”安装后没有任何软件包有帮助。我只是运行“qemu-system-x86_64 ./Asm/bootsector.bin”来打开QEMU。

提前谢谢你。

【问题讨论】:

  • 当我阅读这段代码时,看起来您正在将一个扇区读入地址 0:0x7c00 + 512。但这似乎也(大致)是您的代码开始的地址。读取是否有可能清除您的代码?如果你把它改成mov bx, 0x7c00 + 2048怎么办?
  • 首先,不要假设寄存器值。初始化您将要使用的段寄存器。同样在调用int 13/ah=02 时,您没有设置dl。其次,更重要的是,绘制内存图以及您分配特定区域的内容。第三,意识到您对堆栈区域做出了错误的选择,因此您的代码无法工作。

标签: assembly qemu osdev


【解决方案1】:

您的堆栈指针最初位于 0x0000:0x8000。

当您执行“call”或“int”指令时,返回地址被压入堆栈(位于内存范围 0x7F00-0x8000)。

当你覆盖这个内存时,系统会崩溃。

解决方案:

将此行中的 0x8000 更改为 0x7BFC:

mov bp, 0x8000
mov sp, bp

【讨论】:

  • @MartinRosenau 在堆栈上(位于内存范围 0x7F00-0x8000)。 请解释一下为什么您认为下限是 0x7F00 而不是零?
  • @user3144770:我写的 0x7F00-0x8000 实际上是指:堆栈位于 X-Y 内存范围内,而 0x7F00
  • 所有这一切的一个严重缺陷是 OP 从未设置 SS。 SS:SP 应该被设置。如果您想从引导加载程序下方向下增长,那么将 SS:SP 设置为 0x0000:0x7c00 就足够了。
猜你喜欢
  • 2020-01-03
  • 2014-11-29
  • 1970-01-01
  • 2018-07-15
  • 2012-11-05
  • 2016-08-13
  • 2013-11-20
  • 2011-01-28
  • 1970-01-01
相关资源
最近更新 更多