gpt4 book ai didi

assembly - 从引导加载程序运行时 STOSB 指令不存储字节

转载 作者:行者123 更新时间:2023-12-02 20:07:15 24 4
gpt4 key购买 nike

在制作了一个小型引导加载程序来自学汇编语言之后,我注意到 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存储到缓冲区中,然后将该缓冲区打印到显示器上。输出应该是:

j

运行时它似乎没有打印任何内容。有什么问题,如何解决?

最佳答案

Michael Petch、Weather Vane、Jim Mischel 和 GJ 在评论中给出了解决方案。详细说明:

STOSB 指令隐式将数据存储到 [ES:DI],而 LODSB 指令隐式从 [DS 加载数据:SI]。您可以使用STOSB写入buffer并使用LODSBbuffer读取。但是,您设置了 DS 段寄存器,但未设置 ES。因此,您不会将 'j' 字符存储到您正在读取的同一位置。

解决方案只需将ESDS一起设置即可:

mov ax, 07C0h       
mov ds, ax
mov es, ax

注意:您可能还想明确清除 direction flag在代码中使用字符串指令(例如 LODSBSTOSB)之前。您可以使用 CLD 指令来执行此操作。 BIOS 很可能会在移交给引导扇区之前清除方向标志(这就是为什么它在没有 CLD 的情况下为您工作),但为了绝对确定,您应该自己清除该标志。

关于assembly - 从引导加载程序运行时 STOSB 指令不存储字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com