BasicOS - A Minimal Operating System - Day3

BasicOS - A Minimal Operating System

添加内存检查功能 (check_memory)

调用 int 0x12 获取低 640 KB 的内存大小。
显示一个提示字符串,如 "Available memory: "。
使用 print_number 子程序打印内存大小(单位为 KB)。
打印数值功能 (print_number)

将内存大小从二进制转换为十进制 ASCII 字符。
通过循环提取每一位数并打印到屏幕。
提示信息

添加了提示字符串,提示用户当前内存状态。

[BITS 16]           ; 16位实模式
[ORG 0x7C00]        ; BIOS加载引导所在的内存地址是0x7C00

start:
    mov si, msg      ; 将字符串地址加载到 SI 寄存器
    call print_string ; 调用打印字符串的子程序

    call check_memory ; 调用内存检查子程序

hang:
    hlt              ; 停机,等待中断
    jmp hang         ; 死循环,保持程序运行状态

; 打印字符串的子程序
; SI: 指向要打印的字符串
print_string:
    mov ah, 0x0E     ; BIOS 功能号:在屏幕上显示字符
.next_char:
    lodsb            ; 从内存中取出当前字符(由 SI 指向)并加载到 AL 寄存器
    cmp al, 0        ; 判断当前字符是否为字符串结束符
    je .done         ; 如果 AL=0(字符串结束符),跳转到完成
    int 0x10         ; 调用 BIOS 中断打印字符
    jmp .next_char   ; 打印下一个字符
.done:
    ret              ; 返回主程序

; 内存检查子程序
check_memory:
    mov ah, 0x0E     ; BIOS 功能号:在屏幕上显示字符
    mov si, mem_msg  ; 加载内存信息提示字符串
    call print_string ; 打印提示字符串

    int 0x12         ; 调用 BIOS 中断,获取低 640KB 内存大小
    mov bx, ax       ; 将内存大小保存到 BX 寄存器中(单位是 KB)

    ; 将 BX 的值转换为 ASCII 并显示
    call print_number ; 打印数值

    ret

; 打印数值子程序
print_number:
    xor cx, cx       ; 清空 CX 寄存器,用于计数
.next_digit:
    xor dx, dx       ; 清空 DX,防止之前的值干扰
    div word [div_10] ; AX = AX / 10,余数在 DX 中,商在 AX 中
    push dx          ; 将余数压栈
    inc cx           ; 计数加 1
    test ax, ax      ; 判断 AX 是否为 0
    jnz .next_digit  ; 如果不是 0,则继续

.print_loop:
    pop dx           ; 弹出余数
    add dl, '0'      ; 转换为 ASCII
    mov al, dl       ; 加载字符到 AL
    int 0x10         ; 调用 BIOS 中断打印字符
    loop .print_loop ; 循环打印

    ret

msg db "Hello, Bootloader!", 0            ; 引导提示信息
mem_msg db "Available memory: ", 0        ; 内存提示信息
div_10 dw 10                              ; 除数,用于数值转换

times 510 - ($ - $$) db 0 ; 填充至510字节
dw 0xAA55                 ; 引导所在标志

编译

nasm -f bin boot.asm -o boot.bin

创建磁盘映像

创建一个 1.44MB 的空磁盘映像:

dd if=/dev/zero of=floppy.img bs=512 count=2880

将引导扇区写入磁盘映像:

dd if=boot.bin of=floppy.img bs=512 count=1 conv=notrunc

测试引导扇区

qemu-system-x86_64 -fda floppy.img

你应该能看到屏幕打印出 Hello, Bootloader!,第二行打印 Available memory: xxx KB,然后程序进入死循环。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容