看完一些东西后,似乎我可以映射SMBIOS内存并解析它.我不知道如何解决这个问题.我不能使用任何托管代码,因为我希望在任何操作系统下都可以编译.
有没有人有任何代码示例如何去做?
来自:http: //software.intel.com/en-us/articles/introduction-to-pc-architecture/
例外号10h对应于"浮点错误",但软件中断10h也对应于"视频支持"BIOS中断(均为实模式).
我错过了什么?
有谁知道如何使用BIOS等用户界面制作程序?像API或其他东西.我已经看到一些商店的软件使用BIOS之类的界面在商店的计算机上检查产品的可用性等.我说的是这样的用户界面:
我正在编写一个引导加载程序,我正在遵循的教程提供了以下代码:
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.此外,本教程永远不会解释为什么禁用中断.我在某处读到通常禁用中断以避免死锁.这是什么意思,为什么会发生?
是否有可能使用java获取windows 7的bios信息,至少获取cpu信息,时钟速度,核心解锁,风扇速度等的最小信息使用java,因为它是我在C之后很熟悉的唯一编译语言.
我正在尝试开发一个简单的操作系统.我以前做过一些装配程序,不得不INT 10h用来在屏幕上显示字符.我知道UEFI支持传统BIOS,并且仍然可以使用INT 10h服务.但是,如果我选择构建纯UEFI可引导操作系统,我应该避免使用INT 10h吗?或者我是以错误的方式看事情的?
换句话说,它的向下钻取printf到stdout(屏幕)最终调用的BIOS INT 10h?或者是问题 - " SYS_WRITE函数调用基于INT 10h吗?" 更合适?
我是否仍然需要创建一个512字节的引导扇区并将它们作为第0扇区放在磁盘(或磁盘映像)上?该位置是否0x7c00具有重要意义?
我正在从头开始构建一个简单的操作系统,所以我正在测试一些启动扇区代码,我正在使用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) 我正在学习汇编,当然我正在尝试经典的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 … 所以,我决定今年夏天学习80x86的汇编语言.我收集了四本关于装配的书.到目前为止,我已经阅读了前两个,虽然我已经读了第三个,但我认为我理解了所有已呈现的内容.我已经写了一些Hello World程序以及书中的其他一些小练习,我觉得这种语言非常舒服.然而,到目前为止,还有一件事没有涉及到这本书,而且这是我最感兴趣的事情.也就是说,你如何直接从汇编语言处理硬件?到目前为止,作者已经使用了系统调用,跳转到内存中的特定函数和中断,但这些方法依赖于系统中已存在的软件.
我正在使用NASM编写我的程序并将它们加载到旧的Pentium I计算机中.我现在不使用任何操作系统,只是BIOS.我想我正在尝试做的是编写我的小型操作系统,它是自主的,不依赖于BIOS(初始启动除外).谁能帮我?
我有一个简单的操作系统(实模式),用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字符.