我写了改变文本颜色的部分,但我找不到改变背景颜色的方法,这段代码用于tasm汇编:
model small
stack 256
.data
ent db 0ah,0dh,'$'
array db 2,4,5,6
db 7,8,9,5
db 1,2,3,4
db 5,6,7,8
temp dw 0
.code
main :
mov ax,@data
mov ds,ax
mov ah, 06h
mov al, 0
mov cx, 0
mov dh, 79
mov dl, 79
mov bh, 4h
int 10h
Run Code Online (Sandbox Code Playgroud)
这是我的代码,但它不起作用:
mov ah, 0bh
mov bh, 01h
mov bl, 2h
int 10h
mov ah, 02h
mov dl, 34h
int 21h
mov ax,4c00h ; exit from program
int 21h
end main
Run Code Online (Sandbox Code Playgroud) 我正在为 x86 编写游戏引导程序。有一次,在启动初期,我需要将启动驱动器中的一些扇区加载到内存中。我用中断 0x13 (ah=02) 来做到这一点,当我在我的虚拟机中尝试它时,它就像一个魅力。但是,当我将映像刻录到 USB 驱动器时,机器无法启动,我将其固定到扇区加载指令,显然我的 USB 驱动器不是驱动器 0(软盘 A),因此读取失败。
如何确定用于启动的驱动器?
谢谢!
我是Linux新手并且学习Linux如何了解可用的物理存储器.我知道有一些BIOS系统调用int 0x15,它将为你提供E20内存映射.
现在我找到了一段代码,其中说明了将EFI内存映射转换为E820内存映射的定义.上面的意思是什么?
这是否意味着主板固件是基于EFI的,但由于此代码在x86上运行,我们需要将其转换为E820内存映射
如果是这样,x86是否只知道E820内存映射?
E820和EFI内存映射有什么区别?
期待得到详细的答案.
我有这些相关问题:
有谁知道操作系统如何了解主板上连接的所有硬件?(我想这被称为“硬件枚举”)。
它如何确定特定 IO 地址上驻留的硬件类型(即:串行或并行或任何控制器)?
如何编写一个系统模块来完成这项工作?(假设尚未加载操作系统,仅加载 BIOS)。
我知道 BIOS 只是一个验证和一个用户友好的界面,用于在启动时配置硬件,之后对于大多数现代操作系统(win、Linux 等)没有真正的用途。此外,我知道对于 BIOS,找到所有硬件应该不难,因为它是由主板制造商专门调整的(谁知道有关它的一切!)。但对于 BIOS 之上的操作系统或应用程序来说,情况就完全不同了。正确的?
一个真正的模式程序可以写入任意内存区域,损坏硬件吗?这个场景中不包括中断调用或其他可以在实模式下完成的事情 - 只是纯粹写入内存.
这个页面显示了x86系统的内存映射,我看到了BIOS数据区等内容; 所以我担心写入这个区域可能会对BIOS进行持续更改,或者至少将BIOS设置更改为意外值.可能是更多可以销毁的东西.
我经常读到实模式下的硬件访问会破坏硬件; 但他们没有解释必须要做的情况.
由于我只询问在不调用中断的情况下编写访问权限,我的主要问题是,如果对内存的更改可以进行持久的更改; 如果是的话,哪个以及为什么?
我用汇编写了一个引导加载程序。下面是它的工作原理:
首先,BIOS 正常加载引导加载程序。指示进入200h。
在 200h 处,有一些代码位于 200h 和 21Eh 之间。它只是切换到 VGA 模式,使用 VGA 功能在坐标 1,1 上绘制一个洋红色像素。它永远循环该代码。
然而,当我加载它时,它只是在闪烁的光标上移动,这是普通的 VGA .bin 文件不会做的,并且会显示一个像素。我检查了一个像素,但什么也没看到。我看到的意思是 VGA 代码没有运行,引导加载程序只是加载了,没有别的。
引导加载程序代码:
cli
startload:
push 0x00000200
ret
times 510-($-$$) db 0
db 0x55
db 0xAA
Run Code Online (Sandbox Code Playgroud)
您可以看到它只是转到下一个扇区(从 200h 开始)和 200h-21Eh 处的代码:
BITS 16
org 200h
data:
xcoord DB '1'
ycoord DB '1'
color DB 'D'
.code:
vga:
mov ax, 13h
int 10h
mov ax, ycoord
mov bx, xcoord
mov cx, 320
mul cx
add ax, bx
mov di, ax
mov …Run Code Online (Sandbox Code Playgroud) 有什么办法可以将计时器设置为 60 秒 xor ah,ah
Enter_Again:
xor ah, ah ; I should put 60 seconds here
int 16h ; The user should press S before 60 seconds
mov bl,al
cmp al,"S"
Run Code Online (Sandbox Code Playgroud) 我写了一个基本的程序集引导程序来清除屏幕并打印X:
[BITS 16]
[ORG 0x7c00]
main:
mov ax, 0x03
int 10h
mov ah, 0x0E
mov al, 'X'
int 10h
jmp $
times 510 - ($-$$) db 0
DW 0xAA55
Run Code Online (Sandbox Code Playgroud)
现在我需要做的是在硬盘上创建一个文件。我知道我可以使用以下代码通过 DOS 中断轻松完成:
outputfile db "myfile.txt"
outhandle db ?
mov dx, offset outputfile
mov cx, 0
mov ah, 3Ch
int 21h
mov outhandle, ax
Run Code Online (Sandbox Code Playgroud)
但是我没有找到有关使用 BIOS 中断进行文件操作的任何信息。
这可能吗?
我正在编写一个 bootsector 游戏,它试图复制没有互联网时可以玩的 chrome 恐龙游戏。
为此,我必须从左向右跑,直到玩家击中仙人掌。
我如何实现这一目标?(如何使终端从右向左滚动,使其看起来像是在移动?)因此,我需要从右向左和从左向右滚动,而不是向上和向下滚动。我在 16 位实模式 (BIOS),我使用 nasm/intel 语法。
我正在尝试将引导加载程序写入插入 VirtualBox VM 的虚拟软盘驱动器。这是我拥有的以下代码:
org 0x7c00 ; We are loaded by BIOS at 0x7C00
bits 16 ; We are still in 16 bit Real Mode
Start: jmp loader
loader:
.Reset:
mov ah, 0x0 ; reset floppy disk function
mov dl, 0x0 ; drive 0 is floppy drive
int 0x13 ; call BIOS
jc .Reset ; If Carry Flag (CF) is set, there was an error. Try resetting again
.Load:
mov ax, 0x07e0 ; we are going to read sector to …Run Code Online (Sandbox Code Playgroud)