我将通过一些16位实模式的汇编代码示例.
我遇到过这样的问题:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
Run Code Online (Sandbox Code Playgroud)
这是做什么的?"OFFSET"有什么作用?
在8086汇编编程中,我们只能将数据加载到段寄存器中,首先将其加载到通用寄存器中,然后我们必须将它从这个通用寄存器移到段寄存器中.
为什么我们不能直接加载它?有没有被允许的特殊原因?
mov ax,5000H和之间有什么区别mov ax,[5000H]?[5000h]内存位置5000h的含义是什么意思?
我正在编写小型操作系统 - 用于练习.我从bootloader开始.
我想创建一个以16位实模式运行的小命令系统(现在).
我创建了重置驱动器的bootloader,然后在bootloader之后加载扇区.
问题是因为jmp功能后没有任何实际发生.
我不想尝试在0x7E00加载下一个扇区(我不完全确定如何使用es:bx指向地址,这可能是一个问题,我相信它的地址:偏移),就在引导加载程序之后.
这是代码:
;
; SECTOR 0x0
;
;dl is number of harddrive where is bootloader
org 0x7C00
bits 16
;reset hard drive
xor ah,ah
int 0x13
;read sectors
clc
mov bx,0x7E00
mov es,bx
xor bx,bx
mov ah,0x02 ;function
mov al,0x1 ;sectors to read
mov ch,0x0 ;tracks
mov cl,0x1 ;sector
mov dh,0x0 ;head
int 0x13
;if not readed jmp to error
jc error
;jump to 0x7E00 - executed only if loaded
jmp 0x7E00 …Run Code Online (Sandbox Code Playgroud) 我有一个8086 CPU模拟器.它仅模拟8086条指令.我正在寻找一个C编译器来定位这个模拟器.有没有可以做到这一点的C编译器?
此外,拥有一个可用的libc等对我来说并不重要.模拟器使用自定义(即非PC)硬件,因此任何libc甚至ctr0都可能不得不重写
当您将一个字节(例如(0x31)存储到物理线性地址的VGA 文本(模式 03)帧缓冲区中时),在以 16 位传统 BIOS MBR 模式启动的现代 PC 硬件上究竟发生了什么? 将该地区的MTRR设置为 UC的商店有多慢? (在一台 Kaby Lake iGPU 笔记本电脑上的实验测试表明,WC 上的 clflushopt 与 VGA 内存的 UC 速度大致相同。但没有 clflushopt,存储到 WC 内存永远不会离开 CPU 并且根本不更新屏幕,运行速度超快.)'1'B8000mov [es:di], eaxmov
如果它不是每个商店的 SMI,是否有任何方法可以在用户空间中的一块 WB 内存上估算此成本,以进行性能实验而无需实际重新启动到实模式?(例如,使用 BSS 页面作为实际上并不在任何地方显示的假装帧缓冲区)。
相应的字体字形在下一次刷新时出现在屏幕上,但硬件扫描是否真的从 VRAM(或 iGPU 的 DRAM)读取该 ASCII 字符并动态映射到位图字体字形?或者每个存储或每个 vblank 都有一些软件拦截,所以真正的硬件只需要处理位图帧缓冲区?
众所周知,传统 BIOS 引导使用系统管理模式 (SMM)将 USB kbd/鼠标模拟为 PS/2 设备。我想知道它是否也用于 VGA 文本模式帧缓冲区。我认为它是用于VGA的I …
我正在研究一个嵌入式系统项目,并遇到了编译器的问题,该编译器以编程方式嵌入到Paradigm C++ IDE中.我希望能够自动化建设.
处理器是AMD186ES.我没有使用操作系统 - 只是裸机的东西.我需要从C++生成实模式16位8086机器代码.
我的谷歌搜索表明G ++可以构建这样的代码.
我的问题是:
可以配置g ++来构建这个机器代码吗?
还有其他C++编译器可以做到吗?
当我ADC用于exmaple时:
AL = 01 and BL = 02, and CF = 1
Run Code Online (Sandbox Code Playgroud)
当我做这个:
ADC AL,BL
Run Code Online (Sandbox Code Playgroud)
会AL是3或4?(CF加或不加?)
我正在编写实模式函数,它应该是具有堆栈帧的正常函数,但是它应该使用%sp而不是%esp.有办法吗?
我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?
我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从0x1F0到0x1F7.但我想知道PC平台上这么多不同硬件的寄存器地址是否相同?或者我必须在使用之前检测到它?如何检测它们?
由于我不确定如何在保护模式下使用R/W软盘或硬盘,我现在必须使用BIOS中断将所有必要的内核文件从软盘加载到内存中.但是,如果我的内核文件超过实际模式1M空间限制,我该怎么办?
对于任何回复,我表示深深的感谢.
我依旧回忆起有一种方法可以先切换保护模式然后切换回实模式.然后我们可以在保护模式下使用BIOS例程.也许我记得错了.有人记得吗?
在关于 .COM 文件的维基百科页面https://en.wikipedia.org/wiki/COM_file 上,它写道:
DOS 中的 .COM 文件将所有 x86 段寄存器设置为相同的值,并将 SP(堆栈指针)寄存器设置为 0xFFFE,因此堆栈从内存段的最顶部开始并从那里开始工作。
但这实际上将堆栈设置为在段顶部下方开始一个单词。当将一个值压入堆栈时,CPU 会将 SP 递减到 0xFFFC 并将该值存储在那里,从而浪费了段的顶部字。DOS 没有将 SP 设置为 0 的原因是什么?