Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Array char -> String [D7, XP]


Б ©   (2009-12-11 09:42:00) 

Здрасти!

Как сделать присваивание Buffer Name? (array char -> string)


Var
 Name: string;
 Buffer: array [0..11] of Char;
begin  


clickmaker   (2009-12-11 13:19:00) [1]

это команда x86 совместимых процессоров, для определения самих себя
собственно A20F - это ее код
в совсем уж старых процах ее нет


Б   (2009-12-11 13:16:00) [2]


> Нет нужды в DW, когда можно просто CPUID


Если честно, то я ничего не понял. ;)
Я Асм не "понимать".


Anatoly Podgoretsky   (2009-12-11 12:21:00) [3]

> Б  (11.12.2009 10:03:06)  [6]

Нет нужды в DW, когда можно просто CPUID


Б   (2009-12-11 10:37:00) [4]

Спасибо. ;)


Сергей М.   (2009-12-11 10:34:00) [5]

Вот заточенная под String:
function CPUVendor: String;
asm
 MOV  EDX, 12
 CALL System.@LStrSetLength
 PUSH EBX               // Save affected register.
 PUSH EDI
 MOV  EDI, [EAX]         // @Result (String).
 MOV  EAX,  0
 DW   $A20F             // CPUID Command.
 MOV  EAX,  EBX
 XCHG EBX,  ECX         // Save ECX result.
 MOV  ECX,  4
@1:  STOSB
 SHR   EAX, 8
 LOOP  @1
 MOV   EAX, EDX
 MOV   ECX, 4
@2:  STOSB
 SHR   EAX, 8
 LOOP  @2
 MOV   EAX, EBX
 MOV   ECX, 4
@3:  STOSB
 SHR   EAX, 8
 LOOP  @3
 POP   EDI         // Restore registers.
 POP   EBX
end;


Б   (2009-12-11 10:03:00) [6]

Это я обётки сморганил. ;)



// Определяет производителя CPU.
Function XCPUVendor: string;
Type
 TVendor = array [0..11] of Char;

 Function CPUVendor: TVendor; assembler; register;
 Asm
   PUSH EBX               // Save affected register.
   PUSH EDI
   MOV  EDI,  EAX         // @Result (TVendor).
   MOV  EAX,  0
   DW   $A20F             // CPUID Command.
   MOV  EAX,  EBX
   XCHG EBX,  ECX         // Save ECX result.
   MOV  ECX,  4

   @1:  STOSB
        SHR   EAX, 8
        LOOP  @1
        MOV   EAX, EDX
        MOV   ECX, 4
   @2:  STOSB
        SHR   EAX, 8
        LOOP  @2
        MOV   EAX, EBX
        MOV   ECX, 4
   @3:  STOSB
        SHR   EAX, 8
        LOOP  @3
        POP   EDI         // Restore registers.
        POP   EBX
 End;

begin
 Result:= CPUVendor;
End;


Б   (2009-12-11 10:02:00) [7]

DRKB:



type

TVendor = array[0..11] of char;

.........................

function GetCPUVendor: TVendor; assembler; register;

asm

PUSH EBX {Save affected register}

PUSH EDI

MOV EDI,EAX {@Result (TVendor)}

MOV EAX,0

DW $A20F {CPUID Command}

MOV EAX,EBX

XCHG EBX,ECX {save ECX result}

MOV ECX,4

@1:

STOSB

SHR EAX,8

LOOP @1

MOV EAX,EDX

MOV ECX,4

@2:

STOSB

SHR EAX,8

LOOP @2

MOV EAX,EBX

MOV ECX,4

@3:

STOSB

SHR EAX,8

LOOP @3

POP EDI {Restore registers}

POP EBX

end;


Сергей М.   (2009-12-11 09:58:00) [8]

Приведи полный текст этой ф-ции ..


Б   (2009-12-11 09:56:00) [9]


> Зачем это надо - плодить одни и те же данные, но в разных
> ипостасях ?


Да это пример в DRKB такой.
Там функция определяет вендор CPU на Асме, возвращает TVendor = array [0..11] of Char. Ну т.к. Асм я не знаю, (чтобы заменить) то пришлось сделать обёртку под String.


Б   (2009-12-11 09:46:00) [10]

Вопрос закрыт.


Сергей М.   (2009-12-11 09:46:00) [11]

Зачем это надо - плодить одни и те же данные, но в разных ипостасях ?

К данным, которые хранит тип string, можно преспокойно обращаться как к массиву символов.


Наверх

Титульная страница Поиск, карта сайта Написать письмо