gpt4 book ai didi

assembly - 在 VGA 模式下写入视频内存 13h

转载 作者:行者123 更新时间:2023-12-01 23:31:30 25 4
gpt4 key购买 nike

我正在使用 NASM 来学习 x86 汇编,在 linux 上的 qemu 中运行我的代码。
我正在尝试在屏幕上绘制一个像素。

为什么是这样

mov     bx,0xA000 
mov byte [bx],0x0A

似乎什么也没做,但是
mov     bx,0xA000 
mov es,bx
mov byte [es:di],0x0A

能画一个像素吗?

第二个问题:为什么我必须使用 [es:di] 而不仅仅是 [es]?

最佳答案

在实模式下,用于读写的地址由段和偏移量组成,实际读取或写入的地址计算为segment * 16 + offset .

注意:在文档等中;段和偏移量通常是由冒号连接的 2 个数字(如 0x1234:0x5678,其中 0x1234 是段,0x5678 是偏移量)。

对于 0x0000:0xA000,实际地址为 0x0000A000。该地址通常对应于 RAM。

对于 0xA000:0x0000,实际地址为 0x000A0000。这是传统 VGA 显示内存区域所在的位置(当显卡模拟古代 VGA 的 320 * 200 视频模式时使用)。

所有的读取和写入都使用一个段寄存器,如果你没有明确指定一个(例如 mov [es:di],ax),那么 CPU 使用一个默认/隐含的段寄存器,通常是 DS (除非 SPBP 用于地址的偏移部分,这使得 SS 成为默认/隐含的段,或者它的指令获取总是使用 CS )。这意味着 mov [di],axmov [ds:di],ax 相同.

偏移量部分始终是显式的,CPU 不支持(例如)“默认偏移量假定为 0x0000”。这意味着你不能做 mov [es],ax因为没有偏移量(也没有办法对指令进行编码),你必须做类似 mov [es:0x0000],ax 的事情。反而。

关于assembly - 在 VGA 模式下写入视频内存 13h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33644421/

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