- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写 MBR 并使用 QEMU用于检测。
使用时 read sectors into memory ( int 0x13, ah=0x02
) , int
指令似乎阻止了我的程序的执行,它继续挂起。我已经用各种打印语句对此进行了测试,以确认这是这个特定的指令阻塞。
什么可以使中断阻塞?我认为这只能通过 cli
来完成。指令,即使这样它也不会阻塞 int
指示。
对于上下文,这是导致 read_sectors_16
中的阻塞中断的代码。 :
[bits 16]
[ORG 0x7C00]
jmp 0x000:start_16 ; ensure cs == 0x0000
reset_failure_str db 'error: boot disk reset', 13, 10, 0
read_failure_str db 'error: boot disk read', 13, 10, 0
boot_segaddr dw 0x7E00
read_attempt_str db 'read attempt', 13, 10, 0
end_read_attempt_str db 'end read attempt', 13, 10, 0
start_16:
;; Initialize segment registers
mov ax, cs
mov ds, ax
mov es, ax
jmp load_bootsector_2
load_bootsector_2: ; Read program from disk
;; dl set by BIOS to the drive number MBR was loaded from
mov cx, 0x0002 ; cylinder 0, sector 2
xor dh, dh ; head 0
mov al, 0x01 ; load 1 sector
mov bx, boot_segaddr ; destination - load right after the boot loader
call read_sectors_16
jnc .success
mov si, read_failure_str
call print_string_16
jmp halt ; halt
.success:
jmp boot_segaddr:0000 ; jump to program
;;; read_sectors_16
;;;
;;; Read sectors from disk in memory using BIOS services
;;;
;;; input: dl = drive
;;; ch = cylinder[7:0]
;;; cl[7:6] = cylinder[9:8]
;;; dh = head
;;; cl[5:0] = sector (1-63)
;;; es:bx -> destination
;;; al = number of sectors
;;;
;;; output: cf (0 = success, 1 = failure)
read_sectors_16:
pusha
mov di, 0x02 ; set attempts (max attempts - 1)
.attempt:
mov ah, 0x02 ; read sectors into memory (int 0x13, ah = 0x02)
int 0x13 ; TODO: this call is not returning!
jnc .end ; exit if read succeeded
dec di ; record attempt
test di, di
jz .end ; end if no more attempts
xor ah, ah ; reset disk (int 0x13, ah = 0x00)
int 0x13
jnc .attempt ; retry if reset succeeded, otherwise exit
jmp .end
.end:
popa
ret
最佳答案
突出的是您的分割市场。首先你的代码定义了 boot_segaddr
作为:
boot_segaddr dw 0x7E00
mov bx, boot_segaddr
[snip]
jmp boot_segaddr:0000
boot_segaddr
被用作立即数。您正在使用的地址是
boot_segaddr
,不是值
boot_segaddr
指着。
boot_segaddr dw 0x7E00
为常量值(使用
EQU
)并将其重命名为:
BOOT_OFFSET EQU 0x7E00
mov bx, boot_segaddr
成为:
mov bx, BOOT_OFFSET
jmp BOOT_OFFSET:0000
BOOT_OFFSET
正确的 4 位。您可以将行更改为:
jmp (BOOT_OFFSET>>4):0000
boot_segaddr
开始的扇区引起的。这是在您的引导加载程序中。可能您覆盖了引导加载程序中的所有代码,使其在
int 13h
时无法正常工作。最终返回。
关于x86 - BIOS 磁盘 - 将扇区读入内存 (int 0x13, ah=0x02) 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39542864/
我正在慢慢尝试进入 osdev 只是为了玩。 This tutorial有一个等待驱动器准备就绪的组件: reset_drive: mov ah, 0 int 13h or ah,
我试图理解一个程序来获取箭头键。 这是代码: int getkeys( ) { union REGS i,o; while(!kbhit( ));
我不小心删除了我的一个 GAE 项目(用 Go 编写)中的 ah-builtin-datastoreservice 和 ah-builtin-python-bundle 这两个版本。这意味着我的自动备
我对x86寄存器的理解是,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器。 在此示例中,EAX 是一个 32 位寄存器,如果我们调用 AX 它应该返回前 16 位,如果我们调用
我正在尝试学习汇编并编写引导程序。以下代码将软盘驱动器的内容加载到内存中并跳转到它(从地址0x1000开始加载)。该代码应该在屏幕上打印“ X”,但是由于某种原因它会打印一个空格。有人可以告诉我怎么了
我的信息来自here。作业要求读取一个不超过20个字符的程序,然后将这些字符转换为大写字母,然后将输入内容打印为大写字母。 我不知道如何从int21/AH = 0ah访问输入。除非我了解上面的链接,否
大部分汇编代码由以下指令终止 MOV AH, 4CH INT 21H “MOV AH,4CH”是什么意思? 最佳答案 DOS中断int 21/4Ch为EXIT-TERMINATE WITH RETUR
我的 Java 应用程序引擎已经运行良好几个月了。但最近两天,在执行/_ah/warmup 时,我看到了 5 个 HardDeadlineExceededError,现在是 34 个。 错误发生在简单
来自 https://www.felixcloutier.com/x86/div : ... temp ← AX / SRC; IF temp > FFH TH
我使用 GNU 汇编器和 AT&T 语法编写了我的第一个引导加载程序。假设将 hello world 打印到屏幕上,然后通知用户按任意键将导致重新启动。只有按下某个键后才会启动重新启动。我的引导加载程
我想获取我的硬盘的参数。使用描述的技术here . 这是显示软盘正常参数的代码: mov dl,00h mov ah,08h int 13h 这是代码,显示无效的硬盘参数(可能是我的硬盘空间很大(LB
我正在尝试将第一个硬盘驱动器的一个 block 读入内存。我尝试使用不同的 LBA,但它会将空间加载到缓冲区中。在下面的代码中,我添加了 for 循环,这样我就可以看到它是否加载了除空格之外的任何其他
我计划通过公共(public) VPS 提供商托管我的网络应用程序基础设施。由于 VPS 主机的专用网络可由其托管的所有 VPS 访问,并且许多基础设施组件没有任何类型的访问控制/身份验证,因此我需要
我正在使用 Bochs 2.4.5 编写引导扇区代码。我使用 INT 13H 从软盘读取扇区。但我发现如果要读取的扇区计数 > 72,则 INT13 将失败。返回码为 AH=1。下面是代码,这里是 I
我正在尝试实现应用程序内购买,而且似乎运行良好。当我尝试购买商品时,会出现带有价格的对话框。但是,当我将我的电子邮件帐户(或与开发者帐户没有任何关系的另一封电子邮件)放入“许可测试”列表中进行测试购买
我目前正在开发一个汇编程序,但我需要让程序每隔一段时间等待一次。 所以,我一直在使用 int 15h/ah = 86h,但出于某种原因,DosBox 给我带来了困难,程序要么与像素(奇怪的颜色)混淆,
在引导加载程序的第二阶段,我尝试将虚拟软盘上的一些扇区加载到 bochs 中的内存中。 ,但是在调用 int 0x13 时,例程不会返回。 我相信我的第二阶段的相关代码是: bootsys_start
我正在尝试在 x86 程序集中创建一个简单的命令系统。命令系统是第二阶段,加载于0x1000:0000。要查看我的引导加载程序,请单击 on this stackoverflow question .
我使用了第一个扇区中的所有内存,现在我想在第二个扇区(第二阶段)中存储一个新的变量字符串并打印它。例如: hello db 'Hello World' 新字符串应该位于另一个扇区中(因为第一个扇区中没
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!