CPUID

Тема в разделе "WASM.BEGINNERS", создана пользователем Shoorup, 8 сен 2008.

  1. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Как красивей и правильней вывести CPUID в MessageBox?
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3.   option casemap :none
    4.  
    5.       include \masm32\include\windows.inc
    6.       include \masm32\include\user32.inc
    7.       include \masm32\include\kernel32.inc
    8.  
    9.       includelib \masm32\lib\user32.lib
    10.       includelib \masm32\lib\kernel32.lib
    11. .data
    12. cpudb  dd  ?
    13. cpudb2 dd ?
    14. cpudb3 dd ?
    15.  
    16.             DlgTitle  db "CPUID Manufacturer",0
    17.             Msg       db "0",0
    18. .code
    19. start:
    20. CPUID
    21. mov cpudb,ebx
    22. mov cpudb2,edx
    23. mov cpudb3,ecx
    24. ;
    25. ;[b]как правильней засунуть в Msg содержимое ebx,edx,ecx?[/b]
    26. ;
    27.     push MB_OK
    28.     push offset DlgTitle
    29.     push offset Msg
    30.     push 0
    31.     call MessageBox
    32.  
    33.     push 0
    34.     call ExitProcess
    35.    
    36. end start
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Наверное, как нибудь так (сорц и ехе в аттаче)
     
  3. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Mikl___
    Спасибо, то что нужно. Буду разбираться.
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    А это более конкретно для CPUID хотя может быть ТС и хотел чего-то другого (сорц и ехе в аттаче)
     
  5. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    На будующее это и хотелось сделать в качестве учебной тренировки...
    Mikl___ не могу нигде найти про строчки
    Код (Text):
    1. extern _imp__MessageBoxA@16:dword
    2. extern _imp__GetPriorityClass@4:dword
    3. extern _imp__SetPriorityClass@8:dword
    4. extern _imp__GetCurrentProcess@0:dword
    5. extern _imp__GetThreadPriority@4:dword
    6. extern _imp__SetThreadPriority@8:dword
    7. extern _imp__GetCurrentThread@0:dword
    8. extern _imp__Sleep@4:dword
    где можно найти про это почитать?
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Shoorup
    Это чтобы код был короче, я не использую invoke и
    "include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc" подробнее здесь. Если еще более подробно: extern (в tasm возможен вариант "external") объявляется внешняя функция относительно нашей программы _imp__MessageBoxA@16 именно в таком виде название функции MessageBox хранится в user32.lib "@16" после вызова функции очистить стек от 16 байт. По-моему, еще более подробно написано у Пирогова, Юрова и т.д.
     
  7. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Mikl___ а я вот и учусь не балуя себя invokами:) Еще раз спасибо.
    Почему-то сразу не разглядел под нужным углом твою тему "Сам себе Iczelion". Буду штудировать потиху твои уроки.
     
  8. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Вот опять вернулся к старой задачке. Написал теперь вот так:
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3. option casemap: none
    4. include \masm32\include\kernel32.inc
    5. includelib \masm32\lib\kernel32.lib
    6. include \masm32\include\user32.inc
    7. includelib \masm32\lib\user32.lib
    8. .data
    9. Caption db "CPU",0
    10. CPU_Vender label byte
    11. Genu dd ?
    12. ineI dd ?
    13. ntel dd ?
    14. .code
    15. start:
    16. xor eax, eax
    17. CPUID
    18. mov Genu, ebx
    19. mov ineI, edx
    20. mov ntel, ecx
    21. xor eax,eax
    22.  
    23. invoke MessageBox, 0, addr CPU_Vender, addr Caption, 0
    24. invoke ExitProcess, 0
    25. end start
    Но опять понимаю что не красиво и не правильно. Если я в секции данных дам еще одну переменную(в конце), то она выведется следом за CPU Vender. Почему?

    ЗЫ. Mikl___, даже сегодня примеры которые ты выложил сложны для меня и полностью я в них не разобрался.
    Опять детский вопрос: текстовую строку я могу написать как в секции с данными так и в конце секции кода. В каких случаях нужно пользоваться одним и в каком другим способом?
     
  9. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    [...]
    ntel dd ?
    db 0
     
  10. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    CrystalIC
    Спасибо. Почему-то сам так думал, но не решился так сделать:)
    Пока на горшке сидел понял несколько строчек из кода Miklа. А вообще в туалете пора повесить табличку: "Не сиди просто так - ДУМАЙ!" :)
     
  11. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Код (Text):
    1. .data?
    2. mesbox_text db 600h dup(?)
    3. .code
    4. start:  
    5.     xor eax,eax
    6.     cpuid
    7.     mov edi,offset mesbox_text
    8.     mov esi,offset buffer
    9.     mov [esi+11],ebx
    10.     mov [esi+15],edx
    11.     mov [esi+19],ecx
    12.     call StringOut
    Тут не могу понять для чего для заголовка (mov edi,offset mesbox_text) столько места нужно (mesbox_text db 600h dup(?))?
     
  12. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Текст длинный, вот и места много нужно. Тебе (3*4 + 1) байт надо.
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    [offtop]
    :) Могу себе представить, как безмерно был польщён Mikl___.
    [/offtop]
     
  14. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    530
    Адрес:
    Russia
    процы не только интел выпускает
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    [offtop]Спасибо Shoorup, что хотя бы 1 раз в день вспоминаешь обо мне (даже слезу выдавило) :)[/offtop]
     
  16. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Jupiter, знаю что не только интел, просто метки обозвал так чёб понятней было. Можно было и подругому.
    (исправил) Думал что
    Код (Text):
    1. mov edi,offset mesbox_text mov esi,offset buffer
    это заголовок и текст в месбоксе.
    И всё равно откуда (3*4 + 1) ?
     
  17. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    3 регистра по 4 байта плюс завершающий ноль

    Вот выдернул из диплома. Bufer большой, потому что в программе он много где используется много для чего.
    Код (Text):
    1. xor     esi,esi
    2. xor     eax,eax
    3. cpuid
    4. mov     dword[Bufer+512],ebx
    5. mov     dword[Bufer+516],edx
    6. mov     dword[Bufer+520],ecx
    7. mov     dword[Bufer+524],esi
    8. mov     eax,1
    9. cpuid
    10. mov     dword[Bufer],esi
    11. stdcall FormatCPUIDInfo,edx,CPUID_text
    12. stdcall FormatCPUIDInfo,ecx,CPUID_text2
    13. invoke  MessageBox,[Dialog],Bufer,Bufer+512,MB_APPLMODAL  
    14.  
    15. proc FormatCPUIDInfo data,txt
    16. pushad
    17.   mov    edi,[txt]
    18.   mov    esi,31
    19.   mov    ebx,[data]
    20.   testbits:invoke lstrcat,Bufer,edi
    21.            invoke lstrlen,edi
    22.            lea    edi,[edi+eax+2]
    23.            test   bl,1
    24.            sete   al
    25.            movzx  eax,al
    26.            lea    eax,[CPUID_yesno+eax*8]
    27.            invoke lstrcat,Bufer,eax
    28.            movzx  ecx,byte[edi-1]
    29.            rcr    ebx,cl
    30.            sub    esi,ecx
    31.   jne testbits
    32. popad
    33. ret
    34. endp  
    35.  
    36. CPUID_text                      db 'FPU',9,9,0,\
    37.                                    4,\
    38.                                    'RDTSC',9,9,0,\
    39.                                    4,\
    40.                                    'CMPXCHG8',9,0,\
    41.                                    7,\
    42.                                    'CMOVxx',9,9,0,\
    43.                                    8,\
    44.                                    'MMX',9,9,0,\
    45.                                    2,\
    46.                                    'SSE',9,9,0,\
    47.                                    1,\
    48.                                    'SSE2',9,9,0,\
    49.                                    2,\
    50.                                    'HT',9,9,0,\
    51.                                    3
    52. CPUID_text2                     db 'SSE3',9,9,0,\
    53.                                    9,\
    54.                                    'SSSE3',9,9,0,\
    55.                                    4,\
    56.                                    'CMPXCHG16',9,0,\
    57.                                    18
    58. CPUID_yesno                     db ' Äà',13,0,0,0,0,' Íåò',13,0
    59. Bufer                           rb 1024
     
  18. Shoorup

    Shoorup New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    murder спасибо.
    Еще вот хочу ответ на мой вопрос ранее:
     
  19. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Если все данные разместить в секции кода размер exe уменьшится, но скорость может снизиться.
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Shoorup
    Атрибуты секции кода (как правило) -- чтение и исполнение
    Атрибуты секции данных -- чтение и запись.
    Мораль: если данные только читаются -- их можно размещать и в секции кода. Неинициализированные данные размещенные в секции неинициализированных данных в файле не занимают место. Если данные размещены в секции кода и при этом секция кода имеет атрибут запись (в masm'e при компиляции ключ /MERGE:.data=.text), тогда можно разместить данные в секции кода, но программа будет из-за этого выполняться чуть медленнее