sanya84
@sanya84
Фанатик Python 3

Как получить информацию о процессоре в biose FASM?

Привет всем любителям!
Я создаю программу для загрузки с флешки через BIOS.
Нашёл такой
Пример

proc    GetCPUString lpBuff:DWORD, dFixString:DWORD
        pusha
 
        ; Указатель на строку-приемник
        mov     esi,[lpBuff]
        mov     edi,esi
        cld
 
        ; Прочитать информацию о процессоре
        mov     eax,80000002h
@@:
        push    eax
        cpuid
        stosd
        xchg    eax,ebx
        stosd
        xchg    eax,ecx
        stosd
        xchg    eax,edx
        stosd
        pop     eax
        inc     eax
        cmp     eax,80000004h
        jbe     @b
 
        ; Привести строку к формату ASCIIZ
        xor     eax,eax 
        stosb
 
        ; Нужно ли чистить строку?
        cmp     [dFixString],0
        je      .loc_ret
 
        ; Почистить строку от лишних и неправильных символов
        mov     edi,esi
@@:
        ; Убрать лидирующие пробелы, если они есть
        cmp     byte [esi],' '
        jne     @f
        inc     esi
        jmp     @b
@@:
        xor     ebx,ebx
.loc_clean_string:
        lodsb
 
        cmp     al,' '
        jnz     @f
 
        ; Убрать повторяющиеся пробелы
        cmp     bl,1
        je      .loc_clean_string
 
        ; Установить флажок, что начались пробелы
        mov     bl,1
        jmp     .loc_store_char
@@:
        ; Сбросить флажок пробелов
        mov     bl,0
 
        ; Преобразовать символы "(R)" в один
        cmp     al,'('
        jne     @f
        cmp     word [esi],'R)'
        jne     @f
 
        ; ESI + 2
        lodsw
        ; Символ (R)
        mov     al,0AEh
        jmp     .loc_store_char
@@:
        ; Преобразовать символы "(TM)" в один
        cmp     dword [esi-1],'(TM)'
        je      @f
        ; Написание может быть различным
        cmp     dword [esi-1],'(tm)'
        jne     .loc_store_char
@@:
        ; ESI + 3
        lodsw
        lodsb
        ; Символ (TM)
        mov     al,099h
 
.loc_store_char:
        ; Записать символ в строку
        stosb
        ; Конец строки достигнут?
        or      al,al
        jnz     .loc_clean_string
 
        ; Удалить финальный пробел если есть
        cmp     byte [edi-1],' '
        jne     .loc_ret
        mov     byte [edi-1],0
 
.loc_ret:
        popa
        ret
endp



Но он похоже не для FASM да и без комментариев.
Прошу сердечно адаптировать его под FASM конкретно для BIOS.
Пожалуйста прокомментируйте каждую строчку.
Само ядро готово, желательно оформить код в виде функции.
Вот что у меня есть на данный момент

;FASM###########################################################################################################################################################################
org 7c00h               ;BIOS производит чтение 512 байт первого сектора MBR в ОЗУ по адресу 0x00007C00
                        ;(0x07C0:0x0000 в формате реального режима), затем прочитанному коду передаётся управление
;Точка входа###############################################################################################################################################################
start:
        cli             ;запрещаем прерывания
        xor ax,ax       ;обнуляем регистр ах
        mov ds,ax       ;настраиваем сегмент данных на нулевой адрес
        mov es,ax       ;настраиваем сегмент es на нулевой адрес
        mov ss,ax       ;настраиваем сегмент стека на нулевой адрес
        mov sp,07C00h   ;сегмент sp указывает на текущую вершину стека
        sti             ;разрешаем прерывания

;Настройка экрана###############################################################################################################################################################
        mov ax, 03h     ;
        int 10h         ;прерывания 10h
;Основная программа#############################################################################################################################################################
        call user_print_title ;call вызов функции
        mov ax, 1301h   ;функция 13h прерывания 10h
        int 10h

        call user_print_author
        mov ax, 1301h   ;функция 13h прерывания 10h
        int 10h

        call user_print_continue
        mov ax, 1301h   ;функция 13h прерывания 10h
        int 10h

        call user_print_cpu_info
        mov ax, 1301h   ;функция 13h прерывания 10h
        int 10h



        jmp $

;Подпрограммы###################################################################################################################################################################
user_print_cpu_info:
        ; указатель на строку
        mov     esi, cpu_info
        mov     edi,esi
        cld
 
        ; прочитать информацию о процессоре
        mov     eax, 80000002h
        push    eax
        stosd
        xchg    eax,ebx
        stosd
        xchg    eax,ecx
        stosd
        xchg    eax,edx
        stosd
        pop     eax
        inc     eax
        cmp     eax,80000004h

        ;настройка печати
        mov cx, 24        ;cx количество выводимых символов
        mov bx, 50h       ;bx 0 цвет фона, 9 цвет текста
        mov dx, 0100h     ;dx кординаты где вставить курсор y=00, x=00
        mov bp, cpu_info  ;bp вывод строки
        ret

user_print_title:
        mov cx, 26      ;cx количество выводимых символов
        mov bx, 09h     ;bx 0 цвет фона, 9 цвет текста
        mov dx, 0019h   ;dx кординаты где вставить курсор y=00, x=00
        mov bp, title   ;bp вывод строки
        ret
;*******************************************************************************************************************************************************************************
user_print_author:
        mov cx, 24      ;cx количество выводимых символов
        mov bx, 50h     ;bx 0 цвет фона, 9 цвет текста
        mov dx, 1738h   ;dx кординаты где вставить курсор y=00, x=00
        mov bp, author  ;bp вывод строки
        ret
 ;*********************************************************************************************************************************************************************
 user_print_continue:
        mov cx, 26      ;cx количество выводимых символов
        mov bx, 06h     ;bx 0 цвет фона, 9 цвет текста
        mov dx, 1700h   ;dx кординаты где вставить курсор y=00, x=00
        mov bp, continue  ;bp вывод строки
        ret

title db '<<<Hardware information>>>', 0
continue db 'Press Enter to continue...', 0
cpu_info db 100, "$"

times(512-2-($-07C00h)) db 0 ;остатки пространства заполнить нолями
db 055h,0AAh                 ;сигнатура, символизирующая о завершении загрузочного сектора
  • Вопрос задан
  • 171 просмотр
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Я создаю программу

"Разрабатываю", создатель ты наш.

Прошу сердечно адаптировать его под FASM конкретно для BIOS.
Пожалуйста прокомментируйте каждую строчку.

Почему бы тебе не сделать это самому, а мы почитаем и скажем, правильно ли ты всё понял или где накосячил?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы