Friday 20 October 2017

0X100 in binary option


Este documento apresenta o cuobjdump. Nvdisasm. E nvprune. Três ferramentas binárias CUDA para Linux (x86 e ARM), Windows, Mac OS e Android. Um arquivo CUDA binário (também conhecido como cubin) é um arquivo formatado em ELF que consiste de seções de código executável CUDA, bem como outras seções contendo símbolos, relocators, informações de depuração, etc. Por padrão, o driver de compilador CUDA nvcc incorpora arquivos de cubo No arquivo executável do host. Mas eles também podem ser gerados separadamente usando a opção - cubin do nvcc. Os arquivos de cubin são carregados em tempo de execução pela API de driver CUDA. Nota: Para obter mais detalhes sobre os arquivos do cubin ou a trajetória de compilação do CUDA, consulte NVIDIA CUDA Compiler Driver NVCC. CUDA fornece dois utilitários binários para examinar e desmontar arquivos de cubo e executáveis ​​de host: cuobjdump e nvdisasm. Basicamente, cuobjdump aceita arquivos de cubo e binários de host enquanto nvdisasm só aceita arquivos de cubo, mas nvdisasm fornece opções de saída mais ricas. Tabela 1. Comparação de cuobjdump e nvdisasm cuobjdump extrai informações de arquivos binários CUDA (tanto autônomos quanto incorporados em binários de host) e os apresenta em formato legível para humanos. A saída de cuobjdump inclui CUDA assembly código para cada kernel, CUDA ELF seção cabeçalhos, seqüência de caracteres tabelas, relocators e outras CUDA seções específicas. Ele também extrai o texto ptx embutido de binários de host. Para obter uma lista do conjunto de instruções de montagem CUDA de cada arquitetura de GPU, consulte Referência de conjunto de instruções. Cuobjdump aceita um único arquivo de entrada cada vez que é executado. A utilização básica é a seguinte: Para desmontar um cubo ou cubos autônomos incorporados em um executável do host e mostrar o assembly CUDA dos kernels, use o seguinte comando: Para despejar seções de cuda elf em formato legível de um arquivo cubin, use o seguinte comando : Para extrair texto ptx de um binário de host, use o seguinte comando: Heres uma saída de amostra de cuobjdump. Conforme mostrado na saída, o binário do host a. out contém código de cubin e ptx para sm20. Para listar os arquivos do cubin no uso binário do host - lelf opção: Para extrair todos os cubins como arquivos do host binário use - xelf all option: Para extrair o cubin chamado addnew. sm30.cubin. Para extrair apenas os cubins contendo old em seus nomes: Você pode passar qualquer substring para - xelf e - xptx opções. Somente os arquivos com a substring no nome serão extraídos do binário de entrada. Para despejar informações de uso de recursos comuns e por função: Observe que o valor para REG, TEXTURE, SURFACE e SAMPLER denota a contagem e para outros recursos denota não. De byte (s) utilizado (s). A Tabela 2 contém as opções de linha de comando suportadas de cuobjdump. Juntamente com uma descrição do que cada opção faz. Cada opção tem um nome longo e um nome curto, que pode ser usado de forma intercambiável. Tabela 2. Opções de Linha de Comando cuobjdump --extract-elf ltpartial file namegt. Extraia o nome dos arquivos ELF contendo o nome do arquivo ltpartial e salve como arquivo (s). Use tudo para extrair todos os arquivos. Para obter a lista de arquivos ELF use a opção - lelf. Funciona com host executável / objeto / biblioteca e fatbin externo. Todas as opções de dump e lista são ignoradas com esta opção. --extract-ptx nome do arquivo ltpartial. Extraia o nome dos arquivos PTX contendo o nome do arquivo ltpartial e salve como arquivo (s). Use tudo para extrair todos os arquivos. Para obter a lista de arquivos PTX, use a opção - lptx. Funciona com host executável / objeto / biblioteca e fatbin externo. Todas as opções de dump e lista são ignoradas com esta opção. --função de função ltf. Especifique os nomes das funções do dispositivo cujas estruturas binárias de gordura devem ser despejadas. --function-index ltfunction indexgt. Especifique o índice da tabela de símbolos da função cujas estruturas binárias de gordura devem ser despejadas. --gpu-architecture ltgpu architecture namegt Especifica a arquitetura da GPU para a qual as informações devem ser despejadas. Valores permitidos para esta opção: sm20, sm21, sm30, sm32, sm35, sm37, sm50, sm52, sm53, sm60, sm61. Imprima esta informação de ajuda nesta ferramenta. Liste todos os arquivos ELF disponíveis no fatbin. Funciona com host executável / objeto / biblioteca e fatbin externo. Todas as outras opções são ignoradas com este sinalizador. Isso pode ser usado para selecionar ELF particular com a opção - xelf mais tarde. Liste todos os arquivos PTX disponíveis no fatbin. Funciona com host executável / objeto / biblioteca e fatbin externo. Todas as outras opções são ignoradas com este sinalizador. Isso pode ser usado para selecionar PTX específico com a opção - xptx mais tarde. Inclua opções de linha de comando do arquivo especificado. Nvdisasm extrai informações de arquivos de cubo autônomos e os apresenta em formato legível. A saída de nvdisasm inclui CUDA assembly código para cada kernel, lista de ELF dados seções e outras CUDA seções específicas. Estilo de saída e opções são controladas através de opções de linha de comando nvdisasm. O nvdisasm também controla a análise de fluxo para anotar alvos de salto / ramo e torna a saída mais fácil de ler. Observação: o nvdisasm requer informações de realocação completas para fazer análise de fluxo de controle. Se esta informação estiver ausente do binário CUDA, use a opção nvdisasm - ndf para desativar a análise de fluxo de controle ou use a opção ptxas e nvlink - preserve-relocs para re-gerar o arquivo cubin. Para obter uma lista do conjunto de instruções de montagem CUDA de cada arquitetura de GPU, consulte Referência de conjunto de instruções. Nvdisasm aceita um único arquivo de entrada cada vez que é executado. O uso básico é o seguinte: Para obter o gráfico de fluxo de controle de um kernel, use o seguinte: Heres uma saída de amostra de nvdisasm. O nvdisasm é capaz de gerar o fluxo de controle do assembly CUDA no formato da linguagem de descrição do gráfico DOT. A saída do fluxo de controle de nvdisasm pode ser importada diretamente para uma ferramenta de visualização de gráfico DOT, como Graphviz. Nota: Este recurso é suportado somente em cubins gerados para Compute Capability 3.0 e posterior. Heres como você pode gerar uma imagem PNG (cfg. png) do fluxo de controle do cubo acima (a. cubin) com nvdisasm e Graphviz: Heres o gráfico gerado: Figura 1. Gráfico de fluxo de controle nvdisasm é capaz de mostrar o registro ( CC, geral e predicado). Para cada linha de montagem CUDA, nvdisasm exibe se um determinado registro de dispositivo foi atribuído, acessado, ao vivo ou reatribuído. Mostra também o número total de registos utilizados. Isso é útil se o usuário estiver interessado no intervalo de vida de qualquer registro particular, ou registrar o uso em geral. Nota: Este recurso é suportado somente em cubins gerados para Compute Capability 3.0 e posterior. Heres uma saída de amostra (colunas esquerdas são omitidas): Tabela 3 contém as opções de linha de comando suportadas de nvdisasm. Juntamente com uma descrição do que cada opção faz. Cada opção tem um nome longo e um nome curto, que pode ser usado de forma intercambiável. Tabela 3. Opções de linha de comando do nvdisasm nvprune aceita um único arquivo de entrada cada vez que ele é executado, emitindo um novo arquivo de saída. O uso básico é o seguinte: O arquivo de entrada deve ser um objeto de host relocável ou uma biblioteca estática (não um executável de host) eo arquivo de saída terá o mesmo formato. A opção --arch ou --generate-code deve ser usada para especificar o (s) alvo (s) a ser mantido. Todo o outro código de dispositivo é descartado do arquivo. Os alvos podem ser um arco smNN (cubin) ou um arco computeNN (ptx). Por exemplo, o seguinte irá prune libcublasstatic. a para conter apenas sm35 cubin em vez de todos os alvos que normalmente existem: Note que isso significa que libcublasstatic35.a não será executado em qualquer outra arquitetura, por isso só deve ser usado quando você está construindo para Uma única arquitetura. A Tabela 7 contém as opções de linha de comando suportadas do nvprune. Juntamente com uma descrição do que cada opção faz. Cada opção tem um nome longo e um nome curto, que pode ser usado de forma intercambiável. Tabela 7. Opções da linha de comando nvprune TODAS AS ESPECIFICAÇÕES, PLACAS DE REFERÊNCIA, ARQUIVOS, DESENHOS, DIAGNÓSTICOS, LISTAS E OUTROS DOCUMENTOS DA NVIDIA DESIGN (JUNTO E SEPARADAMENTE, MATERIAIS) ESTÃO FORNECIDOS COMO ESTÃO. A NVIDIA NÃO OFERECE GARANTIAS, EXPRESSAS, IMPLÍCITAS, ESTATUTÁRIAS OU DE OUTRA FORMA COM RELAÇÃO AOS MATERIAIS E EXPRESSAMENTE SE ISENTA DE TODAS AS GARANTIAS IMPLÍCITAS DE NÃO INFRAÇÃO, COMERCIABILIDADE E ADEQUAÇÃO A UM DETERMINADO PROPÓSITO. A informação fornecida é acreditada para ser exata e de confiança. No entanto, a NVIDIA Corporation não assume qualquer responsabilidade pelas consequências da utilização de tais informações ou por qualquer violação de patentes ou outros direitos de terceiros que possam resultar da sua utilização. Nenhuma licença é concedida por implicação de outra forma sob quaisquer direitos de patente da NVIDIA Corporation. As especificações mencionadas nesta publicação estão sujeitas a alterações sem aviso prévio. Esta publicação substitui e substitui todas as outras informações anteriormente fornecidas. Os produtos NVIDIA Corporation não são autorizados como componentes críticos em dispositivos ou sistemas de suporte de vida sem a aprovação expressa e por escrito da NVIDIA Corporation. Marcas Registradas NVIDIA eo logotipo NVIDIA são marcas comerciais ou marcas registradas da NVIDIA Corporation nos Estados Unidos e em outros países. Outros nomes de empresas e produtos podem ser marcas registradas das respectivas empresas com as quais eles estão associados. Decrypting schemaoption parâmetros valor binário para uma replicação transacional Artigo Descriptografando schemaoption parâmetros valor binário para uma replicação transacional Artigo Balakrishnan Shankar Chris Skorlinski Serviços de Escalação Microsoft SQL Server Durante o curso Da solução de problemas, equipe de Suporte do Microsoft SQL, coletamos dos clientes o Script de Criação de Publicação. Em casos envolvendo a geração de Snapshot e problemas de aplicação, pode ser necessário descifrar as opções de esquema para um artigo do script customer8217s. Abaixo script vai ajudar a deduzir isso. O script é testado para o SQL Server 2005, mas também deve funcionar para outras versões SQL. SQL Server Books Online É um bitmap da opção de geração de esquema para o determinado artigo. Schemaoption é binário (8) e pode ser o produto (Bitwise OR) de um ou mais desses valores. Ao publicar uma tabela ou exibição, a replicação permite que você controle as opções de criação de objeto que são replicadas para o objeto publicado. Opções de esquema podem ser definidas programaticamente quando um artigo é criado usando procedimentos armazenados de replicação. Eles também podem ser alterados posteriormente. Se você não especificar explicitamente essas opções para um artigo, um conjunto padrão de opções será definido. Nota: As opções de esquema padrão ao usar procedimentos armazenados de replicação podem diferir das opções padrão quando os artigos são adicionados usando o Microsoft SQL Server Management Studio. As opções de esquema são especificadas como um valor hexadecimal que é o resultado (OR bitwise) de uma ou mais opções. DECLARE SchemaOption binário (8) DECLARE OpçõesInText varchar (2000) SET OptionsInText 8216 OPÇÕES SCHEMA AQUI ESTÃO 8216 SET OptionsInText OptionsInText char (13) 821682128212821282128212821282128212821282128212821282128216 8211Selecione o valor de schemaoption que você deseja descriptografar aqui SET schemaoption ltltlt Sua Opção de Esquema Gtgtgt 8212Replace o valor aqui SET intermediário cast (cast (schemaoption como int) amp 0x01 como binário (8)) IF intermediário 0x0000000000000001 SET optionsinText optionsinText char (13) 82160x01 8211 Gera o script de criação de objetos (CREATE TABLE, CREATE PROCEDURE e assim em). Este valor é o padrão para artigos de procedimento armazenado.8217 SET intermediário cast (cast (schemaoption como int) amp 0x02 como binário (8)) IF intermediário 0x0000000000000002 SET optionsinText optionsinText char (13) 82160x02 8211 Gera os procedimentos armazenados que propagam alterações para o Se definido.8217 SET intermediário cast (cast (schemaoption como int) amp 0x04 como binário (8)) IF intermediário 0x0000000000000004 SET optionsinText optionsinText char (13) 82160x04 8211 As colunas de identidade são scripted usando a propriedade IDENTITY.8217 SET intermediário cast Cast (schemaoption como int) amp 0x08 como binário (8)) IF intermediário 0x0000000000000008 SET optionsinText optionsinText char (13) 82160x08 8211 Replicar colunas timestamp. Se não for definido, as colunas timestamp são replicadas como binárias.8217 SET intermediário cast (cast (schemaoption como int) amp 0x10 como binário (8)) IF intermediário 0x0000000000000010 SET optionsinText optionsinText char (13) 82160x10 8211 Gera um índice agrupado correspondente. Mesmo se essa opção não for definida, os índices relacionados às chaves primárias e restrições exclusivas serão gerados se já estiverem definidos em uma tabela publicada.8217 SET intermediário cast (cast (schemaoption como int) amp 0x20 como binário (8)) IF intermediário 0x0000000000000020 SET optionsinText optionsinText char (13) 82160x20 8211 Converte tipos de dados definidos pelo usuário (UDT) em tipos de dados base no Assinante. Esta opção não pode ser usada quando houver uma restrição CHECK ou DEFAULT em uma coluna UDT, se uma coluna UDT for parte da chave primária ou se uma coluna computada fizer referência a uma coluna UDT. Não suportado para Oracle Publishers.8217 SET intermediário cast (cast (schemaoption como int) amp 0x40 como binário (8)) IF intermediário 0x0000000000000040 SET optionsinText optionsinText char (13) 82160x40 8211 Gera os índices não-clusters correspondentes. Mesmo se esta opção não estiver definida, os índices relacionados a chaves primárias e restrições exclusivas serão gerados se já estiverem definidos em uma tabela publicada. 822 SET intermediário cast (cast (schemaoption como int) amp 0x80 como binário (8)) IF intermediário 0x0000000000000080 SET optionsinText optionsinText char (13) 82160x80 8211 Replica restrições de chave primária. Todos os índices relacionados à restrição também são replicados, mesmo que as opções 0x10 e 0x40 não estejam ativadas.8217 SET intermediário cast (cast (schemaoption como int) amp 0x100 como binário (8)) IF intermediário 0x0000000000000100 SET optionsinText optionsinText char (13) 82160x100 8211 Replica os disparadores do usuário em um artigo da tabela, se definido. Não suportado para Oracle Publishers.8217 SET intermediário cast (cast (schemaoption como int) amp 0x200 como binário (8)) IF intermediário 0x0000000000000200 SET optionsinText optionsinText char (13) 82160x200 8211 Replica as restrições de chave estrangeira. Se a tabela referenciada não faz parte de uma publicação, todas as restrições de chave externa em uma tabela publicada não são replicadas. Não suportado para Oracle Publishers.8217 SET intermediário cast (cast (schemaoption como int) amp 0x400 como binário (8)) IF intermediário 0x0000000000000400 SET optionsinText optionsinText char (13) 82160x400 8211 Replica as restrições de verificação. Não suportado para Oracle Publishers.8217 SET intermediário cast (cast (schemaoption como int) amp 0x800 como binário (8)) IF intermediário 0x0000000000000800 SET optionsinText optionsinText char (13) 82160x800 8211 Replica as predefinições. Não suportado para Oracle Publishers.8217 SET intermediário cast (cast (schemaoption como int) amp 0x1000 como binário (8)) IF intermediário 0x0000000000001000 SET optionsinText optionsinText char (13) 82160x1000 8211 Replicates column-level collation8217 SET intermediário cast (cast (schemaoption como Int) amp 0x2000 como binário (8)) IF intermediário 0x0000000000002000 SET optionsinText optionsinText char (13) 82160x2000 8211 Replica as propriedades estendidas associadas ao objeto de origem do artigo publicado. Não suportado para Oracle Publishers8217 SET intermediário cast (cast (schemaoption como int) amp 0x4000 como binário (8)) IF intermediário 0x0000000000004000 SET optionsinText optionsinText char (13) 82160x4000 8211 Replica restrições UNIQUE. Todos os índices relacionados à restrição também são replicados, mesmo se as opções 0x10 e 0x40 não estiverem habilitadas8217 SET intermediário cast (cast (schemaoption como int) amp 0x8000 como binário (8)) IF intermediário 0x0000000000008000 SET optionsinText optionsinText char (13) 82160x8000 8211 (0) 82160x10000 8211 Replica as restrições de CHECK como NOT FOR REPLICATION para que as restrições não sejam válidas para o SQL Server 2005 Publishers8217 SET intermediário (cast (schemaoption como int) amp 0x10000 como binário (8)) IF intermediário 0x0000000000010000 SET optionsinText optionsinText Não são aplicadas durante a sincronização 8217 SET intermediário cast (cast (schemaoption como int) amp 0x20000 como binário (8)) IF intermediário 0x0000000000020000 SET optionsinText optionsinText char (13) 82160x20000 8211 Replica as restrições FOREIGN KEY como NOT FOR REPLICATION para que as restrições não sejam aplicadas Durante a sincronização8217 SET intermediário cast (elenco (schemaoption como int) amp 0x40000 como binário (8)) IF intermediário 0x0000000000040000 SET optionsinText optionsinText char (13) 82160x40000 8211 Replica grupos de arquivos associados a uma tabela particionada ou index8217 SET intermediário cast (elenco (schemaoption como int ) Amp 0x80000 como binário (8)) IF intermediário 0x0000000000080000 SET optionsinText optionsinText char (13) 82160x80000 8211 Replica o esquema de partição para uma tabela particionada8217 SET intermediário cast (cast (schemaoption como int) amp 0x100000 como binário (8)) IF intermediário 0x0000000000100000 SET optionsinText char (13) 82160x100000 8211 Replica o esquema de partição para um índice particionado8217 SET intermediário cast (cast (schemaoption como int) amp 0x200000 como binário (8)) IF intermediário 0x0000000000200000 SET optionsinText optionsinText char (13) 82160x200000 8211 Replica as estatísticas de tabela8217 SET intermediário (elenco (schemaoption como int) amp 0x400000 como binário (8)) IF intermediário 0x0000000000400000 SET optionsinText optionsinText char (13) 82160x400000 8211 Replicates padrão Bindings8217 SET intermediário cast (elenco (schemaoption como int) amp 0x800000 como binário (8) ) IF intermediário 0x0000000000800000 SET optionsinText optionsinText char (13) 82160x800000 8211 Replicates regra Bindings8217 SET intermediário cast (cast (schemaoption como int) amp 0x1000000 como binário (8)) IF intermediário 0x0000000001000000 SET optionsinText optionsinText char (13) 82160x1000000 8211 Replica o full - Text index8217 SET intermediário (cast (schemaoption como int) amp 0x2000000 como binário (8)) IF intermediário 0x0000000002000000 SET optionsinText optionsinText char (13) 82160x2000000 8211 As coleções de esquema XML vinculadas a colunas xml não são replicadas8217 SET intermediário cast (elenco (schemaoption como Int) amp 0x4000000 como binário (8)) IF intermediário 0x0000000004000000 SET optionsinText optionsinText char (13) 82160x4000000 8211 Replica índices em colunas xml8217 SET intermediário cast (cast (schemaoption como int) amp 0x8000000 como binário (8)) IF intermediário 0x0000000008000000 SET optionsinText OptionsinText char (13) 82160x8000000 8211 Cria quaisquer esquemas que ainda não estejam presentes no subscriber8217 SET intermediário cast (cast (schemaoption como int) amp 0x10000000 como binário (8)) IF intermediário 0x0000000010000000 SET optionsinText optionsinText char (13) 82160x10000000 8211 Converte xml colunas para Ntext no sub-conjunto Subscriber8217 SET intermediário (cast (schemaoption como int) amp 0x20000000 como binário (8)) IF intermediário 0x0000000020000000 SET optionsinText optionsinText char (13) 82160x20000000 8211 Converte tipos de dados de objeto grandes introduzidos no SQL Server 2005 para tipos de dados suportados em versões anteriores Versões do Microsoft SQL Server8217 SET intermediário cast (cast (schemaoption como int) amp 0x40000000 como binário (8)) IF intermediário 0x0000000040000000 SET optionsinText optionsinText char (13) 82160x40000000 8211 Replicates permissions8217 SET intermediário cast (cast (schemaoption como int) amp 0x80000000 como Binário (8)) IF intermediário 0x0000000080000000 SET optionsinText optionsinText char (13) 82160x80000000 8211 Tentativas de descartar dependências para quaisquer objetos que não fazem parte da publicação8217 SET intermediário cast (cast (schemaoption como int) amp 0x100000000 como binário (8)) IF Intermediário 0x0000000100000000 SET optionsinText optionsinText char (13) 82160x100000000 8211 Utilize esta opção para replicar o atributo FILESTREAM se especificado em varbinary (max) columns.8217 SET intermediário cast (cast (schemaoption como int) amp 0x400000000 como binário (8)) IF Intermediário 0x0000000400000000 SET optionsinText optionsinText char (13) 82160x400000000 8211 Replica a opção de compactação para dados e índices.8217 SET intermediário cast (cast (schemaoption como int) amp 0x800000000 como binário (8)) IF intermediário 0x0000000800000000 SET optionsinText optionsinText char (13) 82160x800000000 8211 Define esta opção para armazenar dados FILESTREAM no seu próprio grupo de arquivos no Subscriber.8217 SET intermediário cast (cast (schemaoption como int) amp 0x1000000000 como binário (8)) IF intermediário 0x0000001000000000 SET optionsinText optionsinText char (13) 82160x1000000000 8211 Converte linguagem comum (UDTs) que são maiores do que 8000 bytes para varbinary (max) .8217 SET intermediário cast (cast (schemaoption como int) amp 0x2000000000 como binário (8)) IF intermediário 0x0000002000000000 SET optionsinText optionsinText char ( 13) 82160x2000000000 8211 Converte o tipo de dados hierarchyid em varbinary (max) .8217 SET intermediário (cast (schemaoption como int) amp 0x4000000000 como binário (8)) IF intermediário 0x0000004000000000 SET optionsinText optionsinText char (13) 82160x4000000000 8211 Replica quaisquer índices filtrados (8)) IF intermediário 0x0000008000000000 SET optionsinText optionsinText char (13) 82160x8000000000 8211 Converte os tipos de dados de geografia e geometria para varbinary (max) .8217 SET (13) 82160x10000000000 8211 Replica índices em colunas de tipo geografia e geometria.8217 SET intermediário de elenco (elenco (schemaoption como int) 0x000000000000 SET intermitente (elenco (schemaoption como int) amp 0x10000000000 como binário (8)) IF intermediário 0x0000010000000000 SET optionsinText optionsinText char Amp 0x20000000000 como binário (8)) IF intermediário 0x0000020000000000 SET optionsinText optionsinText char (13) 82160x20000000000 8211 Replica o atributo SPARSE para columns.8217 8211Imprimir o resultado agora 8212-FINAL DO SCRIPT 82128212821282128211Compiler Opções para criar binários ímpares Opções para GCC - nostdinc: Não Padrão inclui. Isso significa não procurar o caminho de inclusão padrão, que normalmente é / usr / include. Você precisará disso e da opção - I (para adicionar diretórios ao caminho de inclusão) se estiver compilando usando seu próprio conjunto de arquivos de inclusão padrão. Opções para LD - nostdlib: Sem bibliotecas padrão. Isso significa não tentar estabelecer ligação com as bibliotecas padrão. Da mesma forma, você precisará disso e da opção - L (para adicionar diretórios ao caminho da biblioteca) se estiver compilando usando seu próprio conjunto de bibliotecas padrão. - Texto 0x100000: Use o endereço de carga 0x100000. Isso especifica que o segmento de texto deve ser carregado em 0x100000. Os outros segmentos serão automaticamente colocados imediatamente após o segmento de texto, a menos que seus locais também sejam explicitamente especificados. Se estiver vinculado a um ELF, os cabeçalhos fornecerão o ponto de entrada e o endereço de carga de cada segmento. O carregador deve usar aqueles, como poderia haver espaço deixado entre os segmentos. Se ligar a um raw, o endereço de carga é também 0x100000 e todos os segmentos são esmagados juntos. --oformat binário: Produz um binário bruto. Os módulos de entrada ainda estão no formato nativo do sistema host (geralmente ELF). Os módulos intermediários obviamente não podem ser binários brutos porque precisam de informações sobre o símbolo e a relocação. (--iformat especifica o formato de entrada, mas isso raramente é útil.) - static: Se você usar um conjunto de bibliotecas padrão, elas devem estar estaticamente vinculadas a menos que seu carregador ofereça suporte a vinculação dinâmica. Diretrizes de código O montador pode compilar código de assembly de 16 bits para ser executado em um segmento de 16 bits, código de montagem de 32 bits a ser executado em um segmento de 32 bits ou código de montagem de 32 bits para ser executado em um código de 16 bits Segmento (usando substituições em cada instrução). Tanto quanto sabemos, o GCC sempre gera código de montagem de 32 bits. Várias diretivas podem ser colocadas na saída da montagem usando a diretiva asm () no código C..code16: Isso especifica que o código que está sendo montado é código de 16 bits para ser executado em um segmento de 16 bits..code32: Isso especifica que o código que está sendo montado é código de 32 bits para ser executado em um segmento de 32 bits. Esse é o padrão..code16gcc: Isso especifica que o código que está sendo montado foi gerado pelo GCC e, portanto, é um código de montagem de 32 bits que será executado em um segmento de 16 bits. O GAS irá adicionar as substituições necessárias a cada instrução para indicar endereços de 32 bits, registos, dados, etc. Este é o mais útil, uma vez que esta directiva permite escrever código C para ser executado num segmento de 16 bits (quer o modo real Ou modo protegido). Em termos de aplicar isso ao código C, isso significa adicionar asm (.code16gccn) na parte superior de cada módulo C. Observe que você pode misturar funções a serem executadas em segmentos de 16 bits e funções a serem executadas em segmentos de 32 bits no mesmo módulo, mas se o fizer, tenha cuidado ao trocar os segmentos e certifique-se de que os endereços de carga são válidos para todas as partes Do código. Compilando DOS arquivos COM e carregadores de inicialização O formato de arquivo DOS COM é apenas um binário bruto carregado em um segmento de modo real de 16 bits no endereço 0x100. Para compilar um COM com gcc, você precisa adicionar asm (.code16gccn) na parte superior de cada módulo C (incluindo todas as bibliotecas padrão) e link com as opções - static - Ttext 0x100 --oformat binário. Embora provavelmente você terá um monte de montagem em linha para chamadas de sistema, provavelmente ainda será mais fácil escrever em C. Para fazer chamadas de sistema mais fáceis, escrevemos uma macro que se expande para um asm () que leva argumentos para os valores De eax, ebx, ecx, edx, esi e edi. Escrevemos mais macros para obter os valores de retorno dos registos e para testar os valores dos bits no registo de sinalizadores depois de regressar de uma chamada de sistema. Isso torna trivial escrever algumas funções de wrapper para a maioria dos arquivos e E / S de terminal no DOS. Compilar um carregador de inicialização funcionaria da mesma maneira, exceto que o endereço de carga é 0x7C00 em vez de 0x100 eo tamanho de seu binário raw é limitado a 446 bytes para um registro mestre de inicialização e 512 bytes para um setor de inicialização. Boa sorte montagem de um programa C útil em 446 bytes, no entanto.

No comments:

Post a Comment