Как красивей и правильней вывести CPUID в MessageBox? Код (Text): .586 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data cpudb dd ? cpudb2 dd ? cpudb3 dd ? DlgTitle db "CPUID Manufacturer",0 Msg db "0",0 .code start: CPUID mov cpudb,ebx mov cpudb2,edx mov cpudb3,ecx ; ;[b]как правильней засунуть в Msg содержимое ebx,edx,ecx?[/b] ; push MB_OK push offset DlgTitle push offset Msg push 0 call MessageBox push 0 call ExitProcess end start
На будующее это и хотелось сделать в качестве учебной тренировки... Mikl___ не могу нигде найти про строчки Код (Text): extern _imp__MessageBoxA@16:dword extern _imp__GetPriorityClass@4:dword extern _imp__SetPriorityClass@8:dword extern _imp__GetCurrentProcess@0:dword extern _imp__GetThreadPriority@4:dword extern _imp__SetThreadPriority@8:dword extern _imp__GetCurrentThread@0:dword extern _imp__Sleep@4:dword где можно найти про это почитать?
Shoorup Это чтобы код был короче, я не использую invoke и "include \masm32\include\user32.inc include \masm32\include\kernel32.inc" подробнее здесь. Если еще более подробно: extern (в tasm возможен вариант "external") объявляется внешняя функция относительно нашей программы _imp__MessageBoxA@16 именно в таком виде название функции MessageBox хранится в user32.lib "@16" после вызова функции очистить стек от 16 байт. По-моему, еще более подробно написано у Пирогова, Юрова и т.д.
Mikl___ а я вот и учусь не балуя себя invokами Еще раз спасибо. Почему-то сразу не разглядел под нужным углом твою тему "Сам себе Iczelion". Буду штудировать потиху твои уроки.
Вот опять вернулся к старой задачке. Написал теперь вот так: Код (Text): .586 .model flat, stdcall option casemap: none include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib .data Caption db "CPU",0 CPU_Vender label byte Genu dd ? ineI dd ? ntel dd ? .code start: xor eax, eax CPUID mov Genu, ebx mov ineI, edx mov ntel, ecx xor eax,eax invoke MessageBox, 0, addr CPU_Vender, addr Caption, 0 invoke ExitProcess, 0 end start Но опять понимаю что не красиво и не правильно. Если я в секции данных дам еще одну переменную(в конце), то она выведется следом за CPU Vender. Почему? ЗЫ. Mikl___, даже сегодня примеры которые ты выложил сложны для меня и полностью я в них не разобрался. Опять детский вопрос: текстовую строку я могу написать как в секции с данными так и в конце секции кода. В каких случаях нужно пользоваться одним и в каком другим способом?
CrystalIC Спасибо. Почему-то сам так думал, но не решился так сделать Пока на горшке сидел понял несколько строчек из кода Miklа. А вообще в туалете пора повесить табличку: "Не сиди просто так - ДУМАЙ!"
Код (Text): .data? mesbox_text db 600h dup(?) .code start: xor eax,eax cpuid mov edi,offset mesbox_text mov esi,offset buffer mov [esi+11],ebx mov [esi+15],edx mov [esi+19],ecx call StringOut Тут не могу понять для чего для заголовка (mov edi,offset mesbox_text) столько места нужно (mesbox_text db 600h dup(?))?
[offtop]Спасибо Shoorup, что хотя бы 1 раз в день вспоминаешь обо мне (даже слезу выдавило) [/offtop]
Jupiter, знаю что не только интел, просто метки обозвал так чёб понятней было. Можно было и подругому. (исправил) Думал что Код (Text): mov edi,offset mesbox_text mov esi,offset buffer это заголовок и текст в месбоксе. И всё равно откуда (3*4 + 1) ?
3 регистра по 4 байта плюс завершающий ноль Вот выдернул из диплома. Bufer большой, потому что в программе он много где используется много для чего. Код (Text): xor esi,esi xor eax,eax cpuid mov dword[Bufer+512],ebx mov dword[Bufer+516],edx mov dword[Bufer+520],ecx mov dword[Bufer+524],esi mov eax,1 cpuid mov dword[Bufer],esi stdcall FormatCPUIDInfo,edx,CPUID_text stdcall FormatCPUIDInfo,ecx,CPUID_text2 invoke MessageBox,[Dialog],Bufer,Bufer+512,MB_APPLMODAL proc FormatCPUIDInfo data,txt pushad mov edi,[txt] mov esi,31 mov ebx,[data] testbits:invoke lstrcat,Bufer,edi invoke lstrlen,edi lea edi,[edi+eax+2] test bl,1 sete al movzx eax,al lea eax,[CPUID_yesno+eax*8] invoke lstrcat,Bufer,eax movzx ecx,byte[edi-1] rcr ebx,cl sub esi,ecx jne testbits popad ret endp CPUID_text db 'FPU',9,9,0,\ 4,\ 'RDTSC',9,9,0,\ 4,\ 'CMPXCHG8',9,0,\ 7,\ 'CMOVxx',9,9,0,\ 8,\ 'MMX',9,9,0,\ 2,\ 'SSE',9,9,0,\ 1,\ 'SSE2',9,9,0,\ 2,\ 'HT',9,9,0,\ 3 CPUID_text2 db 'SSE3',9,9,0,\ 9,\ 'SSSE3',9,9,0,\ 4,\ 'CMPXCHG16',9,0,\ 18 CPUID_yesno db ' Äà',13,0,0,0,0,' Íåò',13,0 Bufer rb 1024
Shoorup Атрибуты секции кода (как правило) -- чтение и исполнение Атрибуты секции данных -- чтение и запись. Мораль: если данные только читаются -- их можно размещать и в секции кода. Неинициализированные данные размещенные в секции неинициализированных данных в файле не занимают место. Если данные размещены в секции кода и при этом секция кода имеет атрибут запись (в masm'e при компиляции ключ /MERGE:.data=.text), тогда можно разместить данные в секции кода, но программа будет из-за этого выполняться чуть медленнее