打印 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

解决方法

这将以二进制表示形式显示 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,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],2
    dec ecx
    jnz .loop
halt:
    cli
    hlt
    jmp halt

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

How to convert a binary integer number to a hex string?


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