我正在编写这个引导加载程序,只是在屏幕上打印出一些东西。这就是我到目前为止的装配:
.globl _start
.code16
_start:
movw $0x0003, %ax
int $0x10
movb $0x0e, %ah
movb $0x69, %al
int $0x10
movw $_header, %bx
movb %bl, %al
int $0x10
_header: .ascii "W\0"
.org 0x1FE
.byte 0x55
.byte 0xAA
所以现在它打印ASCII 69(" i"),但我希望它也打印.ascii
声明。现在我只将它设置为"W"
所以我可以在Objdump
中轻松找到它。我似乎无法访问该值(57)。我可以leal $_header, %edx
等等,但我似乎无法访问%edx
的值。
我尝试使用lodsb
,但我似乎无法弄明白。我将%di
设置为0x00,并使用%si
将_header
设置为leal %si, _header
的地址,然后我的lodsb
后跟int 0x10
并且不会{39} ; t似乎打印任何东西。我感激的任何想法。
答案 0 :(得分:1)
下面:
movw $_header, %bx
movb %bl, %al
首先,movb %bl, %al
没有从内存中读取一个字节到al
,它正在从bl
读取一个字节。您想将其更改为:
movb (%bx), %al
要从_header
中获取一个字符,您可以直接将该字符从内存加载到al
:
movb _header, %al
其次,最重要的是,你似乎做了几个假设:
cs
= 0x7c0,ip
= 0运行。它可以是cs
= 0,ip
= 0x7c00,但是你的代码期望ip
= 0(我从代码推断汇编程序开始用隐式{{1}组装它}})。您应该使您的代码适应第二个选项。您可以使用跳转指令将.org 0
和cs
重新加载到更合适的值,如下所示:ip
以及下一行的相应标签:jmp $0x7c0,$_next
。_next:
= 0x7c0运行。 ds
不保证设置为您可能想要或需要的任何值。你必须自己初始化它。最后,在最后ds
之后会发生什么?
通过更正,您的代码应如下所示:
int $0x10