Ir para conteúdo
  • Entre para seguir isso  

    Lista de instruções Intel e AMD para fácil "parsing"


    Leandro Fróes

    No final de 2015 o programador Mahdi Safsafi decidiu listar todas as instruções da Intel e da AMD e colocar num repositório no github vários conjuntos de instruções, incluindo SSE5 e 3DNow! Estas  estão listadas em formato XML. Segundo o autor a ideia principal é justamente essa, ter um repositório com uma lista de fácil parsing, ou seja, simples de ser lida por um script ou programa.

     

    A documentação é extremamente simples e de fácil entendimento. Foram usadas algumas notações da própria Intel para indicar, por exemplo, se uma instrução suporta certo modo de operação. Exemplo:

     

    • V - Supported.
    • I - Not supported.
    • N.E- Indicates an instruction syntax is not encodable in 64-bit mode (it may represent part of a sequence of valid instructions in other modes).

     

    Pode ser que essa notícia soe um pouco estranha pra você, que pode se perguntar: Qual seria a utilidade de uma lista parseável de instruções? Um exemplo onde esta lista pode ser útil é num script que pode analisar estes dados e ti prover informações da propria documentação em um piscar de olhos. Para exemplificar isto fiz um código em Python que simplesmente abre o arquivo XML, lê seus campos e imprime seus valores na tela de uma forma -organizada-. Veja:

    import xml.etree.ElementTree as x
    
    tree = x.parse('AZ.xml')
    root = tree.getroot()
    
    for child in root.iter('ins'):
    		attr1 = child.attrib.get('x32m', None)
    		attr2 = child.attrib.get('x64m', None)
    		opc = child.attrib.get('openc', None)
    		m = child.find('mnem').text
    		arg = child.find('args').text
    		dsc = child.find('dscrp').text
    				
    		print '32 bits Mode: ' + format(attr1)
    		print '64 bits Mode: ' + format(attr2)
    		print 'Mnemonic: ' + format(m)
    		print 'Args: ' + format (arg)
    		print 'Openc: ' + format(opc)
    		print 'Description: ' + format(dsc)
    		print '----------------------------'

     

    A saída ficaria mais ou menos assim:

     

    ...
    
    32 bits Mode:V
    64 bits Mode:RVM
    Mnemonic:VPSRLD
    Args:ymm1,ymm2,xmm3/m128
    Openc:None
    Description:Shift doublewords in ymm2 right by amount specified in xmm3/m128 while shifting in 0s.
    ----------------------------
    32 bits Mode:V
    64 bits Mode:VMI
    Mnemonic:VPSRLD
    Args:ymm1,ymm2,imm8
    Openc:None
    Description:Shift doublewords in ymm2 right by imm8 while shifting in 0s.
    ----------------------------
    32 bits Mode:V
    64 bits Mode:RVM
    Mnemonic:VPSRLQ
    Args:ymm1,ymm2,xmm3/m128
    Openc:None
    Description:Shift quadwords in ymm2 right by amount specified in xmm3/m128 while shifting in 0s.
    ----------------------------
    32 bits Mode:V
    64 bits Mode:VMI
    Mnemonic:VPSRLQ
    Args:ymm1,ymm2,imm8
    Openc:None
    Description:Shift quadwords in ymm2 right by imm8 while shifting in 0s.
    ----------------------------
    32 bits Mode:V
    64 bits Mode:V
    Mnemonic:PSUBB
    Args:mm,mm/m64
    Openc:None
    Description:Subtract packed byte integers in mm/m64 from packed byte integers in mm.
    ----------------------------
    32 bits Mode:V
    64 bits Mode:V
    Mnemonic:PSUBB
    Args:xmm1,xmm2/m128
    Openc:None
    Description:Subtract packed byte integers in xmm2/m128 from packed byte integers in xmm1.
    ----------------------------
    32 bits Mode:V
    64 bits Mode:V
    Mnemonic:PSUBW
    Args:mm,mm/m64
    Openc:None
    Description:Subtract packed word integers in mm/m64 from packed word integers in mm.
    ----------------------------
    
    ...

    Isso me lembrou uma ferramenta escrita pelo Fernando chamada bashacks(mais especificamente a função bh_asminfo), onde a ideia é a mesma.

    Infelizmente o projeto que contém esta lista foi descontinuado agora no fim de 2017, mas o autor já foi rápido e iniciou um novo chamado opcodesDB, que pelo visto suporta JSON. Já pensou no tanto de coisas que poderíamos fazer com estes bancos de dados parseáveis? :D

     

     

    Editado por Leandro Fróes

    Entre para seguir isso  


    Feedback do Usuário

    Comentários Recomendados

    Não há comentários para mostrar.



    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Criar uma conta

    Crie uma nova conta em nossa comunidade. É fácil!

    Crie uma nova conta

    Entrar

    Já tem uma conta? Faça o login.

    Entrar Agora


×