我目前正在玩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位实时模式。
答案 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