问题标签 [x86-emulation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 如何在 X86 程序集中制作库?
如何使用自己的功能在 X86 汇编 Intel 中制作自己的库。我目前正在使用 invine.inc 库,对此并不精通
c - 使用 Qemu 进行裸机 X86 组装
你能帮我理解使用 Qemu 加载 bin 时的引导流程吗?如果我们考虑一个简单的程序,例如将 ascii 写入 VGA 内存,那么当我们调用时,bin 会加载到哪里
根据我的理解,找到具有魔术模式 0xAA55 的有效引导扇区的 bios 将该扇区加载到 0x7c00。Qemu 是否真的将 bin 复制到 HDA 的这个引导扇区中?
我在许多教程中看到,使用 0x7c00 作为加载地址配置的链接描述文件用于生成精灵。然而,这个精灵被转换为一个 bin 并传递给 qemu。那么,真的需要 0x7c00 的加载地址吗?它可以是链接描述文件中的任何其他值吗?
assembly - 运行 32 位 DOS 应用程序时出现 NTVDM 系统错误 4001h
我使用 GNU 汇编器将ArithmeticExpressionCompiler中的 32 位模拟时钟从 Linux 交叉编译到 DOS。当在 QEMU 或 VirtualBox 中的 FreeDOS 下运行时(它们是比 NTVDM 好得多的模拟器,对吗?),它会创建这样的画面:
我希望它也可以在 Windows 10 上运行。但是,当我尝试在 Windows 10 上运行它时,我得到这个错误:
这甚至意味着什么?我的程序不是 16 位的,而是 32 位的,那么为什么某些 16 位子系统甚至在运行呢?“错误 4001h”是什么意思?Windows 应该能够运行 32 位 DOS 程序,对吧?
这是我的程序的源代码,如果有点长,很抱歉,但我不知道是什么导致了这个错误(我对系统编程的了解很少):
此ZIP 存档中提供了可执行文件。
x86 - x86 MOVSB:SI/DI 从 FFFF 递增到 0000 或从 0000 递减到 FFFF
8086 仿真器是否应该测试这种 SI/DI 环绕,还是它很少使用以至于无需检查就可以通过?
我只关心字符串指令中实际使用的 SI/DI 的新环绕值。
assembly - 8086 instructions which ignore Trap Flag when set
When the 8086 Trap Flag (TF) is set, a type 1 interrupt is generated automatically after nearly every instruction. I'm looking for a full list of the exceptions for an 8086/8088 emulator. Have I missed any from the list below or written anything that is wrong?
- REPxx, LOCK and code segment prefixes
- MOV to segment and POP segment register
- IRET and POPF if TF set after Flags popped but reset before
Notes
- No interrupts of any kind recognized immediately after a prefix
- Restricted to MOV SS,xxxx and POP SS on later processors
- Single-stepping begins at end of the next instruction
x86 - 操作码 1 中的 8086 d 位:更常见的值是 0 还是 1?
对于相当多的 8086 指令,操作码 1 的位 1 是方向位 d(不要与 DF 标志混淆),允许两种方式对同一指令进行编码。
由于空间限制,我正在编写的仿真器可以解码 d=0 或 d=1 但不能同时解码 'from' 和 'to'。d 的未解码值通过交换 'from' 和 'to' 来处理,使其变慢。
DOS 是否特别使用 d=0 而不是 d=1,反之亦然?
go - 如何使用 Golang 程序运行 Gem5 系统仿真
我正在尝试使用从 Golang 程序编译的二进制文件运行 Gem5 系统仿真。我正在使用 X86 O3CPU 和经典内存。但是,我必须在 3 个 CPU 上启动相同的进程才能设置系统仿真。否则我会收到错误:无法创建新的操作系统线程。我尝试将 GOMAXPROCS 设置为 1 或 MAXTHREADS 设置为 1。它们都没有解决这个问题。
但即使我用 3 个 cpu 运行二进制文件。我仍然可能会收到错误:
wirep:p->m=824633877504(2) p->status=1 致命错误:wirep:无效 p 状态
经过几个小时的模拟。有人有使用 Golang 运行 Gem5 的经验吗?
assembly - DOSbox 中的 x86 程序集“无法加载程序”
我正在创建我的第一个 x86 汇编程序。我使用 VS Code 作为我的编辑器,并使用 Insight 作为我的调试器,并使用 DOSBox 作为我的模拟器。
首先,我创建了一个.asm
程序来更改屏幕的颜色:
当我尝试将此.asm
文件转换为.o
文件时,DOSBox 返回一个错误,指出它无法加载该文件。我究竟做错了什么?
assembly - 如何使用 qemu 引导我的引导扇区文件?
我正在对(非常基本的)操作系统开发进行一些实验,以便自学一些有关机器语言和 x86 汇编的知识。
我的系统上安装了 lib-virt / qemu。(Debian 11)
但是我正在努力寻找一种方便的方法来引导我的输出文件。
我已经使用nasm bootsector.asm -f bin -o bootsector.bin
.
最初我尝试运行此命令:
但是我得到了错误command not found
。我相信这是因为(无论出于何种原因,我并不确切知道)我的包管理器提供的命令实际上是这样的:
但是这会产生这个输出,这不是我所期望的
我本来希望会弹出一个图形窗口,显示模拟启动过程的输出。然而,显然相反,正在启动 VNC 服务器。
一些在线搜索表明-display sdl
或-display gtk
可能需要启动显示。(但是我不记得几年前的 qemu 版本中需要这样做。)
这些开关都不起作用,都打印
我找不到解决方案。我相信 Debian 的 qemu 软件包不是用 gtk 或 sdl 支持构建的。我不知道这是为什么。
virt-manager
因此我尝试了另一种方法,即使用我的引导扇区创建一个虚拟机并将其分配为单个存储设备。
这有效,但只有一次。启动 vm 后,引导扇区文件的所有权和组更改为libvirt
. 这样可以防止我的 makefile 覆盖它,因为它是一个写保护文件。
在这一点上,我没有想法。我认为一定有相当数量的 SO 用户在玩操作系统开发,甚至全职从事这方面的工作。我该如何解决我在使用 qemu 时遇到的问题,或者我还能做些什么来加快我的开发过程。我想做的就是能够从命令行启动模拟器并启动我的实验引导扇区。
assembly - 如何在 x8086 程序集中同时为多个像素着色?
我在具有 VGA 模式和 8 位固定 RGBA 像素格式的 Windows 10 上使用 emu8086,学习图形和 ASM 的基础知识只是为了好玩。我找到了一种一次绘制一个像素的方法,如下面的代码所示:
我想编写一个 ASM 程序,它可以同时绘制多个像素,而不是从一个像素到另一个像素循环,让它看起来像一条轨迹。我一直在 SO 和网络的其他部分试图找到实现目标的基本代码,但找不到任何东西。这里接受的答案似乎是最接近答案的东西,尽管我不清楚我是否真的需要像额外的段这样的东西以及像推送和弹出这样的技术来访问和写入多个像素地址。不仅如此,我尝试了答案中的代码,汇编器告诉我BITS是一条非法指令,并且里面的参数mov [es:di],dx
是错误的。
[编辑:] 这个问题来自于满足创建具有低分辨率的类似 2D 游戏的演示的目标的想法,就像精灵和背景位于同一平面层上的板一样简单。