标签: bios

通过C获取BIOS信息的常用方法

看完一些东西后,似乎我可以映射SMBIOS内存并解析它.我不知道如何解决这个问题.我不能使用任何托管代码,因为我希望在任何操作系统下都可以编译.

有没有人有任何代码示例如何去做?

c bios

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

IRQ编号冲突

来自:http: //software.intel.com/en-us/articles/introduction-to-pc-architecture/

例外号10h对应于"浮点错误",但软件中断10h也对应于"视频支持"BIOS中断(均为实模式).

我错过了什么?

x86 assembly interrupt bios interrupt-handling

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

BIOS喜欢用C++编写的UI

有谁知道如何使用BIOS等用户界面制作程序?像API或其他东西.我已经看到一些商店的软件使用BIOS之类的界面在商店的计算机上检查产品的可用性等.我说的是这样的用户界面:在此输入图像描述

c++ user-interface bios

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

对设置段寄存器感到困惑

我正在编写一个引导加载程序,我正在遵循的教程提供了以下代码:

main:

 ;----------------------------------------------------
 ; code located at 0000:7C00, adjust segment registers
 ;----------------------------------------------------

      cli                       ; disable interrupts
      mov     ax, 0x07C0                ; setup registers to point to our segment
      mov     ds, ax
      mov     es, ax
      mov     fs, ax
      mov     gs, ax

 ;----------------------------------------------------
 ; create stack
 ;----------------------------------------------------

      mov     ax, 0x0000                ; set the stack
      mov     ss, ax
      mov     sp, 0xFFFF
      sti                       ; restore interrupts
Run Code Online (Sandbox Code Playgroud)

我可能误解了一些东西但是如果SS寄存器包含0x0000则不意味着ds,es,fs和gs会重叠堆栈吗?还有fs和gs寄存器的功能是什么?此外,BIOS是否自动设置了cs段?因为它表示代码位于0000:7c00.此外,本教程永远不会解释为什么禁用中断.我在某处读到通常禁用中断以避免死锁.这是什么意思,为什么会发生?

boot x86 assembly bios bootloader

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

如何用java访问bios信息?

是否有可能使用java获取windows 7的bios信息,至少获取cpu信息,时钟速度,核心解锁,风扇速度等的最小信息使用java,因为它是我在C之后很熟悉的唯一编译语言.

java bios windows-7

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

在EFI模式下启动是否意味着我无法访问BIOS中断?

我正在尝试开发一个简单的操作系统.我以前做过一些装配程序,不得不INT 10h用来在屏幕上显示字符.我知道UEFI支持传统BIOS,并且仍然可以使用INT 10h服务.但是,如果我选择构建纯UEFI可引导操作系统,我应该避免使用INT 10h吗?或者我是以错误的方式看事情的?

换句话说,它的向下钻取printfstdout(屏幕)最终调用的BIOS INT 10h?或者是问题 - " SYS_WRITE函数调用基于INT 10h吗?" 更合适?

我是否仍然需要创建一个512字节的引导扇区并将它们作为第0扇区放在磁盘(或磁盘映像)上?该位置是否0x7c00具有重要意义?

boot operating-system bios osdev efi

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

在Nasm中调用汇编函数

我正在从头开始构建一个简单的操作系统,所以我正在测试一些启动扇区代码,我正在使用Qemu进行模拟.

我的启动扇区代码应该在操作系统启动时打印"A".

这是引导扇区代码的第一个版本(没有使用函数调用)

[org 0x7c00]

mov al,'A'
mov ah,0x0e  ; int 10/ ah = 0eh -> scrolling teletype BIOS routine
int 0x10

jmp $

times 510 -( $ - $$ ) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

执行nasm生成的二进制文件后使用:

qemu-system-i386 test.bin
Run Code Online (Sandbox Code Playgroud)

结果是正确的,字符'A'出现在它应该的位置

但是,在尝试使用打印存储在al中的字符的功能后,屏幕上不会打印任何内容

这是test.asm文件的第二个版本(这次包括函数调用)

[org 0x7c00]

mov al,'A'

call my_print_function

jmp $

times 510 -( $ - $$ ) db 0
dw 0xaa55


my_print_function:
    pusha  ; push all registers

    ; same code as the first version to print a character stored in al …
Run Code Online (Sandbox Code Playgroud)

x86 assembly function bios nasm

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

通过bios中断获取字符串

我正在学习汇编,当然我正在尝试经典的0x10 bios中断.我看过的资源显示lodsb用于打印字符串,所以要理解操作码我试图模仿它的行为.这适用于lodsb,但不是我拥有的.我究竟做错了什么?:

start:
    mov ah, 0Eh ;for bios interrupt
    mov si, text_string ;set source index to begining of text_string

.repeat:
    ;I'm trying to emulate the behavior of lodsb to learn how it works:
    mov al, [si] ;put character at si in al register
    add si, 1 ;increment source index

    cmp al, 0 ;if the character is a zero (end of the string)
    je done ;end execution

    int 10h ;bios interrupt to put character on screen
    jmp …

x86 assembly interrupt bios nasm

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

你如何直接与汇编语言的硬件接口?

所以,我决定今年夏天学习80x86的汇编语言.我收集了四本关于装配的书.到目前为止,我已经阅读了前两个,虽然我已经读了第三个,但我认为我理解了所有已呈现的内容.我已经写了一些Hello World程序以及书中的其他一些小练习,我觉得这种语言非常舒服.然而,到目前为止,还有一件事没有涉及到这本书,而且这是我最感兴趣的事情.也就是说,你如何直接从汇编语言处理硬件?到目前为止,作者已经使用了系统调用,跳转到内存中的特定函数和中断,但这些方法依赖于系统中已存在的软件.

我正在使用NASM编写我的程序并将它们加载到旧的Pentium I计算机中.我现在不使用任何操作系统,只是BIOS.我想我正在尝试做的是编写我的小型操作系统,它是自主的,不依赖于BIOS(初始启动除外).谁能帮我?

assembly operating-system bios nasm low-level

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

扩展的ASCII字符在int 10h中不起作用

我有一个简单的操作系统(实模式),用NASM(只有bootloader)编写,大多数用C编写.

我想打印这个字符:ñ,我使用这个函数使用int 10h将字符打印到屏幕:

void putch(char chr)
{
    __asm__ __volatile__ ("int $0x10"
                          :
                          : "a" ((0x0e<<8) | chr),
                            "b" (0x0000));
}

void println(char *str)
{
    while (*str)
        putch(*str++);
}
Run Code Online (Sandbox Code Playgroud)

现在,我尝试打印ñ:

println("ñ\r\n");
Run Code Online (Sandbox Code Playgroud)

但是当我编译并执行时(在qemu和VB框中),字符"ñ"被忽略.我用CP-437编码保存了源代码,但问题仍然存在.这也会影响所有扩展的ASCII字符.

c x86 bios nasm bootloader

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