Debugging Qemu调试突然产生大量随机指令

Debugging Qemu调试突然产生大量随机指令,debugging,assembly,bootloader,qemu,x86-16,Debugging,Assembly,Bootloader,Qemu,X86 16,我正在尝试制作一个非常简单的启动程序,但调试时遇到了问题。我正在使用QEMU并与GDB连接,如下所示: (gdb) set architecture i8086 (gdb) target remote localhost:1234 (gdb) break *0x7C00 (gdb) layout asm (gdb) continue …这非常有效,我可以获得代码的前几条指令。但是,只要在一条特定的int指令上出现Isi或ni,此模式就会出现在GDB汇编视图中 0x8669 add %a

我正在尝试制作一个非常简单的启动程序,但调试时遇到了问题。我正在使用QEMU并与GDB连接,如下所示:

(gdb) set architecture i8086
(gdb) target remote localhost:1234
(gdb) break *0x7C00
(gdb) layout asm
(gdb) continue
…这非常有效,我可以获得代码的前几条指令。但是,只要在一条特定的
int
指令上出现I
si
ni
,此模式就会出现在GDB汇编视图中

0x8669  add    %al,(%bx,%si)                                               │
0x866b  add    %al,(%bx,%si)                                               │
0x866d  add    %al,(%bx,%si)                                               │
<ad nauseam>
阶段1.h 我知道代码不会随机跳转到内存中的某个地方,因为当我在QEMU中没有调试选项的情况下运行它时,程序会正常工作


我做错了什么?对我的代码的批评通常也是很受欢迎的。

我不知道确切的原因,但事实证明,中断最终会混淆调试器或QEMU的调试模式(或者我做错了什么,但我不确定是什么)

无论如何,为了解决这个问题,我只需在我希望调试的下一条指令上放置断点,然后在中断指令之前
continue


感谢您的帮助,评论员们。:-)

add%al,(%bx,%si)
就是当你反汇编零时发生的事情。@harold:是的,我想它是QEMU中的(初始化的)内存。不过谢谢。:)可能触发了一个中断,导致执行继续通过
HLT
?@Michael:可能,尽管我觉得奇怪的是,它只发生在一个地方,而且在没有远程调试的情况下运行代码时,永远不会发生。我该如何检查该问题?@MichaelRawson:您可以尝试将其更改为类似于
forever:hlt
/
jmp forever
的格式,然后查看它是否仍然执行随机代码。这可能取决于QEMU配置使用的仿真级别(即全软件仿真,或通过KVM使用硬件虚拟化)。我知道我以前遇到过调试问题,用纯软件仿真构建QEMU为我解决了这个问题。@DrewMcGowen:我不知道;Debian提供了
qemu
qemu kvm
软件包,所以我假设是软件仿真。我会调查的,谢谢。
#include "stage1.h"

.text
.code16
.org STAGE1_START

.globl _start
_start:
    JMP     main
    NOP

write:
    LODSB
    OR      %al, %al
    JZ      write_exit

    MOV     $0xE, %ah
    MOV     $0x9, %bx
    INT     $0x10
    JMP     write   

    write_exit:
        RET

video_setup:
    MOV     $0x0, %ah
    MOV     $0x3, %al
    INT     $0x10 /* This causes the problem. */
    RET 

LoadMsg:    .asciz "Loading second stage..."
BootDrive:  .byte
main:
    MOV     %dl, STAGE1_ABS_POS(BootDrive)
    CALL        video_setup
    LEA     STAGE1_ABS_POS(LoadMsg), %si
    CALL        write
    HLT

/* Fill file to 512 bytes, regardless. */
.fill           STAGE1_BOOTLOADER_SIZE - (. - _start)

/* BIOS magic. */
.word           STAGE1_BOOTLOADER_SIG
#ifndef STAGE_1_H
#define STAGE_1_H

#define STAGE1_START            0x0
#define STAGE1_BOOTLOADER_OFFSET    0x7C00
#define STAGE1_BOOTLOADER_SIG       0xAA55

#define STAGE1_BOOTLOADER_SIZE      0x1FE

#define STAGE1_ABS_POS(X) (X-_start+STAGE1_BOOTLOADER_OFFSET)

#endif