A
A
Alexander2020-04-15 20:24:01
assembler
Alexander, 2020-04-15 20:24:01

How to get cpu info in biose FASM?

Hello to all lovers!
I am creating a program to boot from a flash drive via BIOS.
Found this

Example

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



But it does not seem to be for FASM, and even without comments.
Please cordially adapt it to FASM specifically for the BIOS.
Please comment on each line.
The core itself is ready, it is desirable to arrange the code as a function.
Here is what I have at the moment

;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
author db 'Author: Lynnik Aleksandr', 0
continue db 'Press Enter to continue...', 0
cpu_info db 100, "$"

times(512-2-($-07C00h)) db 0 ;остатки пространства заполнить нолями
db 055h,0AAh                 ;сигнатура, символизирующая о завершении загрузочного сектора

Answer the question

In order to leave comments, you need to log in

1 answer(s)
J
jcmvbkbc, 2020-04-15
@jcmvbkbc

I am creating a program

"I develop", you are our creator.
Please cordially adapt it to FASM specifically for the BIOS.
Please comment on each line.

Why don't you do it yourself, and we will read it and tell you if you understood everything correctly or where you messed up?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question