标签: x86-16

16位汇编代码中的OFFSET是什么意思?

我将通过一些16位实模式的汇编代码示例.

我遇到过这样的问题:

    mov    bx, cs
    mov    ds, bx
    mov    si, OFFSET value1
    pop    es
    mov    di, OFFSET value2
Run Code Online (Sandbox Code Playgroud)

这是做什么的?"OFFSET"有什么作用?

x86 assembly masm 16-bit x86-16

16
推荐指数
2
解决办法
7万
查看次数

8086-为什么我们不能将立即数据移入段寄存器?

在8086汇编编程中,我们只能将数据加载到段寄存器中,首先将其加载到通用寄存器中,然后我们必须将它从这个通用寄存器移到段寄存器中.

为什么我们不能直接加载它?有没有被允许的特殊原因?

mov ax,5000H和之间有什么区别mov ax,[5000H][5000h]内存位置5000h的含义是什么意思?

x86 assembly instruction-set cpu-registers x86-16

16
推荐指数
2
解决办法
2万
查看次数

引导加载程序不会跳转到内核代码

我正在编写小型操作系统 - 用于练习.我从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)

assembly virtualbox nasm bootloader x86-16

15
推荐指数
1
解决办法
4475
查看次数

是否有针对8086的C编译器?

我有一个8086 CPU模拟器.它仅模拟8086条指令.我正在寻找一个C编译器来定位这个模拟器.有没有可以做到这一点的C编译器?

此外,拥有一个可用的libc等对我来说并不重要.模拟器使用自定义(即非PC)硬件,因此任何libc甚至ctr0都可能不得不重写

c compiler-construction x86 x86-16

14
推荐指数
2
解决办法
8796
查看次数

现代 PC 视频硬件是否支持硬件中的 VGA 文本模式,或者 BIOS 是否模拟它(使用系统管理模式)?

当您将一个字节(例如(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 …

performance assembly bios vga x86-16

13
推荐指数
2
解决办法
1199
查看次数

寻找16位x86编译器

我正在研究一个嵌入式系统项目,并遇到了编译器的问题,该编译器以编程方式嵌入到Paradigm C++ IDE中.我希望能够自动化建设.

处理器是AMD186ES.我没有使用操作系统 - 只是裸机的东西.我需要从C++生成实模式16位8086机器代码.

我的谷歌搜索表明G ++可以构建这样的代码.

我的问题是:

可以配置g ++来构建这个机器代码吗?

还有其他C++编译器可以做到吗?

c++ compiler-construction embedded x86-16

12
推荐指数
6
解决办法
1万
查看次数

ASM 8086中的ADC指令

当我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)

AL34?(CF加或不加?)

assembly machine-instruction x86-16

11
推荐指数
3
解决办法
3万
查看次数

如何告诉GCC为实模式生成16位代码

我正在编写实模式函数,它应该是具有堆栈帧的正常函数,但是它应该使用%sp而不是%esp.有办法吗?

c assembly gcc inline-assembly x86-16

11
推荐指数
4
解决办法
9011
查看次数

实模式BIOS例程和保护模式

我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?

我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从0x1F0到0x1F7.但我想知道PC平台上这么多不同硬件的寄存器地址是否相同?或者我必须在使用之前检测到它?如何检测它们?

由于我不确定如何在保护模式下使用R/W软盘或硬盘,我现在必须使用BIOS中断将所有必要的内核文件从软盘加载到内存中.但是,如果我的内核文件超过实际模式1M空间限制,我该怎么办?

对于任何回复,我表示深深的感谢.

更新

我依旧回忆起有一种方法可以先切换保护模式然后切换回实模式.然后我们可以在保护模式下使用BIOS例程.也许我记得错了.有人记得吗?

x86 assembly operating-system protected-mode x86-16

10
推荐指数
2
解决办法
4312
查看次数

为什么 DOS 在加载 .COM 文件后将 SP 寄存器设置为 0xFFFE?

在关于 .COM 文件的维基百科页面https://en.wikipedia.org/wiki/COM_file 上,它写道:

DOS 中的 .COM 文件将所有 x86 段寄存器设置为相同的值,并将 SP(堆栈指针)寄存器设置为 0xFFFE,因此堆栈从内存段的最顶部开始并从那里开始工作。

但这实际上将堆栈设置为在段顶部下方开始一个单词。当将一个值压入堆栈时,CPU 会将 SP 递减到 0xFFFC 并将该值存储在那里,从而浪费了段的顶部字。DOS 没有将 SP 设置为 0 的原因是什么?

x86 assembly callstack dos x86-16

10
推荐指数
1
解决办法
525
查看次数