Я делаю свой собственный загрузчик, который переключается в защищенный режим (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 в защищенном режиме, теперь вы спрашиваете, как напечатать регистр EAX в 16-битном реальном режиме? Если это так, вам следует задать новый вопрос, поскольку ответ больше не соответствует первоначально заданному вопросу.
Это покажет 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
Для решения, использующего таблицу поиска, см.:
Как преобразовать двоичное целое число в шестнадцатеричную строку?
Обычно вы записываете эти преобразования в подпрограмму, которую вы можете многократно вызывать для всех видов чисел. Однако, поскольку это код загрузчика, где, возможно, вам нужен только этот один дисплей, текущий подход может быть лучшим (наименьший размер кода).
Он печатает 0000000000000000000010001 Это правильный вывод?
@MotherDairy Я считаю 25 цифр!!! Вы должны увидеть 32 символа на экране. По крайней мере, самая правая цифра будет 1, так как вы находитесь в защищенном режиме.
Я уменьшил количество нулей в комментарии. И большое спасибо за помощь
Вы захотите распечатать содержимое CR0 в шестнадцатеричном или двоичном формате. Смотреть на это в десятичном виде окажется бессмысленным.