Witam.
Od paru dni siedzę nad takim problemem któreg nie mogę pojąć. Bawię się poleceniem cpuid w assemblerze z arugmentem eax=1.
I powinno to zwrócić w rejestrze eax wartość decymalną steppingu , modelu itp. Potem tą wartość konwertuje na binarną i mam gotowy wynik. Tylko z tym to sobie poradzę. A problem jest w tej wartości decymalnej. Dlaczeg program assemblerowy zwraca inną wartość niż w C++
Oto mój kod w assemblerze w składni masm.
.model small
.586
.data
tym dd ?
tablica dd 26 dup(?)
.stack 100h
.code
.startup
mov eax,1
cpuid
mov tym,eax ;kopiuje zawartość rejestru eax
push ds
pop es
lea di,tablica ;kopiuje zawartość zmiennej tym do 26 elementowej tablicy
lea si,tym
mov cx,26
cld
rep movsb
mov bx,0
mov cx,26
petla:
mov edx,tablica[bx]
add dl,dh ;Dodaję niższy i wyższy stan żeby uzyskać zawartość 16 bitową rejestru dx
add dl,'0'
mov ah,02h
int 21h
inc bx
loop petla
.exit
end
I wynikiem tego programu jest:
Przeszukałem dużo stron o tym poleceniu itp i znalazłem stronę która mi to wytłumaczyła w składni C++.
Oto ten program w C++:
#include<iostream>
using namespace std;
int binaryNum[26];
int a[4];
void decTobin(int n)
{
int i=0;
while(n>0)
{
binaryNum[i]=n%2;
n=n/2;
i++;
}
}
int main()
{
__asm__("mov $0x1 , %eax\n\t");
__asm__("cpuid\n\t");
__asm__("mov %%eax, %0\n\t":"=r" (a[0])); //gives model and family
__asm__("mov %%ebx, %0\n\t":"=r" (a[1])); //gives additional feature info
__asm__("mov %%ecx, %0\n\t":"=r" (a[2])); //feature flags
__asm__("mov %%edx, %0\n\t":"=r" (a[3])); //feature flags
cout<<"Wartosc A[0]: "<<a[0]<<endl;
decTobin(a[0]);
cout<<"Stepping ID: "<<binaryNum[3]<<binaryNum[2]<<binaryNum[1]<<binaryNum[0]<<endl;
cout<<"Model: "<<binaryNum[7]<<binaryNum[6]<<binaryNum[5]<<binaryNum[4]<<endl;
cout<<"Family ID: "<<binaryNum[11]<<binaryNum[10]<<binaryNum[9]<<binaryNum[8]<<endl;
cout<<"Procesor Type: "<<binaryNum[13]<<binaryNum[12]<<endl;
}
I wynik tego programu jest taki:
Dlaczego te dwie wartości są różne. Zweryfikowałem dane wyjściowe i program w C++ jest prawidłowy i wszystkie dane się zgadzają. Był bardzo zadowolony gdyby ktoś pomógł rozwiązać problem lub chociaż wskazać drogę oraz wytłumaczyć co jest źle.
Jak coś C++ znam. Assemblera znam na poziomie podstawowym i dalej się roziwjam czytając książki i pisząc programy.
Bardzo dziękuję za pomoc i życzę miłego dnia.