首页 > 解决方案 > 打印CR0寄存器的内容

问题描述

我正在制作自己的引导加载程序,它切换到保护模式(32 位),然后打印 CR0 寄存器(用于打开保护模式的寄存器)的内容。我需要编写程序集。

    mov esi,hello
    mov ebx,0xb8000
.loop:
    lodsb
    or al,al
    jz halt
    or eax,0x0100
    mov word [ebx], ax
    add ebx,2
    jmp .loop
halt:
    cli
    hlt
hello: db "Hello world!",0

标签: assemblyx86qemubootloaderosdev

解决方案


这将以CR0二进制表示形式显示。它使用与您的问题相同的输出方法:

    mov edx, cr0
    mov ecx, 32          ; 32 bits in a dword
    mov ebx, 000B8000h
.loop:
    mov eax, 00000130h   ; BlueOnBlack "0"
    shl edx, 1           ; Top bit to the carry flag
    adc eax, 0           ; -> AL="0" or AL="1"
    mov [ebx], ax
    add ebx, 2
    dec ecx
    jnz .loop
halt:
    cli
    hlt
    jmp halt

同样的事情,但这次是十六进制表示。再次与您的问题相同的输出方法:

    mov edx, cr0
    mov ecx, 8           ; 8 nibbles (groups of 4 bits) in a dword
    mov ebx, 000B8000h
.loop:
    rol edx, 4
    mov eax, edx
    and eax, 15
    add eax, 00000130h
    cmp al, '9'          ; "0" to "9" are fine
    jbe .ok
    add eax, 7           ; This produces "A" to "F"
.ok:
    mov [ebx], ax
    add ebx, 2
    dec ecx
    jnz .loop
halt:
    cli
    hlt
    jmp halt

有关使用查找表的解决方案,请参见:

如何将二进制整数转换为十六进制字符串?


通常,您会在一个子程序中编写这些转换,您可以为各种数字重复调用该子程序。但是,由于这是引导加载程序代码,您可能只需要这一个显示器,因此当前的方法可能是最好的(最小的代码大小)。


推荐阅读