Распечатать содержимое регистра 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 в шестнадцатеричном или двоичном формате. Смотреть на это в десятичном виде окажется бессмысленным.

Sep Roland 18.12.2020 19:25

Код, который вы разместили, не имеет ничего общего с вашим вопросом? За исключением того, что я предполагаю, что они оба что-то печатают...

Nate Eldredge 18.12.2020 19:33

Похоже, вы сейчас задаете другой вопрос. Где раньше отображался регистр CR0 в защищенном режиме, теперь вы спрашиваете, как напечатать регистр EAX в 16-битном реальном режиме? Если это так, вам следует задать новый вопрос, поскольку ответ больше не соответствует первоначально заданному вопросу.

Michael Petch 19.12.2020 07:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
821
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Для решения, использующего таблицу поиска, см.:

Как преобразовать двоичное целое число в шестнадцатеричную строку?


Обычно вы записываете эти преобразования в подпрограмму, которую вы можете многократно вызывать для всех видов чисел. Однако, поскольку это код загрузчика, где, возможно, вам нужен только этот один дисплей, текущий подход может быть лучшим (наименьший размер кода).

Он печатает 0000000000000000000010001 Это правильный вывод?

Elliot Alderson 18.12.2020 20:29

@MotherDairy Я считаю 25 цифр!!! Вы должны увидеть 32 символа на экране. По крайней мере, самая правая цифра будет 1, так как вы находитесь в защищенном режиме.

Sep Roland 18.12.2020 20:32

Я уменьшил количество нулей в комментарии. И большое спасибо за помощь

Elliot Alderson 18.12.2020 21:20

Другие вопросы по теме