assembly - 打印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, 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
有关使用查找表的解决方案,请参见:
通常,您会在一个子程序中编写这些转换,您可以为各种数字重复调用该子程序。但是,由于这是引导加载程序代码,您可能只需要这一个显示器,因此当前的方法可能是最好的(最小的代码大小)。
推荐阅读
- featuretools - 如何修复错误功能工具包安装python
- php - 一行 3 个帖子,然后下一行有 2 个帖子,依此类推
- javascript - 由于模式框未显示,我无法编辑产品详细信息
- javascript - 谷歌图表视图窗口模式显式
- php - 不工作 .htaccess 文件
- php - PHP如果计数,第一篇文章不进入行
- c# - Linq 实体框架
- python - Jupyter - 从另一个分区打开文件
- swift - 为什么 Swift 库使用“enum CommandLine”而不是“struct CommandLine”?
- javascript - 将矩范围导入 Angular 4.x 应用程序(ES6) - 没有兼容的调用签名错误?