Assembly 代码在bochs上工作,但在真正的计算机x86实模式上不工作

Assembly 代码在bochs上工作,但在真正的计算机x86实模式上不工作,assembly,x86,bootloader,gnu-assembler,real-mode,Assembly,X86,Bootloader,Gnu Assembler,Real Mode,这一小段代码在Bochs2.6上运行良好,但在“真正的”计算机上似乎不起作用(我已经尝试了其中的几个)。似乎是lodsb导致了这个问题,因为它工作得很好,当我通过逐个字符“手动”打印字符串来创建helloworld时 .code16 .text .globl _start _start: movw $0, %ax jmp main ### DATA AND BUFFERS ### welcome: .asciz "welcome" main: movw $w

这一小段代码在Bochs2.6上运行良好,但在“真正的”计算机上似乎不起作用(我已经尝试了其中的几个)。似乎是lodsb导致了这个问题,因为它工作得很好,当我通过逐个字符“手动”打印字符串来创建helloworld时

.code16
.text
.globl _start
_start:

    movw $0, %ax
    jmp main

### DATA AND BUFFERS ###
welcome:
    .asciz "welcome"

main:
    movw $welcome, %si
    call print_string

hang:
    jmp hang

print_string:
    lodsb

    cmp $0, %al
    je done

    mov $0x0e, %ah
    int $0x10
    jmp print_string

done:
    ret


. = _start + 510
.byte 0x55
.byte 0xaa
因为我的“真实”计算机上没有调试器,所以我不能很好地找出问题所在,重新启动计算机很多次都变得非常令人沮丧。问题可能与段寄存器有关吗


问题解决了:问题在于方向标志,和bochs不同,当bios跳到我的代码上时,方向标志被向后设置。有关避免进一步问题的更多详细信息和建议,请参阅下面的答案。

您应该在本文中看到我的一般引导加载程序提示。您没有显示链接步骤,但我假设您至少在LD中使用了
-Ttext=0x7c00
。如果原点为0x7c00,则需要在引导加载程序启动时将DS显式设置为零。还应设置堆栈并使用CLD为LODSB(和相关字符串指令)设置前进方向标志。您的代码做出了许多假设,这些假设可能对您的实际硬件不适用。在我的第一条评论中,您还应该将BH设置为零,以确保在调用最有可能的原因时,您正在将文本写入第0页(文本模式下的默认页面)(但在逐字符模式下可以)这是因为引导加载程序启动前设置的DS段与Bochs使用的不同。LODSB要求正确设置DS寄存器。@MichaelPetch谢谢。问题是方向标志。顺便说一句,这篇文章很棒,教了我很多。从现在起,我将初始化我的段寄存器,但在本例中,这并不是一个问题,因为从内存中获取数据时,move指令工作正常,而且据我所知,move也使用DS。再次感谢您的
movw$0,%ax
movw$welcome,%si
说明不使用DS。这两条指令中的源操作数都是即时的,因此加载到寄存器中的值作为指令的一部分进行编码。指令是使用CS获取的,因此不使用DS。事实上,LODSB是代码中唯一使用DS的指令。