[ASM] Info o systemie

0

WItam. Mam pewien problem. Musze na zaliczenie napisac program, który wyświetla date, godzine, info o pojemności Hdd, info o myszcze, info o grafice (jaki typ, vga czy inny) oraz info o procesorze. Mam napisany program, ale nie wiem jak zrobić 2 ostatnie rzeczy(grafa i proc). Czy byłby w stanie ktoś mi pomóc?? Tylko proszę o nie odsyłanie do google, szukajki czy kursów online, bo szukałem, ale nic pomocnego nie znalazłem.

To jest kod:

.model tiny

.stack 512



.data

data db "data: $"
czas db 10,13,"godzina: $"

infoa db 10,13, 'Naped A $'
infob db 'Naped B $'

zainst db 'wykryty',10,13, '$'
niezainst db 'niewykryty',10,13, '$'

jedna db "Jest podlaczona jedna stacja dyskow o pojemnosci $"
dwie db "Sa podlaczone dwie stacje dyskow$"
trzy db "Sa podlaczone trzy stacje dyskow$"
cztery db "Sa podlaczone cztery stacje dyskow$"

mb db " MB$"
PojemnoscDysku dw ?
dziesietnie     db 10 dup ('0'), '$' 

jest db 10,13, "Wykryto mysz, $"
niema db 10,13, "Nie wykryto myszy, $"
jed db "inne niz dwa$"
dwu db "dwa przyciski$"
trz db "trzy przyciski$"


.code


start:

mov ax, @data
mov ds, ax
mov dx, offset data
mov ah, 09h
int 21h


mov ah, 2Ah    ;pobieranie daty, pojawia sie w rejestrze cx - rok, dh miesiac, dl dzien miesiaca
int 21h

xor ax, ax
mov al, dl

call liczba

mov al, '.'

call znak


xor ax, ax
mov al, dh


call liczba

mov al, '.'

call znak

mov ax, cx

call liczba



mov ax, @data
mov ds, ax
mov dx, offset czas
mov ah, 09h
int 21h




mov ah, 2ch   ;pobieranie godziny, w rejestrze CH - bierzaca godzina, cl minuta, dh sekunda
int 21h

xor ax, ax
mov al, ch

call liczba

mov al, ':'

call znak

xor ax, ax
mov al, cl

call liczba

mov al, ':'

call znak

xor ax, ax
mov al, dh

call liczba




mov ax, @data
mov ds, ax
mov dx, offset infoa
mov ah, 09h
int 21h

mov al, 10h
out 70h, al
out 0edh, al
in al, 71h

or al, 11110000b

jnz azainst


mov ax, @data
mov ds, ax
mov dx, offset niezainst
mov ah, 09h
int 21h

dalej:

mov ax, @data
mov ds, ax
mov dx, offset infob
mov ah, 09h
int 21h

mov al, 10h
out 70h, al
out 0edh, al
in al, 71h

or al, 00001111b

jnz bzainst

mov ax, @data
mov ds, ax
mov dx, offset niezainst
mov ah, 09h
int 21h




azainst:
mov ax, @data
mov ds, ax
mov dx, offset zainst
mov ah, 09h
int 21h

jmp dalej 

bzainst:

mov ax, @data
mov ds, ax
mov dx, offset niezainst
mov ah, 09h
int 21h



mov al, 14h
out 70h, al
out 0edh, al
in al, 71h

or al, 00000000b

jnz jeden

or al, 10000000b

jnz dwa

or al, 01000010b

jnz tr

or al, 11000011b

jnz czter

koniec:

mov ah,4ch
int 21h

jeden:

mov ax, @data
mov ds, ax
mov dx, offset jedna
mov ah, 09h
int 21h

jmp pojemnosc


dwa:

mov ax, @data
mov ds, ax
mov dx, offset dwie
mov ah, 09h
int 21h

jmp pojemnosc

tr:

mov ax, @data
mov ds, ax
mov dx, offset trzy
mov ah, 09h
int 21h

jmp pojemnosc

czter:

mov ax, @data
mov ds, ax
mov dx, offset cztery
mov ah, 09h
int 21h
jmp pojemnosc

dalej2:


xor	ax, ax			; AX = 0
int	33h			; sprawdzamy, czy jest mysz
or	ax, ax
jnz	mysz_ok
    
 mov ax, @data
 mov ds, ax
 mov dx,offset niema
 mov ah, 09h
 int 21h
    
dalej3:

    xor ax, ax
    int 33h
    cmp bx, 0000h
    je mniej
    cmp bx, 0002h
    je dwad
    cmp bx, 0003h
    je trzy2




mysz_ok:
   mov ax, @data
   mov ds, ax
   mov dx,offset jest
   mov ah, 09h
   int	21h

jmp dalej3

mniej:
mov ax, @data
mov ds, ax
mov dx, offset jed
mov ah, 09h
int 21h
jmp dalej4

dwad:
mov ax, @data
mov ds, ax
mov dx, offset dwu
mov ah, 09h
int 21h
jmp dalej4

trzy2:
mov ax, @data
mov ds, ax
mov dx, offset trz
mov ah, 09h
int 21h

dalej4:
mov ah,4ch
int 21h


liczba:

push ax
push bx
push cx
push dx


mov bl, 10
div bl
mov cl, ah

xor ah, ah

div bl


mov dl, ah

call cyfra

mov dl, cl

call cyfra

pop dx
pop cx
pop bx
pop ax 

ret



cyfra:

push ax
push dx

add dl, '0'
mov ah, 02h
int 21h

pop dx
pop ax

ret

znak:

push ax
push dx

mov dl, al
mov ah, 02h
int 21h 

pop dx
pop ax

ret

jmp pojemnosc

pojemnosc:

mov ax,@data
	mov ds,ax

 mov ah,36h ; funkcja 36h przerwania 21h zwraca parametry
 mov dl,0   ; niezbedne do obliczenia pojemnooci i ilooci
 int 21h    ; wolnego miejsca na dysku

 cmp ax,0FFFFh ; czy parametry odczytane poprawnie?
 jne ParametryDyskuPoprawne
ParametryDyskuPoprawne:

 mov di,dx

 mul cx   ; ax (liczba sektorów) * cx (rozmiar sektora)

mov bx, 1024
div bx

 push ax  ; parametr ax (liczba sektorów * rozmiar sektora)
          ; bedzie jeszcze potrzebny przy wyliczaniu
          ; wolnego miejsca, dlatego odk3adamy go na stos

; Obiczanie pojemnooci dysku.
 mul di   ; pojemnooa = ax (obliczone wczeoniej) * dx
          ; gdzie dx - ca3kowita liczba bloków na dysku


; Zapisanie obliczonej pojemnooci dysku do zmiennej
 mov si,offset PojemnoscDysku
 mov ds:si,ax
 inc si
 inc si
 mov ds:si,dx

 pop ax    ; podniesienie ze stosu od3o?onego wczeoniej
           ; parametru (liczba sektorów * rozmiar sektora)

	

	mov ax,pojemnoscdysku
	call wyp		;; wypisanie wyniku	

pojkoniec:
	mov ah,4ch
	int 21h




wyp     PROC		;; Procedura wypisywania na ekran liczby z AX
        push    ax
        push    bx
        push    cx
        push    dx
        push    di

        mov     cx, 10                  
        mov     di, 10                 
        mov     bx, 9                   
zamiana:                               
        mov     dx, 0                  
        div     di                     
        add     dl, '0'                 
        mov     dziesietnie[bx], dl     
        dec     bx                     
        loop    zamiana

        mov     cx, 9                   
        mov     bx, 0                   
zera:                                   
        cmp     dziesietnie[bx], '0'    
        jne     wypisz                  
        inc     bx                      
        loop    zera

wypisz:                                
        lea     dx, dziesietnie
        add     dx, bx                  
        mov     ah, 09h                 
        int     21h

        mov ax, @data
        mov ds, ax
        mov dx, offset mb
        mov ah, 09h
        int 21h                    

        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax

jmp dalej2       

wyp     ENDP



dkoniec:
endp


end start

Będe wdzięczny za jakąkolwiek pomoc :)

0

Procesor CPUID

0

Nie ma tam nic co by mi pomogło :|

0

"...po bitach 11-4 można rozpoznać nzawę procesora. Poszukaj w internecie tabel dla tego, ja mam dawno nieaktualną..."

=]

0

Myślę, że ten króciutki programik ułatwi Ci sprawę:

.586
.model flat, stdcall
 
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
 
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
 
 
.data
napis	db	"VendorID to: ????????????",0Ah, 0
 
.data?
klawisz	db	?
 
.code
_start:
 
	mov edi, offset napis
	mov eax, 0
	cpuid
	mov [edi + 13], ebx
	mov [edi + 17], ecx
	mov [edi + 21], edx
 
	push offset napis
	call StdOut
 
	push 1
	push offset klawisz
	call StdIn
 
	push 0
	call ExitProcess
end _start

Jak widać napisałem go w MASM32 (czyli WinAPI, zero przerwań) ale przecież chodzi o samo użycie rozkazu CPUID :) Miłej zabawy, btw wykonałeś niezły kawał kodu :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1