lodsb输出在2台不同的机器上,有2种不同的结果

时间:2015-04-03 19:02:00

标签: assembly bootloader bios low-level

我目前正在玩asm和低级别的东西,比如在没有操作系统的情况下在屏幕上打印字符,只需通过bios中断调用。

我的代码适用于qemu(seabios),但当我将我的bootsector写入usb时,我在两台不同的机器上得到两个不同的结果

以下代码只调用bios中断(0x10)以使用tty-output函数(0x0e)打印出一个字符串(在循环中分别为字符)。

适用于qemu和笔记本电脑(屏幕输出:" 12341234567")。但是当我使用我的台式电脑时,屏幕上的输出是......什么都没有。我只是得到一个闪烁的黑色屏幕_(看起来它来自tty函数,它只是没有打印任何字符)

我系统上的一些信息:

使用" qemu-system-x86_64 / dev / sdb"进行仿真;在我的笔记本电脑上

笔记本电脑:Intel Atom n270(32位,Phoenix Bios)

台式电脑:AMD Phenom II x6 1090t(64位,AMI Bios v1.17)

[org 0x7c00]

mov bp, 0xffff ; set stack location
mov sp, bp

mov ax, cs ; store cs in ds
mov ds, as

cld
mov si, MSG_TEST
call prnt

jmp $ ; prevent cpu from executing arbitrary bytes after this stuff aka hang

prnt:
  push ax
  push bx
  push si

  mov bh, 0
  _test_loop:
     lodsb
     cmp al, 0
     je _test_end

     mov ah, 0x0e
     int 0x10
     jmp _test_loop

_test_end:
    pop si
    pop bx
    pop ax
    ret

MSG_TEST db "12341234567", 0

times 510 - ($-$$) db 0 ; pad out (512 bytes)
dw 0xaa55 ; magic number bootable

我不认为这个问题与32/64位兼容性有关,因为在这个阶段我仍处于16位实时模式。

1 个答案:

答案 0 :(得分:1)

选项1。
功能0x0e需要BH寄存器中的有效视频模式页面。默认情况下为0。 mov bh, 0之前的_test_loop:应解决问题 选项2。
BIOS加载地址0x07c0:0而不是0:0x7c00的启动代码。在这种情况下,数据和代码段应该不同。 ds:si只是指向错误的位置
选项3。
PC以图形模式启动,在这种情况下,BL应包含字符颜色:mov bx, 7
选项4
堆栈对齐问题:0xffff是一个错误的偏移量。它应该是均匀的。例如,0xfffe 选项5
堆栈段问题。 ss也应初始化

如果您尝试

会发生什么
  org 0x7c00

  xor cx, cx
  mov ss, cx
  mov sp, 0x7bfe
  mov ds, cx
  mov es, cx
  mov si, text
  call print
  jmp $

print:
  ;
  ; display null-terminated ascii string in teletype mode
  ; at current cursor position
  ;
  ; input:
  ;   ds:si     - pointer to string
  ;
  mov bh, 0
  mov ah, 0x0e
  lodsb
  test al, al
  jz short $+6
  int 0x10
  jmp short $-7
  ret