Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
SlowD
1 / 1 / 0
Регистрация: 13.10.2010
Сообщений: 23
1

Определение типа микропроцессора.

13.02.2011, 23:05. Просмотров 2473. Ответов 1
Метки нет (Все метки)

Алгоритм определения типа микропроцессора основывается на раз-
личиях в регистрах флагов (РгФ) микропроцессоров (МП) 8086, 80286 и
80386 и состоит в следующем:
В регистр флагов записывается 0. Если четыре старших разряда
РгФ устанавливаются в 1 - это МП 8086. Если нет, то в регистр флага
записывается код F000H. Если после этого 4 старшие разряда РгФ ос-
таются в 0, то это МП 80286, в противном случае - 80386.

нужно сделать вставку в паскаль
как сие реализовать???

Добавлено через 1 час 9 минут
вобщем нарыл то что нужно, но оно под делфи, помогите перепилить под паскаль

http://sizov.boom.ru/cputype.htm

Добавлено через 33 секунды
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
unit CpuId;
 
interface
 
type
{ Типы процессоров}
TCpuType = (cpu8086, cpu80286, cpu386, cpu486, cpuPentium);
 
{ Тип данного процессора }
function CpuType: TCpuType;
 
{ Описание типа процессора }
function CpuTypeString: String;
 
implementation
 
uses SysUtils;
 
function CpuType: TCpuType; assembler;
asm
 
push DS
 
{ Сначала проверим на наличие процессора 8086                     }
{ Биты 12-15 регистра FLAGS всегда установлены на процессоре 8086 }
 
pushf                         { сохраним EFLAGS в стек               }
pop        bx                 { сохраним EFLAGS в BX                 }
mov        ax,0fffh           { очистим биты 12-15                   }
and        ax,bx              { регистра EFLAGS                      }
push       ax                 { сохраним в стек новый регистр EFLAGS }
popf                          { заменим текущий регистр EFLAGS       }
pushf                         { поместим новый EFLAGS в стек         }
pop        ax                 { сохраним новый EFLAGS в AX           }
and        ax,0f000h          { если биты 12-15 установлены, значит  }
cmp        ax,0f000h          { процессор - 8086/8088                }
mov        ax, cpu8086        { включим флаг 8086/8088               }
je         @@End_CpuType
 
{ Проверка на процессор 80286              }
{ Биты 12-15 регистра FLAGS всегда очищены }
{ на процессоре 80286                      }
 
or        bx,0f000h            { попробуем установить биты 12-15 }
push      bx
popf
pushf
pop       ax
and       ax,0f000h         { если биты 12-15 очищены, то CPU=80286 }
mov       ax, cpu80286      { установить флаг процессора 80286      }
jz        @@End_CpuType
 
{ Для проверки на 386 или более современный, нам нужно использовать 32 
битные инструкции, но 16 битный ассемблер в Object Pascal не понимает
32 битные коды операций и операнды. Поэтому, мы будем использовать
код 66H, который переводит 16 битную команду в аналогичную 32 битную. }
 
{ Проверка на i386 CPU                                        }
{ Бит AC , бит #18, это новый бит введенный в регистре EFLAGS }
{ на процессорах i486 DX для генерирования ошибок.            }
{ Но этот бит не работает на i386 CPU.                        }
 
db 66h             { pushfd }
pushf
 
db 66h             { pop eax }
pop    ax          { получить EFLAGS }
 
db 66h             { mov ecx, eax }
mov    cx,ax       { сохранить EFLAGS }
 
db 66h             { xor eax,40000h }
xor    ax,0h       { очистить бит AC в EFLAGS }
dw 0004h
 
db 66h             { push eax }
push   ax          { сохранить EFLAGS }
 
db 66h             { popfd }
popf               { копировать в EFLAGS }
 
db 66h             { pushfd }
pushf              { push EFLAGS }
 
db 66h             { pop eax }
pop    ax          { получить EFLAGS }
 
db 66h             { xor eax,ecx }
xor    ax,cx       { бит AC не установлен, CPU=Intel386 }
 
mov ax, cpu386     { turn on 386 flag }
je @@End_CpuType
 
 
 
{ Проверка на i486 DX CPU / i487 SX MCP and i486 SX CPU    }
{ Проверка флага ID (бит 21) в регистре EFLAGS             }
{ который сообщает, что процессор поддерживает инструкцию  }
{ определиния типа CPUID }
 
db 66h                 { pushfd }
pushf                  { поместить в стек EFLAGS }
db 66h                 { pop eax }
pop    ax              { сохранить EFLAGS в eax }
db 66h                 { mov ecx, eax }
mov    cx,ax           { сохранить EFLAGS в ecx }
db 66h                 { xor eax,200000h }
xor    ax,0h           { установить бит ID в EFLAGS }
dw 0020h
db 66h                 { push eax }
push   ax              { сохранить для EFLAGS }
db 66h                 { popfd }
popf                   { скопировать в EFLAGS }
db 66h                 { pushfd }
pushf                  { поместить в стек EFLAGS }
db 66h                 { pop eax }
pop    ax              { получить новое значение EFLAGS }
db 66h                 { xor eax, ecx }
xor ax, cx
mov ax, cpu486         { установить флаг i486 }
je @@End_CpuType       
{ Если бит ID не изменился, то CPU=486, но без инструкции CPUID }
 
 
{ Выполнить инструкцию CPUID для определения производителя, семейства,}
{ модели и степпинга. Инструкция CPUID поддерживается процессором P5  }
{ и выше }
 
db 66h                   { mov eax, 1 }
    mov ax, 1            { подготовка к вызову CPUID }
dw 0
db 66h                   { cpuid }
    db    0Fh            { Код операции для CPUID }
    db    0a2h
db 66h                   { and eax, 0F00H }
    and ax, 0F00H        { выделяем семейство }
dw 0
db 66h                   { shr eax, 8 }
    shr ax, 8            { смещаем тип процессора }
sub ax, 1                { вычесть 1 }
 
@@End_CpuType:
pop ds
 
end;
 
 
function CpuTypeString: String;
 
var
 kind: TCpuType;
begin
 kind := CpuType;
 case kind of
  cpu8086:
   Result := '8086';
  cpu80286:
   Result := '80286';
  cpu386:
   Result := '386';
  cpu486:
   Result := '486';
  cpuPentium:
   Result := 'Pentium';
 else
{ Поддержка будущих моделей }
  Result := Format('P%d', [Ord(kind)]);
 
 end;
end;
 
end.
Добавлено через 1 час 15 минут
Цитата Сообщение от SlowD Посмотреть сообщение
shr ax, 8 { смещаем тип процессора
на сдвиг ругаеться
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2011, 23:05
Ответы с готовыми решениями:

Определение типа параметра в макросе
Нужно определить - является ли параметр макроса константой. Как это можно...

Очередь команд микропроцессора
У меня в билете попался вот такой вопрос как на него отвечать я как понял что...

Введение в архитектуру микропроцессора
с какой литературы начать знакомство с устройством микропроцессора? на...

Использование арифметических команд микропроцессора (fasm)
Здравствуйте, есть у меня вот такое задание: Задание: Вычислить заданное...

Программирование микропроцессора KP580BM80A.Обработка массивов.Программа на assemblere
Помогите, пожалуйста, разработать программу нахождения максимума в массиве....

1
Mikl___
Автор FAQ
13301 / 6373 / 629
Регистрация: 11.11.2010
Сообщений: 11,534
14.02.2011, 04:22 2
SlowD, если не указывать тип процессора для которого предназначена программа, ассемблер считает, что программа для intel 8086, для этого микропроцессора команды сдвига либо на 1 разряд, либо число сдвига равно содержимому регистра CL. Поэтому у тебя несколько решений:
1) перед push ds вставь строчку .286 и тогда будет работать команда shr ax, 8
2) замени shr ax, 8 на mov cl,8 / shr ax,cl
3) замени shr ax, 8 на shr ax,1/shr ax,1/shr ax,1/shr ax,1/shr ax,1/shr ax,1/shr ax,1/shr ax,1
4) замени shr ax, 8 на mov al,ah / mov ah,0
5) замени shr ax, 8 на db 0C1h, 0E8h, 8 (код команды shr ax, 8)
кстати можно указать .586 и тогда не нужно вводить команды CPUID и pushfd в кодах команд, а указывать напрямую -- командами
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 04:22

Оцените программу пересылки данных разными способами (для микропроцессора 8086)
Оцените программу пересылки данных разными способами ( для микропроцессора...

Что такое регистры микропроцессора? Перечислите регистры общего назначения
Помогите пожалуйста решить задания по TASM 1) Что такое регистры...

Определение типа микропроцессора
Дан такой алгоритм: Алгоритм определения типа микропроцессора основывается на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru