标签: bios

asm改变cmd背景颜色

我写了改变文本颜色的部分,但我找不到改变背景颜色的方法,这段代码用于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 assembly dos bios tasm

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

找出在 x86 引导加载程序中引导的驱动器

我正在为 x86 编写游戏引导程序。有一次,在启动初期,我需要将启动驱动器中的一些扇区加载到内存中。我用中断 0x13 (ah=02) 来做到这一点,当我在我的虚拟机中尝试它时,它就像一个魅力。但是,当我将映像刻录到 USB 驱动器时,机器无法启动,我将其固定到扇区加载指令,显然我的 USB 驱动器不是驱动器 0(软盘 A),因此读取失败。

如何确定用于启动的驱动器?

谢谢!

x86 interrupt bios drive bootloader

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

将EFI内存映射转换为E820映射

我是Linux新手并且学习Linux如何了解可用的物理存储器.我知道有一些BIOS系统调用int 0x15,它将为你提供E20内存映射.

现在我找到了一段代码,其中说明了将EFI内存映射转换为E820内存映射的定义.上面的意思是什么?

这是否意味着主板固件是基于EFI的,但由于此代码在x86上运行,我们需要将其转换为E820内存映射

如果是这样,x86是否只知道E820内存映射?

E820和EFI内存映射有什么区别?

期待得到详细的答案.

linux x86 bios bootloader efi

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

在启动时操作系统如何确定所有硬件?

我有这些相关问题:

  1. 有谁知道操作系统如何了解主板上连接的所有硬件?(我想这被称为“硬件枚举”)。

  2. 它如何确定特定 IO 地址上驻留的硬件类型(即:串行或并行或任何控制器)?

  3. 如何编写一个系统模块来完成这项工作?(假设尚未加载操作系统,仅加载 BIOS)。

我知道 BIOS 只是一个验证和一个用户友好的界面,用于在启动时配置硬件,之后对于大多数现代操作系统(win、Linux 等)没有真正的用途。此外,我知道对于 BIOS,找到所有硬件应该不难,因为它是由主板制造商专门调整的(谁知道有关它的一切!)。但对于 BIOS 之上的操作系统或应用程序来说,情况就完全不同了。正确的?

hardware boot operating-system enumeration bios

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

RAM修改会破坏硬件吗?

一个真正的模式程序可以写入任意内存区域,损坏硬件吗?这个场景中不包括中断调用或其他可以在实模式下完成的事情 - 只是纯粹写入内存.

这个页面显示了x86系统的内存映射,我看到了BIOS数据区等内容; 所以我担心写入这个区域可能会对BIOS进行持续更改,或者至少将BIOS设置更改为意外值.可能是更多可以销毁的东西.

我经常读到实模式下的硬件访问会破坏硬件; 但他们没有解释必须要做的情况.

由于我只询问在不调用中断的情况下编写访问权限,我的主要问题是,如果对内存的更改可以进行持久的更改; 如果是的话,哪个以及为什么?

hardware x86 assembly bios hardware-programming

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

引导加载程序未加载第二个扇区

我用汇编写了一个引导加载程序。下面是它的工作原理:

  1. 首先,BIOS 正常加载引导加载程序。指示进入200h。

  2. 在 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)

assembly bios vga bootloader x86-16

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

如何设置定时器

有什么办法可以将计时器设置为 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)

x86 assembly dos bios x86-16

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

如何仅使用 BIOS 中断在程序集引导加载程序中的硬盘驱动器上创建文件?

我写了一个基本的程序集引导程序来清除屏幕并打印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 中断进行文件操作的任何信息。

这可能吗?

assembly bios bootloader

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

侧向滚动终端 (BIOS)

我正在编写一个 bootsector 游戏,它试图复制没有互联网时可以玩的 chrome 恐龙游戏。

为此,我必须从左向右跑,直到玩家击中仙人掌。

我如何实现这一目标?(如何使终端从右向左滚动,使其看起来像是在移动?)因此,我需要从右向左和从左向右滚动,而不是向上和向下滚动。我在 16 位实模式 (BIOS),我使用 nasm/intel 语法。

x86 assembly bios nasm bootloader

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

为什么我的引导加载程序没有将第二个扇区加载到内存中?

我正在尝试将引导加载程序写入插入 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)

assembly floppy bios bootloader x86-16

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