real-mode相关内容
physical address=16*selector+offset 但我不知道为什么要用16乘以选择器? 推荐答案 为了与Z80“程序员兼容”,但仍能使用超过64 KiB的内存,早期的英特尔处理器引入了内存分段。在添加到16位偏移量之前,16位段将左移4位(意思是乘以16,不是64),从而得到20位地址。 对于习惯于Z80的程序员来说,所需要的只是使用操作系统提供的段,他们将能
..
我觉得问一些看起来很容易查找的问题很愚蠢,但正如你可能猜到的那样,搜索段落会得到很多与我想知道的无关的结果。 这几天我一直在学习汇编(编写一个很小的引导加载器,诸如此类的练习),我看到了一些对称为段落的内存块的引用。我有一个遥远的记忆,一个段落是两个词,但我真的不确定。究竟什么是段落,它的意义是什么? 推荐答案 一个段落有16个字节。它主要与x86实数模式有关(如果不是唯一的),
..
我正在将 uc/OS-II 从 DOS 移植到 x86(实模式).我需要: 生成实模式 16 位 x86 程序集的编译器 将生成的程序集组装成目标文件的汇编器 将目标文件链接在一起并输出可执行文件(原始二进制文件、COFF、PE 或ELF 格式很好) 一个不调用任何DOS服务的标准库(int 21h),只依赖BIOS服务. 我想知道是否有任何工具链可以做到这一点.
..
我正在尝试在简单的 16 位实模式操作系统中清除屏幕.下面是代码: clearScreen:普沙移动啊,0x7移动, 0整数 0x10波帕ret 我读到将 al 设置为 0 并调用滚动屏幕中断会清理屏幕,但它似乎只是将第一行的颜色更改为灰色. 感谢任何能解释为什么这不起作用的人. 解决方案 问题是 int 0x10 函数 0x07 接受的参数比你给的多.具体来说, AH =
..
在研究一些简单的os源代码时,我对一个简单的汇编问题感到困惑. 在这个网站:http://wiki.osdev.org/Babystep7下面的代码是从实模式切换到保护模式 mov eax, cr0或 al,1mov cr0, eax 我知道如何从实模式切换到保护模式. 但我的问题是,既然程序还在实模式下,怎么能用32位的寄存器或指令呢? 是否可以在实模式下使用 32 位寄存器/
..
我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以是 小于那个. 我的问题是这些段大小和基地址是如何初始化的?就像在保护模式下有 GDT 和 LDT.实模式段也可以重叠,不相交或相邻.就像 BIOS 有一些保留区域用于特定的东西,比如引导代码、视频缓冲区等,汇编程序需要做这样的事情吗? 解决方案 实模式下的段限制是 64k,即使在可以通过前缀使用 32 位地址大小的 386
..
mov al,10添加 al,15 如何打印“al"的值? 解决方案 你试过 int 21h 服务 2?DL 是要打印的字符. mov dl,'A' ;打印“A"移动啊,221 小时 要打印整数值,您必须编写一个循环来将整数分解为单个字符.如果你可以用十六进制打印值,这很简单. 如果您不能依赖 DOS 服务,您也可以使用 BIOS int 10h 将 AL 设置为 0Eh 或
..
我正在尝试学习汇编和编写引导加载程序.以下代码将软盘驱动器的内容加载到内存并跳转到它(从地址 0x1000 开始加载).这段代码应该在屏幕上打印“X",但由于某种原因它打印了一个空格.有人可以告诉我有什么问题吗? [位 16]jmp重置reset: ;重置软盘驱动器xor ax,ax ;0 = 重置软盘mov dl,0 ;驱动器0是软盘整数 0x13jc reset ;如果设置了进位标志,再试一
..
一般问题 我一直在开发一个简单的引导加载程序,并在某些环境中偶然发现了一个问题,在这些环境中,这些指令不起作用: mov si, call_tbl ;SI=调用表指针呼叫 [call_tbl] ;使用近间接绝对调用调用 print_char;通过内存操作数呼叫 [ds:call_tbl] ;使用近间接绝对调用调用 print_char;通过带段覆盖的内存操作数在 [si] 附近打电话;使用
..
我正在阅读有关内存寻址的信息.我阅读了段偏移,然后阅读了描述符偏移.我知道如何在实模式下计算确切地址.所有这些都可以,但我无法理解偏移量到底是什么?我读到的任何地方: 在实模式下,寄存器只有 16 位,所以你只能寻址高达 64k.为了允许寻址更多的内存,地址是由 segment * 16 + offset 计算. 这里我可以理解第一行.我们有 16 位,所以我们最多可以寻址 2^16
..
如何从给定数据中找到段地址? 物理地址 = 0x119B,有效地址 = 0x10AB 公式是什么? 解决方案 x86 16 位实模式中的有效地址只是 20 位 segment:offset 地址.给你的问题是确定一个段值,当与有效地址 0x10AB 结合产生一个物理(线性)地址 0x119B 时. 物理地址可以从 segment:offset 对使用公式 physaddr
..
我正在查找我的 PC 提供的 BIOS 中断列表. 为了获得最常见的 BIOS 调用,有各种公共资源,但我希望能列出我的 PC 的所有(可能不是非常公开的)BIOS 调用. 有没有程序可以做到这一点,或者我可以用任何方式编写一个程序(最好用汇编或 C)? 我的目标是避免 BIOS 反汇编.我也知道 BIOS 的低级 API 相对相似,因此 API 调用列表也相似. 解决方案
..
标题说明问题.但基本上每次我用MOV指令用一个变量来注册寄存器显示CD.但是当我使用实际数字时,寄存器会显示数字? mov ax, @data 是否意味着将数据段内存地址移动到 ax 寄存器并且它是否必须专门为 ax 寄存器.或者,如果我想使用 bx 寄存器中的变量,我可以做一些类似 move mov bx, @data 的事情.请回答 为什么我必须做 mov ds, ax ds 做什
..
我有一种情况,我必须在实模式下跳转到远地址,我在 fs 寄存器中有段值,在 gs 寄存器中有偏移量,并且在跳转我必须保持确切的寄存器内容,我想出了一个想法如下, mov bp, fsshl ebp, 16mov bp, gsjmp ebp 假设 bp、fs 和 gs 没有在被调用的目的地中读取,这是我刚刚在 实模式下的NASM远跳/远调用和ASM代码约定 我可以使用, push fs推gs回
..
是否可以在实模式下启用分页,例如在 BIOS 执行期间.如果启用,在实模式下分页有什么用 解决方案 否,来自 英特尔手册第 3A 卷第 2.5 章 分页(CR0 的第 31 位)——设置时启用分页;清除时禁用分页.当分页是禁用,所有线性地址都被视为物理地址.如果PE标志(位寄存器 CR0) 的 0 也没有设置;当 PE 标志清除时设置 PG 标志会导致一般保护异常(#GP).另请参阅
..
我创建了简单的代码来从硬盘驱动器加载第二个扇区,然后写入整个屏幕,带有红色背景的空格.问题是我总是得到@ 符号而不是空格.这是代码: org 0x7C00位 16异或斧头,斧头mov ds,ax移动,斧头mov bx,0x8000命令行mov ss,bxmov sp,ax性病CLD液晶显示器异或啊,啊整数 0x13mov bx,0x07E0移动 es,bx异或 bx,bxmov ah,0x2 ;
..
我最近编写了一个x86'bootloader'程序,该程序显示BIOS跳转到我的程序后硬件寄存器的值.为了进行测试,我将 AX 寄存器设置为已知值,以确保程序正确运行. BITS 16%宏垫1-2 0倍数%1-($-$$)分贝%2%endmacro[org 0x7C00]CLD;清除方向标志(前进方向)CLI;清除中断标志(禁用中断,与65xx相反)MOV [0x8000],AX;显示所有寄存
..
所以,我一直在从事一个爱好项目.创建我自己的操作系统.我开始前一阵子,但直到几晚之前才放下它.我刚刚修复了一个疏漏,导致从要读取的扇区中未读取任何内容.有了这个错误,就出现了一个新错误,老实说,我什至不知道从哪里开始调试这个错误. 我正在编写一个主引导记录,并使用GDB和QEMU对其进行调试,这是我的主引导记录的代码(它是使用YASM汇编的) 对不起,如果我的代码不是很好.我不是汇编语
..
为什么在下面的代码中我们推入代码段(PUSH CS),然后将其弹出到数据段(POP DS)中? 我将这些行明确地指定为line1和line2.请让我知道MOVSW在这里如何运作. IF HIGHMEMORY PUSH DS MOV BX, DS ADD BX, 10H MOV ES, BX PUSH CS. ;line1 POP DS. ;l
..
我正在编写在加载任何操作系统之前以实模式运行的代码.我的程序的一部分涉及到将信息转储到视频显示器上,而标准的80x25文本模式不能消除这种情况. 许多版本的Windows和其他操作系统在显示内核恐慌时似乎都可以轻松切换到更大的文本模式(我认为是43行).我知道较大的文本模式已经存在了很长时间,所以我希望至少有一种标准模式. 这里有很多BIOS视频模式: http://www.co
..