【问题标题】:Print the contents of the CR0 register打印CR0寄存器的内容
【发布时间】:2021-03-29 09:32:12
【问题描述】:

我正在制作自己的引导加载程序,它会切换到保护模式(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 的内容。用十进制看它是没有意义的。
  • 您发布的代码与您的问题无关?除了我猜他们都打印了一些东西......
  • 您现在似乎在问一个不同的问题。当它在保护模式下显示 CR0 寄存器时,你现在问如何在 16 位实模式下打印 EAX 寄存器?如果是这样,您应该提出一个新问题,因为答案不再与最初提出的问题相符。

标签: assembly x86 qemu bootloader osdev


【解决方案1】:

这将以二进制表示形式显示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

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

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


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

【讨论】:

  • 正在打印 0000000000000000000010001 这是正确的输出吗?
  • @MotherDairy 我数的是 25 位数!!!您应该在屏幕上看到 32 个字符。因为您处于保护模式,所以最右边的数字至少会是 1
  • 我减少了评论中零的数量。非常感谢您的帮助
  • @MotherDairy 很高兴为您提供帮助!如果您愿意,可以通过单击左侧的复选标记来接受答案。它将为您赢得 12 分。
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 2017-07-30
  • 2020-10-23
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多