Saturday 8 July 2017

Netwide Assembler Binary Options


O Netwide Assembler: NASM O Netwide Disassembler, NDISASM O Netwide Disassembler é um pequeno programa complementar para o Netwide Assembler, NASM. Parecia uma vergonha ter um assembler x86, completo com uma tabela de instruções completa, e não fazer tanto uso dela quanto possível, então heres um disassembler que compartilha a tabela de instruções (e alguns outros bits de código) com NASM. O Netwide Disassembler não faz nada, exceto para produzir desmontagens de arquivos de origem binários. NDISASM não tem qualquer compreensão de formatos de arquivo de objeto, como objdump. E ele não vai entender os arquivos DOS. EXE como o depuração. Apenas desmonta. Consulte a seção 1.3 para obter instruções de instalação. NDISASM, como NASM, tem uma página de manual que você pode querer colocar em algum lugar útil, se você estiver em um sistema Unix. Para desmontar um arquivo, normalmente você usará um comando do formulário NDISASM pode desmontar código de 16, 32 ou 64 bits com a mesma facilidade, desde naturalmente que você se lembra de especificar com qual ele deve trabalhar. Se nenhuma opção - b estiver presente, NDISASM funciona no modo de 16 bits por padrão. A opção - u (para USE32) também invoca o modo de 32 bits. Mais duas opções de linha de comando são - r que relata o número de versão do NDISASM que você está executando e - h que fornece um breve resumo das opções da linha de comando. Para desmontar um ficheiro DOS correctamente, um desmontador deve assumir que a primeira instrução no ficheiro é carregada no endereço 0 x 100. Em vez de zero. NDISASM, que assume por padrão que qualquer arquivo que você dá é carregado em zero, portanto, precisará ser informado disto. A opção - o permite que você declare uma origem diferente para o arquivo que você está desmontando. Seu argumento pode ser expresso em qualquer um dos formatos numéricos NASM: decimal por padrão, se ele começa com ou 0x ou termina em H seu hex. Se termina em Q seu octal. E se termina em B seu binário. Assim, para desmontar um arquivo: vai fazer o truque. Suponha que você está desmontando um arquivo que contém alguns dados que não são código de máquina e, em seguida, contém algum código de máquina. NDISASM fielmente arado através da seção de dados, produzindo instruções de máquina onde quer que possa (embora a maioria deles vai olhar bizarro, e alguns podem ter prefixos incomuns, por exemplo, FS ou AX, 0x240A) e gerar instruções DB sempre tão frequentemente se o seu totalmente stumped . Em seguida, ele alcançará a seção de código. Supondo que o NDISASM acabou de gerar uma instrução de máquina estranha de parte da seção de dados, e sua posição de arquivo é agora um byte antes do início da seção de código. É perfeitamente possível que outra instrução espúria seja gerada, começando com o byte final da seção de dados e, em seguida, a primeira instrução correta na seção de código não será vista porque o ponto de partida saltou sobre ela. Isso não é realmente ideal. Para evitar isso, você pode especificar um ponto de sincronização, ou mesmo tantos pontos de sincronização como você gosta (embora NDISASM só pode manipular 2147483647 pontos de sincronização internamente). A definição de um ponto de sincronização é a seguinte: NDISASM garante acertar pontos de sincronização exatamente durante a desmontagem. Se ele está pensando em gerar uma instrução que faria com que ele saltar sobre um ponto de sincronização, ele irá descartar essa instrução e saída um db vez. Então ele vai começar a desmontagem exatamente a partir do ponto de sincronização, e assim você verá todas as instruções em sua seção de código. Os pontos de sincronização são especificados usando a opção - s: são medidos em termos da origem do programa e não da posição do arquivo. Então, se você quiser sincronizar após 32 bytes de um arquivo, você teria que fazer Como mencionado acima, você pode especificar vários marcadores de sincronização se você precisar, apenas repetindo a opção - s. Suponha que você está desmontando o setor de inicialização de um disquete do DOS (talvez ele tenha um vírus, e você precisa entender o vírus para que você saiba que tipos de danos pode ter feito você). Normalmente, isso irá conter uma instrução JMP, em seguida, alguns dados, em seguida, o resto do código. Portanto, há uma chance muito boa de NDISASM sendo desalinhados quando os dados termina eo código começa. Portanto, um ponto de sincronização é necessário. Por outro lado, por que você deve especificar o ponto de sincronização manualmente O que você faria para encontrar onde o ponto de sincronização seria, certamente, seria ler a instrução JMP e, em seguida, usar seu endereço de destino como um ponto de sincronização . Então, o NDISASM pode fazer isso para você A resposta, é claro, é sim: usando uma das opções também - a (para sincronização automática) ou - i (para sincronização inteligente) ativará o modo de sincronização automática. O modo de sincronização automática gera automaticamente um ponto de sincronização para qualquer instrução de salto ou de chamada relativa ao PC com referência direta que o NDISASM encontrar. (Uma vez que o NDISASM é um passo, se encontrar um salto relativo ao PC cujo alvo já tenha sido processado, não há muito que ele possa fazer sobre isso.) Somente saltos relativos a PC são processados, uma vez que um salto absoluto é através de um registrador (Caso em que NDISASM não sabe o que o registo contém) ou envolve um endereço de segmento (caso em que o código de destino isnt no mesmo segmento que NDISASM está trabalhando, e assim o ponto de sincronização não pode ser colocado em qualquer lugar útil). Para alguns tipos de arquivo, esse mecanismo automaticamente colocará pontos de sincronização em todos os lugares certos e o salvará de ter que colocar qualquer ponto de sincronização manualmente. No entanto, deve ser salientado que o modo de sincronização automática não é garantido para capturar todos os pontos de sincronização, e você ainda pode ter que colocar alguns manualmente. O modo de sincronização automática não impede que você declare pontos de sincronização manuais: apenas adiciona os gerados automaticamente aos que você fornece. É perfeitamente possível especificar opções - i e algumas - s. Outra advertência com o modo auto-sync é que se, por algum acaso desagradável, algo em sua seção de dados deve desmontar a uma chamada relativa ao PC ou instrução de salto, NDISASM pode obedientemente colocar um ponto de sincronização em um lugar totalmente aleatório, por exemplo, no Meio de uma das instruções na sua seção de código. Assim, você pode acabar com uma desmontagem incorreta, mesmo se você usar a sincronização automática. Mais uma vez, não há muito que eu possa fazer sobre isso. Se você tiver problemas, você precisará usar pontos de sincronização manuais ou usar a opção - k (documentada abaixo) para suprimir a desmontagem da área de dados. A opção - e pula um cabeçalho no arquivo, ignorando os primeiros N bytes. Isso significa que o cabeçalho não é contado para o deslocamento de desmontagem: se você fornecer - e10 - o10. A desmontagem começará no byte 10 no arquivo, e isso será dado o deslocamento 10, não 20. A opção - k é fornecida com dois argumentos numéricos separados por vírgulas, o primeiro dos quais é um deslocamento de montagem e o segundo é um número de Bytes para ignorar. Isto irá contar os bytes ignorados para o deslocamento de montagem: o seu uso é suprimir a desmontagem de uma seção de dados que wouldnt conter qualquer coisa que você queria ver de qualquer maneira. Não há erros conhecidos. No entanto, qualquer que você encontrar, com patches se possível, deve ser enviado para nasm-bugslists. sourceforge. Ou para o site de desenvolvedores em www. nasm. us/ e bem tentar corrigi-los. Sinta-se livre para enviar contribuições e novos recursos também. O que é Nasm O Netwide Assembler, NASM, é um montador 80x86 projetado para portabilidade e modularidade. Ele suporta uma variedade de formatos de arquivo de objeto, incluindo Linux e NetBSD / FreeBSD a. out, ELF, COFF, Microsoft de 16 bits OBJ e Win32. Ele também irá produzir arquivos binários simples. Sua sintaxe é projetada para ser simples e fácil de entender, semelhante ao Intel39s, mas menos complexo. Suporta Pentium, P6, MMX, 3DNow. SSE e SSE2 opcodes, e tem capacidade macro. IMPORTANTE A versão do Windows está um pouco desatualizada. Por favor, siga este link para obter a versão mais recente 0.98.39. Por que este site NASM é primariamente um projeto Linux. Este site oferece pacote de instalação para Windows 9x / NT / 2k / XP e BeOS Release 5, notas adicionais de instalação para Integração Visual Studio e integração BeIDE e formato de documentação CHM. Instalando o NASM em Windows Depois de ter obtido o arquivo Win32 para NASM, nasmw-inst-XXX. exe (onde XXX indica o número de versão do NASM contido no arquivo), clique duas vezes no programa de instalação automática e instale-o em seu próprio diretório Por exemplo C: Program FilesNASM). O arquivo conterá dois arquivos executáveis: os arquivos executáveis ​​do NASM nasmw. exe e os arquivos executáveis ​​NDISASM ndisasm. exe e ndisasmw. exe. Em cada caso, o arquivo cujo nome termina em w é um executável do Win32, projetado para ser executado no Windows 95 ou Windows NT Integração Intel no Microsoft Visual Studio 6 Desde 0.95.36, o NASM é totalmente oficialmente compatível com o Microsoft Visual Studio 6 / Ferramentas / Opções / Diretórios, Selecionar 39Mostrar diretórios para: 39 em 39Arquivos executáveis39. Adicione um novo caminho quotC: Program FilesNASMquot (ou onde você instalou o Nasm) - Na área de trabalho do projeto, crie uma nova pasta 39Assembler Files39. - Nesta pasta, clique com o botão direito do mouse e selecione 39Configurações.39 - Em Geral, ative 39Always use o passo de compilação personalizado39. - Em Custom Build, altere as seguintes configurações: Integração no Microsoft Visual 2003/2005/2008 - Em Ferramentas / Opções / Projetos, selecione 39VC Diretórios 39 e 39Show diretórios para: 39 39Executable files39 - Deve ser o padrão. Pressione Ctrl-Insert ou pressione o ícone39New Line39. Selecione o caminho quotC: Program FilesNASMquot (ou onde você instalou o Nasm) - Na área de trabalho do projeto, crie uma nova pasta 39Assembler Files39. - Nesta pasta, clique com o botão direito do mouse e selecione 39Configurações.39 - Em Geral, ative 39Always use o passo de compilação personalizado39. - Em Custom Build, altere as seguintes configurações: Comandos nasmw. exe - f win32 - Xvc - o quot (IntDir) (InputName).objquot (InputDir) (InputName).asm Instalando o NASM no BeOS Depois de ter obtido o arquivo BeOS para NASM , Nasm-beos-XXX. pkg (onde XXX indica o número de versão do NASM contido no arquivo), clique duas vezes no programa de instalação automática e instale-o em seu próprio diretório Como usar o NASM no BeIDE Desde o BeOS 5, o NASM é suportado Com o plugin Integração NASM - Abra a opção Configurações do Projeto, - Adicione um novo destino 39.asm39 e escolha a ferramenta 39nasm39. - Adicione seus arquivos. ASM em seu projeto. - Alternativamente, selecione. CC e mude para ASM e NASM. Como escrever uma simples rotina Assembler com NASM. Bits 32 seção. bss align16 seção. data align16 seção. text align16 global myFunction myFunction: empurrar ebp mov ebp, esp mov eax, ebp 8 // tipo seu código aqui. Pop ebp ret END se usar MSC, para exportar o procedimento: int cdecl myFunction (parâmetro int) se estiver usando o GCC, para exportar o procedimento: int myFunction (int parameter) Como entrar em contato com o autor Getting NASM special edition 0.98.36 ---- --- Update rdoff - bibliotecário / arquivador - rec - docs comuns Fix problemas assinados / unsigned. Corrija a etiqueta JMP FAR e a etiqueta CALL FAR. Adicionar novo suporte de multisseção - mapear arquivos - corrigir alinhar bug Corrigir sysexit, movhps / movlps reg, reg bugs em insns. dat quotQuot ou quotOquot sufixos indic octal Suporte Prescott novas instruções. Instruções Cyrix XSTORE. E também, a documentação NASM é fornecida na versão CHM para o Pacote do Windows. Instalação do BeOS 5. 286 KB Instalação do Win32. 634 KB (C) Copyright 1999-2004 realtech VR. Todos os direitos reservados. NASM está sob LGPL. Por favor, consulte o arquivo License, fornecido como parte de qualquer arquivo de distribuição NASM, para as condições de licença sob as quais você pode usar NASM. NASM - O Netwide Assembler é 80x86 montador projetado para portabilidade e modularidade. NASM é um assembler 80x86 projetado para portabilidade e modularidade. O projeto suporta uma variedade de formatos de arquivo de objeto incluindo Linux a. out e ELF, COFF, Microsoft 16-bit OBJ e Win32. Ele também irá produzir arquivos binários simples. Sua sintaxe é projetada para ser simples e fácil de entender, semelhante ao Intels, mas menos complexo. Ele suporta Pentium, P6, MMX, 3DNow e SSE opcodes, e tem capacidade de macro. Inclui um desmontador também. O Netwide Assembler surgiu de uma idéia em comp. lang. asm. x86 (ou, possivelmente, alt. lang. asm - eu esqueci que), que era essencialmente que não parecia ser um bom ensamblador série x86 livre ao redor, e que Talvez alguém deveria escrever um. - a86 é bom, mas não livre, e em particular você não tem nenhuma capacidade de 32 bits até pagar. Seu DOS também, também. - o gás está livre, e as portas sobre DOS e Unix, mas não é muito bom, já que o seu projetado para ser um back-end para gcc, que sempre alimenta o código correto. Portanto, sua verificação de erros é mínima. Além disso, sua sintaxe é horrível, do ponto de vista de alguém tentando realmente escrever qualquer coisa nele. Além disso, você não pode escrever código de 16 bits nele (corretamente). - as86 é Minix e Linux-specific, e (minha versão pelo menos) doesnt parecem ter muito (ou qualquer) documentação. - MASM isnt muito bom, e seu (era) caro, e funciona somente sob DOS. - TASM é melhor, mas ainda se esforça para compatibilidade MASM, o que significa milhões de directivas e toneladas de burocracia. E sua sintaxe é essencialmente MASMs, com as contradições e peculiaridades que isso acarreta (embora classifique alguns deles por meio do modo Ideal). Sua caro também. E seu DOS-only. Então aqui, para seu prazer de codificação, é NASM. Actualmente, o seu estágio ainda em protótipo - não prometemos que ele pode superar qualquer um desses montadores. Mas por favor, por favor, envie-nos relatórios de bugs, correções, informações úteis e qualquer outra coisa que você pode obter em suas mãos (e graças a muitas pessoas whove feito isso já Você sabe quem você é) e bem melhorá-lo de todo o reconhecimento . Mais uma vez. Instalando o NASM em Unix Depois de ter obtido o arquivo de origem Unix para NASM, nasm-X. XX. tar. gz (onde X. XX denota o número de versão do NASM contido no arquivo), descompacte-o em um diretório como / usr / Local / src. O arquivo, quando descompactado, criará seu próprio subdiretório nasm-X. XX. NASM é um pacote de auto-configuração: uma vez youve desembalado-lo, cd para o diretório seu sido descompactado e digite ./configure. Este script de shell irá encontrar o melhor compilador C para usar para a construção de NASM e configurar Makefiles em conformidade. Uma vez que o NASM tenha sido configurado automaticamente, você pode digitar make para construir os binários nasm e ndisasm e, em seguida, instalar para instalá-los em / usr / local / bin e instalar as páginas man nasm.1 e ndisasm.1 em / usr / local / Man / man1. Como alternativa, você pode fornecer opções como --prefix para o script de configuração (consulte o arquivo INSTALL para obter mais detalhes) ou instalar os programas por conta própria. O NASM também vem com um conjunto de utilitários para manipular o formato de arquivo de objeto personalizado RDOFF, que estão no subdiretório rdoff do arquivo NASM. Você pode construir estes com make rdf e instalá-los com make rdfinstall, se você quiser. Se o NASM falhar ao configurar automaticamente, você ainda poderá compilá-lo usando o Makefile. unx do makeix do Unix fail-back. Copie ou renomeie esse arquivo para Makefile e tente digitar make. Há também um arquivo Makefile. unx no subdiretório rdoff. O Netwide Assembler: NASM Para montar um arquivo, você emite um comando do formulário irá montar myfile. asm em um arquivo de objeto ELF myfile. o. E vai montar myfile. asm em um arquivo binário raw myfile. Para produzir um arquivo de listagem, com a saída de códigos hexadecimais do NASM exibida à esquerda das fontes originais, use a opção - l para dar um nome de arquivo de listagem, por exemplo: Para obter mais instruções de uso do NASM, tente digitar. Lista os formatos de arquivo de saída disponíveis e quais são. Se você usa o Linux, mas não tem certeza se seu sistema é a. out ou ELF, digite (no diretório no qual você colocou o binário do NASM quando você o instalou). Se ele diz algo como o seu sistema é ELF, e você deve usar a opção - f elf quando você quer NASM para produzir arquivos de objetos do Linux. Se ele diz ou algo semelhante, seu sistema é a. out. E você deve usar - f aout vez (Linux a. out sistemas são considerados obsoletos e são raros estes dias.) Como compiladores Unix e montadores, NASM é silencioso, a menos que dê errado: você não vai ver qualquer saída em tudo, a menos que ele dá mensagens de erro. NASM normalmente escolher o nome do arquivo de saída para você exatamente como ele faz isso é dependente do formato do arquivo de objeto. Para os formatos de arquivo de objeto da Microsoft (obj e win32), ele removerá a extensão. asm (ou qualquer extensão que você queira usar - NASM does not care) do seu nome de arquivo de origem e substitua. obj. Para formatos de arquivo de objeto Unix (aout. Elf e as86) ele substituirá. o. Para rdf. Ele usará. rdf. E para o bin formato ele simplesmente remover a extensão, para que myfile. asm produz o arquivo de saída myfile. Se o arquivo de saída já existir, o NASM irá substituí-lo, a menos que tenha o mesmo nome do arquivo de entrada, caso em que ele dará um aviso e usará nasm. out como o nome do arquivo de saída. Para situações em que esse comportamento é inaceitável, o NASM fornece a opção de linha de comando - o, que permite especificar o nome do arquivo de saída desejado. Você invoca - o seguindo-o com o nome que deseja para o arquivo de saída, com ou sem um espaço intermediário. Por exemplo: Se você não fornecer a opção - f para NASM, ele escolherá um formato de arquivo de saída para você mesmo. Nas versões de distribuição do NASM, o padrão é sempre bin se você tiver compilado sua própria cópia de NASM, você pode redefinir OFDEFAULT em tempo de compilação e escolher o que você quer que o padrão seja. Como - o. O espaço intermediário entre - f eo formato do arquivo de saída é opcional, portanto - f elf e - felf são ambos válidos. Uma lista completa dos formatos de arquivo de saída disponíveis pode ser dada pela emissão do comando nasm - h. Se você fornecer a opção - l para o NASM, seguido (com o espaço opcional usual) por um nome de arquivo, o NASM irá gerar um arquivo de listagem de origem para você, no qual os endereços eo código gerado estão listados à esquerda ea fonte real , Com expansões de macros de múltiplas linhas (exceto aquelas que especificamente não solicitam expansão nas listagens de fontes: ver seção 4.2.9) à direita. Por exemplo: Em MS-DOS pode ser difícil (embora existam maneiras) para redirecionar a saída de erro padrão de um programa para um arquivo. Desde NASM geralmente produz seu aviso e mensagens de erro em stderr. Isso pode tornar difícil capturar os erros se (por exemplo) você quiser carregá-los em um editor. NASM, portanto, fornece a opção - E, tendo um argumento de nome de arquivo que faz com que os erros sejam enviados para os arquivos especificados em vez de erro padrão. Portanto, você pode redirecionar os erros para um arquivo digitando A opção - s redireciona mensagens de erro para stdout em vez de stderr. Para que ele possa ser redirecionado em MS-DOS. Para montar o arquivo myfile. asm e canalizar sua saída para o programa mais, você pode digitar: Quando o NASM vê a diretiva include em um arquivo de origem (consulte a seção 4.5), ele irá procurar o arquivo fornecido não apenas no diretório atual, Mas também em qualquer diretório especificado na linha de comando pelo uso da opção - i. Portanto, você pode incluir arquivos de uma biblioteca de macros, por exemplo, digitando (Como de costume, um espaço entre - i eo nome do caminho é permitido e opcional). NASM, no interesse da portabilidade completa de código-fonte, não entende as convenções de nomenclatura de arquivos do sistema operacional que está sendo executado na seqüência de caracteres que você fornece como um argumento para a opção - i será pré-anexado exatamente como gravado para o nome do include Arquivo. Portanto, a barra invertida no exemplo acima é necessária. No Unix, uma barra inclinada para a frente também é necessária. (Você pode usar isso para sua vantagem, se você é realmente perverso, observando que a opção - ifoo fará incluir bar. i para procurar o arquivo foobar. i.) Se você quiser definir um padrão incluir caminho de pesquisa, semelhante a / Usr / include em sistemas Unix, você deve colocar uma ou mais diretivas - i na variável de ambiente NASM (consulte a seção 2.1.13). Para a compatibilidade do Makefile com muitos compiladores C, esta opção também pode ser especificada como - I. O NASM permite que você especifique arquivos a serem pré-incluídos em seu arquivo de origem, usando a opção - p. Portanto, executar é equivalente a executar nasm myfile. asm e colocar a diretiva incluir myinc. inc no início do arquivo. Para consistência com o - I. - D e - U, essa opção também pode ser especificada como - P. Assim como a opção - p dá uma alternativa para colocar diretivas de inclusão no início de um arquivo de origem, a opção - d dá uma alternativa para colocar uma diretiva define. Você poderia codificar como uma alternativa para colocar a diretiva no início do arquivo. Você pode perder o valor da macro, também: a opção - dFOO é equivalente à codificação define FOO. Esta forma da diretiva pode ser útil para selecionar opções de tempo de montagem que são testadas usando ifdef. Por exemplo - dDEBUG. Para a compatibilidade do Makefile com muitos compiladores C, esta opção também pode ser especificada como - D. A opção - u exclui uma macro que de outra forma teria sido pré-definida, automaticamente ou por uma opção - p ou - d especificada anteriormente nas linhas de comando. Por exemplo, a seguinte linha de comando: resultaria em FOO não ser uma macro predefinida no programa. Isso é útil para substituir as opções especificadas em um ponto diferente em um Makefile. Para a compatibilidade do Makefile com muitos compiladores C, esta opção também pode ser especificada como - U. NASM permite que o pré-processador para ser executado por conta própria, até um ponto. Usar a opção - e (que não requer argumentos) fará com que o NASM pré-processe seu arquivo de entrada, expanda todas as referências de macro, remova todos os comentários e diretrizes do pré-processador e imprima o arquivo resultante na saída padrão (ou salve-o em um arquivo, Se a opção - o também é usada). Esta opção não pode ser aplicada a programas que exijam que o pré-processador avalie expressões que dependem dos valores de símbolos: então código tal como irá causar um erro no modo pré-processado. Se NASM está sendo usado como o back-end para um compilador, pode ser desejável para suprimir o pré-processamento completamente e assumir o compilador já fez isso, para economizar tempo e aumentar a velocidade de compilação. A opção - a, que não requer argumento, instrui a NASM a substituir seu poderoso pré-processador por um stub preprocessor que não faz nada. NASM pode observar muitas condições durante o curso da montagem que vale a pena mencionar ao usuário, mas não um erro suficientemente grave para justificar NASM se recusando a gerar um arquivo de saída. Essas condições são relatadas como erros, mas vêm com a palavra aviso antes da mensagem. Avisos não impedem NASM de gerar um arquivo de saída e retornando um status de êxito para o sistema operacional. Algumas condições são ainda menos graves do que isso: eles são apenas por vezes vale a pena mencionar para o usuário. Portanto, o NASM oferece suporte à opção de linha de comando - w, que ativa ou desativa determinadas classes de aviso de montagem. Tais classes de aviso são descritas por um nome, por exemplo órfão-rótulos, você pode habilitar os avisos desta classe pela opção de linha de comando - worphan-labels e desativá-lo por-w-órfão-rótulos. As classes de aviso suprimíveis são: macro-params abrange avisos sobre macros de várias linhas sendo invocados com o número errado de parâmetros. Essa classe de aviso é habilitada por padrão, veja a seção 4.2.1 para um exemplo de por que você pode querer desabilitá-la. Orphan-labels abrange avisos sobre linhas de origem que não contêm instrução, mas definem um rótulo sem um cólon de rastreamento. O NASM não adverte sobre esta condição um tanto obscura por padrão veja a seção 3.1 para um exemplo de por que você pode querer. Overflow abrange avisos sobre constantes numéricas que não se encaixam em 32 bits (por exemplo, é fácil digitar um Fs demais e produzir 0x7ffffffff por engano). Essa classe de aviso está habilitada por padrão. Se você definir uma variável de ambiente chamada NASM. O programa irá interpretá-lo como uma lista de opções de linha de comando extras, que são processadas antes da linha de comando real. Você pode usar isso para definir diretórios de pesquisa padrão para arquivos de inclusão, colocando as opções - i na variável NASM. O valor da variável é dividido em espaço em branco, de modo que o valor - s - ic: nasmlib será tratado como duas opções separadas. No entanto, isso significa que o valor - dNAMEmy nome não vai fazer o que você pode querer, porque ele será dividido no espaço eo processamento de linha de comando NASM vai ficar confuso por duas palavras absurdas - dNAMEmy e nome. Para contornar isso, NASM fornece uma característica em que, se você começar a variável de ambiente NASM com algum caractere que não é um sinal de menos, NASM tratará este caractere como o caractere de separador para as opções. Portanto, definir a variável NASM para o valor - s-ic: nasmlib é equivalente a configurá-lo para - s - ic: nasmlib. Mas - dNAMEmy nome irá funcionar. Se você está acostumado a escrever programas com MASM, ou com TASM no modo compatível com MASM (não ideal) ou com a86. Esta seção tenta esboçar as principais diferenças entre sintaxe MASMs e NASMs. Se você ainda não está acostumado a MASM, provavelmente vale a pena ignorar esta seção. Uma diferença simples é que o NASM diferencia maiúsculas de minúsculas. Faz uma diferença se você chamar seu foo da etiqueta. Foo ou FOO. Se você estiver montando arquivos DOS ou OS / 2.OBJ, você pode invocar a diretiva UPPERCASE (documentada na seção 6.2) para garantir que todos os símbolos exportados para outros módulos de código são forçados a ser maiúsculas, mas mesmo assim, dentro de um único módulo, NASM irá distinguir entre rótulos diferindo apenas no caso. NASM foi projetado com simplicidade de sintaxe em mente. Um dos objetivos de design do NASM é que ele deve ser possível, na medida em que for prático, para o usuário olhar para uma única linha de código NASM e dizer que opcode é gerado por ele. Você não pode fazer isso em MASM: se você declarar, por exemplo, então as duas linhas de código geram opcodes completamente diferentes, apesar de ter sintaxe de aparência idêntica. NASM evita essa situação indesejável por ter uma sintaxe muito mais simples para referências de memória. A regra é simplesmente que qualquer acesso ao conteúdo de um local de memória requer colchetes em torno do endereço, e qualquer acesso ao endereço de uma variável doesnt. Assim, uma instrução da forma mov ax, foo sempre se referirá a uma constante de tempo de compilação, seja seu EQU ou o endereço de uma variável e para acessar o conteúdo da barra de variáveis. Você deve codificar mov ax, bar. Isso também significa que NASM não tem necessidade de palavras-chave MASMs OFFSET, uma vez que o MASM código mov ax, barra de deslocamento significa exatamente a mesma coisa como NASMs mov ax, bar. Se você está tentando obter grandes quantidades de código MASM para montar sensivelmente sob NASM, você sempre pode código offset idefine para fazer o preprocessor tratar a palavra-chave OFFSET como um não-op. Esta questão é ainda mais confusa em a86. Onde declarar um rótulo com um cólon à direita define-o como um rótulo em oposição a uma variável e faz com que o a86 adote a semântica do tipo NASM assim em a86. Var var, var tem comportamento diferente dependendo se var foi declarado como var: dw 0 (um rótulo) ou var dw 0 (uma variável de tamanho de palavra). NASM é muito simples em comparação: tudo é um rótulo. NASM, no interesse da simplicidade, também não suporta as sintaxes híbridas suportadas pelo MASM e seus clones, como mov ax, tablebx. Onde uma referência de memória é indicada por uma porção fora de colchetes e outra porção dentro. A sintaxe correta para o acima é mov ax, tablebx. Da mesma forma, mov ax, es: di é errado e mov ax, es: di está certo. NASM, por design, opta por não se lembrar os tipos de variáveis ​​que você declara. Enquanto MASM lembrará, ao ver var dw 0. que você declarou var como uma variável de tamanho de palavra, e então será capaz de preencher a ambigüidade no tamanho da instrução mov var, 2. NASM deliberadamente não lembrar nada sobre o símbolo var, exceto onde ele começa, e assim você deve explicitamente código mov palavra var, 2. Por esta razão, NASM não suporta o LODS. MOVS. STOS. SCAS. CMPS. INS. Ou OUTS instruções, mas só suporta os formulários como LODSB. MOVSW. E SCASD. Que especificam explicitamente o tamanho dos componentes das cadeias sendo manipuladas. Como parte da unidade NASMs para simplificar, ele também não suporta a diretiva ASSUME. O NASM não acompanhará os valores que você escolher colocar em seus registros de segmentos e nunca gerará automaticamente um prefixo de substituição de segmento. O NASM também não possui diretrizes para suportar diferentes modelos de memória de 16 bits. O programador tem que acompanhar quais funções são supostamente chamadas com uma chamada distante e que com uma chamada próxima, e é responsável por colocar a forma correta da instrução RET (RETN ou RETM NASM aceita RET como um formulário alternativo para RETN ) Além disso, o programador é responsável por codificar as instruções CALL FAR quando necessário ao chamar funções externas, e também deve acompanhar quais definições de variáveis ​​externas estão distantes e próximas. NASM usa nomes diferentes para se referir a registros de ponto flutuante de MASM: onde MASM iria chamá-los ST (0). ST (1) e assim por diante, e a86 chamar-lhes-ia simplesmente 0. 1 e assim por diante, NASM escolhe chamá-los st0. St1 etc. A partir da versão 0.96, NASM agora trata as instruções com nowait formulários da mesma maneira como MASM-compatível montadores. O tratamento idiossincrático empregado por 0,95 e anteriores foi baseado em um mal entendido pelos autores. Por razões históricas, NASM usa a palavra-chave TWORD onde MASM e montadores compatíveis usam TBYTE. NASM não declarar armazenamento não inicializado da mesma forma como MASM: onde um programador MASM pode usar pilha db 64 dup (). NASM requer resb de pilha 64. destinado a ser lido como reserva 64 bytes. Para uma quantidade limitada de compatibilidade, uma vez que NASM trata. Como um caractere válido em nomes de símbolo, você pode codificar. Equ 0 e depois escrevendo dw. Vai pelo menos fazer algo vagamente útil. DUP ainda não é uma sintaxe suportada, no entanto. Além de tudo isso, macros e diretivas funcionam de forma completamente diferente do MASM. Consulte o capítulo 4 e o capítulo 5 para obter mais detalhes. Netwide Assembler: NASM Para montar um arquivo, você emite um comando do formulário irá montar myfile. asm em um arquivo de objeto ELF myfile. o. E irá montar myfile. asm em um arquivo binário raw myfile. Para produzir um arquivo de listagem, com a saída de códigos hexadecimais do NASM exibida à esquerda das fontes originais, use a opção - l para dar um nome de arquivo de listagem, por exemplo: Para obter mais instruções de uso do NASM, tente digitar. Lista os formatos de arquivo de saída disponíveis e quais são. Se você usar o Linux, mas arent certeza se o seu sistema é a. out ou ELF. Digite (no diretório no qual você colocou o binário NASM quando você o instalou). Se ele diz algo como, então seu sistema é ELF. E você deve usar a opção - f elf quando quiser que o NASM produza arquivos de objetos do Linux. Se ele diz ou algo semelhante, seu sistema é a. out. E você deve usar - f aout em vez disso (sistemas Linux a. out há muito tempo foram obsoletos e são raros estes dias.) Como compiladores Unix e montadores, NASM é silencioso, a menos que dê errado: você não vai ver qualquer saída em tudo, a menos que Mensagens de erro. NASM normalmente escolher o nome do arquivo de saída para você exatamente como ele faz isso é dependente do formato de arquivo do objeto. Para os formatos de arquivo de objeto da Microsoft (obj e win32), ele removerá a extensão. asm (ou qualquer extensão que você queira usar - NASM does not care) do seu nome de arquivo de origem e substitua. obj. Para formatos de arquivo de objeto Unix (aout. Elf e as86) ele substituirá. o. Para rdf. Ele usará. rdf. and for the bin format it will simply remove the extension, so that myfile. asm produces the output file myfile. If the output file already exists, NASM will overwrite it, unless it has the same name as the input file, in which case it will give a warning and use nasm. out as the output file name instead. For situations in which this behaviour is unacceptable, NASM provides the - o command-line option, which allows you to specify your desired output file name. You invoke - o by following it with the name you wish for the output file, either with or without an intervening space. For example: Note that this is a small o, and is different from a capital O. which is used to specify the number of optimisation passes required. See section 2.1.16. If you do not supply the - f option to NASM, it will choose an output file format for you itself. In the distribution versions of NASM, the default is always bin if youve compiled your own copy of NASM, you can redefine OFDEFAULT at compile time and choose what you want the default to be. Like - o. the intervening space between - f and the output file format is optional so - f elf and - felf are both valid. A complete list of the available output file formats can be given by issuing the command nasm - hf. If you supply the - l option to NASM, followed (with the usual optional space) by a file name, NASM will generate a source-listing file for you, in which addresses and generated code are listed on the left, and the actual source code, with expansions of multi-line macros (except those which specifically request no expansion in source listings: see section 4.3.9 ) on the right. For example: This option can be used to generate makefile dependencies on stdout. This can be redirected to a file for further processing. For example: This option can be used to select a debugging format for the output file. The syntax is the same as for the - f option, except that it produces output in a debugging format. A complete list of the available debug file formats for an output format can be seen by issuing the command nasm - f ltformatgt - y. This option is not built into NASM by default. For information on how to enable it when building from the sources, see section 6.10 This option can be used to generate debugging information in the specified format. See section 2.1.5 for more information. This option can be used to select an error reporting format for any error messages that might be produced by NASM. Currently, two error reporting formats may be selected. They are the - Xvc option and the - Xgnu option. The GNU format is the default and looks like this: where filename. asm is the name of the source file in which the error was detected, 65 is the source file line number on which the error was detected, error is the severity of the error (this could be warning ), and specific error message is a more detailed text message which should help pinpoint the exact problem. The other format, specified by - Xvc is the style used by Microsoft Visual C and some other programs. It looks like this: where the only difference is that the line number is in parentheses instead of being delimited by colons. See also the Visual C output format, section 6.3. Under MS-DOS it can be difficult (though there are ways) to redirect the standard-error output of a program to a file. Since NASM usually produces its warning and error messages on stderr. this can make it hard to capture the errors if (for example) you want to load them into an editor. NASM therefore provides the - E option, taking a filename argument which causes errors to be sent to the specified files rather than standard error. Therefore you can redirect the errors into a file by typing The - s option redirects error messages to stdout rather than stderr. so it can be redirected under MS-DOS. To assemble the file myfile. asm and pipe its output to the more program, you can type: When NASM sees the include directive in a source file (see section 4.6 ), it will search for the given file not only in the current directory, but also in any directories specified on the command line by the use of the - i option. Therefore you can include files from a macro library, for example, by typing (As usual, a space between - i and the path name is allowed, and optional). NASM, in the interests of complete source-code portability, does not understand the file naming conventions of the OS it is running on the string you provide as an argument to the - i option will be prepended exactly as written to the name of the include file. Therefore the trailing backslash in the above example is necessary. Under Unix, a trailing forward slash is similarly necessary. (You can use this to your advantage, if youre really perverse, by noting that the option - ifoo will cause include bar. i to search for the file foobar. i. ) If you want to define a standard include search path, similar to /usr/include on Unix systems, you should place one or more - i directives in the NASMENV environment variable (see section 2.1.20 ). For Makefile compatibility with many C compilers, this option can also be specified as - I. NASM allows you to specify files to be pre-included into your source file, by the use of the - p option. So running is equivalent to running nasm myfile. asm and placing the directive include myinc. inc at the start of the file. For consistency with the - I. - D and - U options, this option can also be specified as - P. Just as the - p option gives an alternative to placing include directives at the start of a source file, the - d option gives an alternative to placing a define directive. You could code as an alternative to placing the directive at the start of the file. You can miss off the macro value, as well: the option - dFOO is equivalent to coding define FOO. This form of the directive may be useful for selecting assembly-time options which are then tested using ifdef. for example - dDEBUG. For Makefile compatibility with many C compilers, this option can also be specified as - D. The - u option undefines a macro that would otherwise have been pre-defined, either automatically or by a - p or - d option specified earlier on the command lines. For example, the following command line: would result in FOO not being a predefined macro in the program. This is useful to override options specified at a different point in a Makefile. For Makefile compatibility with many C compilers, this option can also be specified as - U. NASM allows the preprocessor to be run on its own, up to a point. Using the - e option (which requires no arguments) will cause NASM to preprocess its input file, expand all the macro references, remove all the comments and preprocessor directives, and print the resulting file on standard output (or save it to a file, if the - o option is also used). This option cannot be applied to programs which require the preprocessor to evaluate expressions which depend on the values of symbols: so code such as will cause an error in preprocess-only mode. If NASM is being used as the back end to a compiler, it might be desirable to suppress preprocessing completely and assume the compiler has already done it, to save time and increase compilation speeds. The - a option, requiring no argument, instructs NASM to replace its powerful preprocessor with a stub preprocessor which does nothing. NASM defaults to being a two pass assembler. This means that if you have a complex source file which needs more than 2 passes to assemble correctly, you have to tell it. Using the - O option, you can tell NASM to carry out multiple passes. The syntax is: - O0 strict two-pass assembly, JMP and Jcc are handled more like v0.98, except that backward JMPs are short, if possible. Immediate operands take their long forms if a short form is not specified. - O1 strict two-pass assembly, but forward branches are assembled with code guaranteed to reach may produce larger code than - O0, but will produce successful assembly more often if branch offset sizes are not specified. Additionally, immediate operands which will fit in a signed byte are optimised, unless the long form is specified. - On multi-pass optimization, minimize branch offsets also will minimize signed immediate bytes, overriding size specification when the strict keyword hasnt been used (see section 3.7 ). If 2 lt n lt 3, then there are 5 n passes, otherwise there are n passes. Note that this is a capital O, and is different from a small o, which is used to specify the output format. See section 2.1.1. NASM includes a limited form of compatibility with Borlands TASM. When NASMs - t option is used, the following changes are made: local labels may be prefixed with instead of. TASM-style response files beginning with may be specified on the command line. This is different from the - resp style that NASM natively supports. size override is supported within brackets. In TASM compatible mode, a size override inside square brackets changes the size of the operand, and not the address type of the operand as it does in NASM syntax. Por exemplo. mov eax, DWORD val is valid syntax in TASM compatibility mode. Note that you lose the ability to override the default address type for the instruction. arg preprocessor directive is supported which is similar to TASMs ARG directive. local preprocessor directive stacksize preprocessor directive unprefixed forms of some directives supported ( arg. elif. else. endif. if. ifdef. ifdifi. ifndef. include. local ) more. For more information on the directives, see the section on TASM Compatiblity preprocessor directives in section 4.9. NASM can observe many conditions during the course of assembly which are worth mentioning to the user, but not a sufficiently severe error to justify NASM refusing to generate an output file. These conditions are reported like errors, but come up with the word warning before the message. Warnings do not prevent NASM from generating an output file and returning a success status to the operating system. Some conditions are even less severe than that: they are only sometimes worth mentioning to the user. Therefore NASM supports the - w command-line option, which enables or disables certain classes of assembly warning. Such warning classes are described by a name, for example orphan-labels you can enable warnings of this class by the command-line option - worphan-labels and disable it by - w-orphan-labels. The suppressible warning classes are: macro-params covers warnings about multi-line macros being invoked with the wrong number of parameters. This warning class is enabled by default see section 4.3.1 for an example of why you might want to disable it. orphan-labels covers warnings about source lines which contain no instruction but define a label without a trailing colon. NASM does not warn about this somewhat obscure condition by default see section 3.1 for an example of why you might want it to. number-overflow covers warnings about numeric constants which dont fit in 32 bits (for example, its easy to type one too many Fs and produce 0x7ffffffff by mistake). This warning class is enabled by default. Typing NASM - v will display the version of NASM which you are using, and the date on which it was compiled. You will need the version number if you report a bug. If you define an environment variable called NASMENV. the program will interpret it as a list of extra command-line options, which are processed before the real command line. You can use this to define standard search directories for include files, by putting - i options in the NASMENV variable. The value of the variable is split up at white space, so that the value - s - ic:nasmlib will be treated as two separate options. However, that means that the value - dNAMEmy name wont do what you might want, because it will be split at the space and the NASM command-line processing will get confused by the two nonsensical words - dNAMEmy and name. To get round this, NASM provides a feature whereby, if you begin the NASMENV environment variable with some character that isnt a minus sign, then NASM will treat this character as the separator character for options. So setting the NASMENV variable to the value - s-ic:nasmlib is equivalent to setting it to - s - ic:nasmlib. but - dNAMEmy name will work. This environment variable was previously called NASM. This was changed with version 0.98.31. If youre used to writing programs with MASM, or with TASM in MASM-compatible (non-Ideal) mode, or with a86. this section attempts to outline the major differences between MASMs syntax and NASMs. If youre not already used to MASM, its probably worth skipping this section. One simple difference is that NASM is case-sensitive. It makes a difference whether you call your label foo. Foo or FOO. If youre assembling to DOS or OS/2.OBJ files, you can invoke the UPPERCASE directive (documented in section 6.2 ) to ensure that all symbols exported to other code modules are forced to be upper case but even then, within a single module, NASM will distinguish between labels differing only in case. NASM was designed with simplicity of syntax in mind. One of the design goals of NASM is that it should be possible, as far as is practical, for the user to look at a single line of NASM code and tell what opcode is generated by it. You cant do this in MASM: if you declare, for example, then the two lines of code generate completely different opcodes, despite having identical-looking syntaxes. NASM avoids this undesirable situation by having a much simpler syntax for memory references. The rule is simply that any access to the contents of a memory location requires square brackets around the address, and any access to the address of a variable doesnt. So an instruction of the form mov ax, foo will always refer to a compile-time constant, whether its an EQU or the address of a variable and to access the contents of the variable bar. you must code mov ax, bar. This also means that NASM has no need for MASMs OFFSET keyword, since the MASM code mov ax, offset bar means exactly the same thing as NASMs mov ax, bar. If youre trying to get large amounts of MASM code to assemble sensibly under NASM, you can always code idefine offset to make the preprocessor treat the OFFSET keyword as a no-op. This issue is even more confusing in a86. where declaring a label with a trailing colon defines it to be a label as opposed to a variable and causes a86 to adopt NASM-style semantics so in a86. mov ax, var has different behaviour depending on whether var was declared as var: dw 0 (a label) or var dw 0 (a word-size variable). NASM is very simple by comparison: everything is a label. NASM, in the interests of simplicity, also does not support the hybrid syntaxes supported by MASM and its clones, such as mov ax, tablebx. where a memory reference is denoted by one portion outside square brackets and another portion inside. The correct syntax for the above is mov ax, tablebx. Likewise, mov ax, es:di is wrong and mov ax, es:di is right. NASM, by design, chooses not to remember the types of variables you declare. Whereas MASM will remember, on seeing var dw 0. that you declared var as a word-size variable, and will then be able to fill in the ambiguity in the size of the instruction mov var,2. NASM will deliberately remember nothing about the symbol var except where it begins, and so you must explicitly code mov word var,2. For this reason, NASM doesnt support the LODS. MOVS. STOS. SCAS. CMPS. INS. or OUTS instructions, but only supports the forms such as LODSB. MOVSW. and SCASD. which explicitly specify the size of the components of the strings being manipulated. As part of NASMs drive for simplicity, it also does not support the ASSUME directive. NASM will not keep track of what values you choose to put in your segment registers, and will never automatically generate a segment override prefix. NASM also does not have any directives to support different 16-bit memory models. The programmer has to keep track of which functions are supposed to be called with a far call and which with a near call, and is responsible for putting the correct form of RET instruction ( RETN or RETF NASM accepts RET itself as an alternate form for RETN ) in addition, the programmer is responsible for coding CALL FAR instructions where necessary when calling external functions, and must also keep track of which external variable definitions are far and which are near. NASM uses different names to refer to floating-point registers from MASM: where MASM would call them ST(0). ST(1) and so on, and a86 would call them simply 0. 1 and so on, NASM chooses to call them st0. st1 etc. As of version 0.96, NASM now treats the instructions with nowait forms in the same way as MASM-compatible assemblers. The idiosyncratic treatment employed by 0.95 and earlier was based on a misunderstanding by the authors. For historical reasons, NASM uses the keyword TWORD where MASM and compatible assemblers use TBYTE. NASM does not declare uninitialised storage in the same way as MASM: where a MASM programmer might use stack db 64 dup (). NASM requires stack resb 64. intended to be read as reserve 64 bytes. For a limited amount of compatibility, since NASM treats. as a valid character in symbol names, you can code. equ 0 and then writing dw. will at least do something vaguely useful. DUP is still not a supported syntax, however. In addition to all of this, macros and directives work completely differently to MASM. See chapter 4 and chapter 5 for further details.

No comments:

Post a Comment