• Inicio
  • Buscar
  • Ingresar
  • Registrarse

    ¿Sabes el motivo de que fallen tanto algunas impresoras Epson?

    • Hack x Crack - Comunidad de Seguridad informática »
    • Programación »
    • ASM »
    • La instrucción CPUID en x86
    • Imprimir
    Páginas: [1]   Ir Abajo

    Autor Tema: La instrucción CPUID en x86  (Leído 5682 veces)

    Desconectado tryger

    • Moderador
    • { L2 } Nativo Digital
    • **
    • Mensajes: 118
      • Ver Perfil
    La instrucción CPUID en x86
    « en: Junio 17, 2014, 09:54:06 pm »
    hola a todos,
    acabo de pasar por esta sección y la he visto un poco solitaria, así que he decidido escribir sobre una istrucción de la arquitectura x86, CPUID, que aprendí hace unas semanas y con la que he estado jugando ultimamente. Se trata de una instrucción que basicamente lo que hace es retornar información sobre el procesador. Esta fue introducida por Intel en 1993 con el Pentium y el opcode es 0A20Fh.

    El funcionamiento es bastante simple, asignas a EAX (algunas veces complementado con ECX) contienen el tipo de info que quieres que el procesador retorne seguido de CPUID. En el siguiente code obtenemos un string de 12 bytes que representa al fabricante del CPU. Para ello EAX debe contener el valor 0 y el valor es retornado en EBX, EDX y ECX en ese orden. En el caso de Intel la string es "GenuineIntel".
    Código: [Seleccionar]
    section .bss
    vend: resb 12

    section .text
    global _start

    _start:
    mov eax, 0
    cpuid

    mov [vend], ebx
    mov [vend + 4], edx
    mov [vend + 8], ecx

    call print

    mov eax, 1
    int 0x80

    print:
    mov eax, 4
    mov ebx, 1
    mov ecx, vend
    mov edx, 12
    int 0x80
    ret

    El code está escrito para Linux, así que si queréis compilar en güindous os buscais la vida para imprimir el valor en pantalla xD

    He escrito otro code de ejemplo en el que el CPU nos da una string de 48 bytes sobre el modelo del CPU.  Esto se efectua mediante 3 llamadas a CPUID (con valor en EAX de 0x80000002, 0x80000003 y 0x80000004 en ese orden):
    Código: [Seleccionar]
    section .bss
    brand: resb 48

    section .text
    global _start

    _start:
    mov esi, 0x80000001
    mov edi, brand

    loop:
    inc esi

    mov eax, esi
    cpuid

    mov [edi], eax
    mov [edi + 4], ebx
    mov [edi + 8], ecx
    mov [edi + 12], edx

    add edi, 16

    cmp esi, 0x80000004
    jnz loop

    call print

    mov eax, 1
    int 0x80


    print:
    mov edx, 48
    mov ecx, brand
    mov ebx, 1
    mov eax, 4
    int 0x80
    ret

    va sin comentar, así tenéis que darle al coco (no mucho) para entender el funcionamiento.

    Para compilar y ejecutar el code:
    Código: [Seleccionar]
    nasm -f elf64 source.S
    ld -o compilado source.o
    ./compilado

    Más info en la pag de la wikipedia: https://en.wikipedia.org/wiki/CPUID
    En línea

    Desconectado dbbeltran

    • { L0 } Ñuub
    • Mensajes: 4
      • Ver Perfil
    Re:La instrucción CPUID en x86
    « Respuesta #1 en: Septiembre 25, 2014, 06:43:43 am »
    Gracias

    lo probe y me funciono :) , lo analizare con mas detalle .

    buen aporte saludos ;)
    En línea

    • Imprimir
    Páginas: [1]   Ir Arriba
    • Hack x Crack - Comunidad de Seguridad informática »
    • Programación »
    • ASM »
    • La instrucción CPUID en x86
     

    • SMF | SMF © 2013, Simple Machines
    • XHTML
    • RSS
    • WAP2
    Va un mudo y le dice a un sordo: Hack x Crack usa cookies. Pues eso... Learn more