zer*_*o77 2 x86 assembly real-mode bootloader x86-16
在制作了一个小型引导程序来教我自己的汇编语言后,我注意到该stosb指令似乎不起作用.我将问题压缩到一个最小的例子:
BITS 16
start:
mov ax, 07C0h       
add ax, 288     
mov ss, ax
mov sp, 4096
mov ax, 07C0h       
mov ds, ax ;setting up stack
mov al, 'j'
mov di, buffer
stosb
mov si, buffer
jmp loops
loops:
mov ah, 0Eh
lodsb
cmp al, 0
je done
int 10h
jmp loops
done:
hlt
buffer times 64 db 0
times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
dw 0xAA55
当运行此引导加载程序时,它应将字母存储j到缓冲区中,然后将该缓冲区打印到显示器.输出应该是:
Ĵ
运行时似乎没有打印任何东西.有什么问题,我该如何解决?
解决方案由Michael Petch,Weather Vane,Jim Mischel和GJ在评论中提供.详细说明:
该STOSB指令隐含地存储数据[ES:DI],而LODSB指令隐式地从装载数据[DS:SI].你STOSB用来写buffer和LODSB读buffer.但是,您设置了DS段寄存器,但没有ES.因此,您不会将'j'角色存储到您正在阅读的相同位置.
解决方案只是ES与DS:
mov ax, 07C0h       
mov ds, ax
mov es, ax
注意:您可能还希望在代码中使用字符串指令(例如,)之前显式清除方向标志.您可以按照说明执行此操作.在交付给bootsector之前,BIOS很可能会清除方向标志(这就是为什么它在没有它的情况下为你工作的原因),但是为了绝对确定,你应该自己清除标志.LODSBSTOSBCLDCLD
| 归档时间: | 
 | 
| 查看次数: | 314 次 | 
| 最近记录: |