- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在制作了一个小型引导加载程序来自学汇编语言之后,我注意到 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
并使用LODSB
从buffer
读取。但是,您设置了 DS
段寄存器,但未设置 ES
。因此,您不会将 'j'
字符存储到您正在读取的同一位置。
解决方案只需将ES
与DS
一起设置即可:
mov ax, 07C0h
mov ds, ax
mov es, ax
注意:您可能还想明确清除 direction flag在代码中使用字符串指令(例如 LODSB
、STOSB
)之前。您可以使用 CLD
指令来执行此操作。 BIOS 很可能会在移交给引导扇区之前清除方向标志(这就是为什么它在没有 CLD
的情况下为您工作),但为了绝对确定,您应该自己清除该标志。
关于assembly - 从引导加载程序运行时 STOSB 指令不存储字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250752/
怎么才能使用说明rep stosb执行速度比这段代码快? Clear: mov byte [edi],AL ; Write the value in AL to memory
在制作了一个小型引导加载程序来自学汇编语言之后,我注意到 stosb 指令似乎不起作用。我将问题压缩为一个最小的示例: BITS 16 start: mov ax, 07C0h add a
这个问题在这里已经有了答案: Why do I get a segmentation fault when writing to a "char *s" initialized with a str
我是一名优秀的程序员,十分优秀!