使用Lodsb打印.ascii声明或只使用mov

时间:2012-10-07 23:20:36

标签: assembly x86 gas

我正在编写这个引导加载程序,只是在屏幕上打印出一些东西。这就是我到目前为止的装配:

    .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似乎打印任何东西。我感激的任何想法。

1 个答案:

答案 0 :(得分:1)

下面:

movw $_header, %bx
movb %bl, %al

首先,movb %bl, %al没有从内存中读取一个字节到al,它正在从bl读取一个字节。您想将其更改为:

movb (%bx), %al

要从_header中获取一个字符,您可以直接将该字符从内存加载到al

movb _header, %al

其次,最重要的是,你似乎做了几个假设:

  1. 您的代码开始以cs = 0x7c0,ip = 0运行。它可以是cs = 0,ip = 0x7c00,但是你的代码期望ip = 0(我从代码推断汇编程序开始用隐式{{1}组装它}})。您应该使您的代码适应第二个选项。您可以使用跳转指令将.org 0cs重新加载到更合适的值,如下所示:ip以及下一行的相应标签:jmp $0x7c0,$_next
  2. 您的代码开始以_next: = 0x7c0运行。 ds不保证设置为您可能想要或需要的任何值。你必须自己初始化它。
  3. 最后,在最后ds之后会发生什么?

    通过更正,您的代码应如下所示:

    int $0x10