Netwide assembleer binary options


O Netwide Assembler: NASM O Netwide Disassembler, NDISASM O Netwide Disassembler é um pequeno programa complementar ao Netwide Assembler, NASM. Parecia uma vergonha ter um montador x86, completo com uma tabela de instruções completa, e não fazer o máximo de uso possível, então heres um desassemblador que compartilha a tabela de instruções (e alguns outros bits de código) com o 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 o 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 man 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 que você se lembre de especificar com qual ele deve trabalhar. Se nenhuma opção - b estiver presente, o 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 informa o número da 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 arquivo DOS corretamente, um desassimificador deve assumir que a primeira instrução no arquivo é carregada no endereço 0x100. Em vez de zero. NDISASM, que assume, por padrão, que qualquer arquivo que você fornece é carregado em zero, portanto, precisará ser informado disso. 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ê esteja desmontando um arquivo que contém alguns dados que não é o código da máquina e, em seguida, contém algum código de máquina. O NDISASM arduzará fielmente através da seção de dados, produzindo instruções da máquina onde quer que seja possível (embora a maioria deles pareça bizarra, e alguns podem ter prefixos incomuns, por exemplo, FS OR AX, 0x240A) e gerando instruções DB sempre com tanta frequência se estiver totalmente perplexo . 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 lidar com 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 estiver pensando em gerar uma instrução que faria com que ele pulasse sobre um ponto de sincronização, descartará essa instrução e emitirá um db em vez disso. Então, começará a desmontar exatamente 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. Portanto, 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 necessário, 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 e, em seguida, o resto do código. Portanto, há muitas chances de NDISASM estar desalinhado quando os dados terminam e o 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 chamada relativa ao PC que encaminhe para a frente que o NDISASM encontra. (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 os saltos relativos ao 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 colocará automaticamente os pontos de sincronização em todos os lugares certos e o salvará de ter que colocar pontos 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 o impede de declarar pontos de sincronização manuais: ele apenas adiciona gerados automaticamente aos que você fornece. É perfeitamente possível especificar - i e algumas opções - s. Outra ressalva com o modo de sincronização automática é que se, por algum acidente desagradável, algo em sua seção de dados se desmontar para uma instrução de chamada ou salto do PC, o NDISASM pode colocar obedientemente um ponto de sincronia em um lugar totalmente aleatório, por exemplo no Meio de uma das instruções na seção de código. Então você pode acabar com uma desmontagem errada 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 ignora um cabeçalho no arquivo, ignorando os primeiros N bytes. Isso significa que o cabeçalho não é contado para o deslocamento da desmontagem: se você der - 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 existem erros conhecidos. No entanto, qualquer um que você encontrar, com remendos, se possível, deve ser enviado para nasm-bugslists. sourceforge. Ou para o site de desenvolvedores no nasm. us e bem tentar corrigi-los. Sentir-se livre para enviar contribuições e novos recursos também. O Netwide Assembler: NASM Como a maioria dos montadores, cada linha de origem do NASM contém (a menos que seja uma macro, uma diretiva de pré-processador ou uma diretiva de montagem: veja o capítulo 4 e o capítulo 5) alguma combinação de Os quatro campos Como de costume, a maioria destes campos são opcionais, a presença ou ausência de qualquer combinação de um rótulo, uma instrução e um comentário são permitidos. Obviamente, o campo operando é requerido ou proibido pela presença e natureza do campo de instrução. NASM não impõe restrições ao espaço em branco dentro de uma linha: os rótulos podem ter espaço em branco antes deles, ou as instruções podem não ter espaço antes deles, ou qualquer coisa. O cólon após uma etiqueta também é opcional. (Note que isso significa que se você pretende codificar lodsb sozinho em uma linha, e digite lodab por acidente, então thats ainda uma linha de origem válida que não faz nada, mas define um rótulo. Executando NASM com a opção de linha de comando - worphan-rótulos Fará com que ele avise você se você definir um rótulo sozinho em uma linha sem um cólon à direita.) Caracteres válidos em rótulos são letras, números,. . . . e. Os únicos caracteres que podem ser usados ​​como o primeiro caractere de um identificador são letras. (Com significado especial: ver secção 3.8), e. Um identificador também pode ser prefixado com a para indicar que se destina a ser lido como um identificador e não uma palavra reservada assim, se algum outro módulo com o qual você está vinculando define um símbolo chamado eax. Você pode se referir a eax em código NASM para distinguir o símbolo do registro. O campo de instruções pode conter qualquer instrução da máquina: instruções Pentium e P6, instruções FPU, instruções MMX e até instruções indocumentadas são suportadas. A instrução pode ser prefixada por LOCK. REP. REPE REPZ ou REPNE REPNZ. Da maneira usual. Predefinições explícitas de tamanho de endereço e operando-tamanho A16. A32. O16 e O32 são fornecidos - um exemplo de sua utilização é dado no capítulo 9. Você também pode usar o nome de um registro de segmento como um prefixo de instrução: codificação es mov bx, ax é equivalente a codificação mov es: bx, ax. Recomendamos a última sintaxe, uma vez que é consistente com outras características sintáticas da linguagem, mas para instruções como LODSB. Que não tem operandos e ainda pode exigir uma substituição de segmento, não há nenhuma maneira sintática limpa de proceder para além de es lodsb. Uma instrução não é necessária para usar um prefixo: prefixos como CS. A32. LOCK ou REPE podem aparecer em uma linha por si mesmos, e NASM apenas irá gerar o prefixo bytes. Além das instruções reais da máquina, o NASM também suporta várias pseudo-instruções, descritas na seção 3.2. Os operandos de instrução podem assumir uma série de formas: podem ser registros, descritos simplesmente pelo nome do registro (por exemplo, ax bp, ebx, cr0, NASM não usa a sintaxe de estilo de gás em que nomes de registro devem ser prefixados por um signo) , Ou podem ser endereços efetivos (ver seção 3.3), constantes (seção 3.4) ou expressões (seção 3.5). Para instruções de ponto flutuante, o NASM aceita uma ampla gama de sintaxes: você pode usar formulários de dois operandos como suportes MASM ou usar os formulários nativos de um único operando NASM na maioria dos casos. Os detalhes de todas as formas de cada instrução suportada são fornecidos no apêndice A. Por exemplo, você pode codificar: Quase qualquer instrução de ponto flutuante que faz referência à memória deve usar um dos prefixos DWORD. QWORD ou TWORD para indicar o tamanho do operando da memória a que se refere. Pseudo-instruções são coisas que, embora não sejam instruções reais da máquina x86, são usadas no campo de instruções de qualquer maneira, porque esse é o lugar mais conveniente para colocá-las. As pseudo-instruções atuais são DB. DW. DD. DQ e DT. Suas contrapartes não inicializadas RESB. RESW. RESD. RESQ e REST. O comando INCBIN, o comando EQU eo prefixo TIMES. DB. DW. DD. DQ e DT são usados, assim como no MASM, para declarar os dados inicializados no arquivo de saída. Eles podem ser invocados em uma ampla gama de maneiras: DQ e DT não aceitam constantes numéricas ou constantes de string como operandos. RESB. RESW. RESD. RESQ e REST são projetados para serem usados ​​na seção BSS de um módulo: eles declaram espaço de armazenamento não inicializado. Cada um tem um único operando, que é o número de bytes, palavras, palavras duplas ou qualquer outra coisa para reservar. Conforme indicado na seção 2.2.7. NASM não suporta a sintaxe MASMTASM de reservar espaço não inicializado escrevendo DW. Ou coisas semelhantes: isso é o que ele faz em vez disso. O operando para uma pseudo-instrução de tipo RESB é uma expressão crítica. Veja a seção 3.7. INCBIN é emprestado do antigo montador Amiga DevPac: ele inclui um arquivo binário verbatim no arquivo de saída. Isso pode ser útil para (por exemplo) incluindo gráficos e dados de som diretamente em um arquivo executável do jogo. Ele pode ser chamado de uma destas três formas: EQU define um símbolo para um dado valor constante: quando EQU é usado, a linha de origem deve conter um rótulo. A ação de EQU é definir o nome do rótulo dado para o valor de seu (somente) operando. Esta definição é absoluta, e não pode mudar mais tarde. Assim, por exemplo, define msglen como a constante 12. msglen não pode então ser redefinido mais tarde. Esta não é uma definição de pré-processador: o valor de msglen é avaliado uma vez. Usando o valor de (veja a seção 3.5 para uma explicação de) no ponto de definição, em vez de ser avaliado onde quer que seja referenciado e usando o valor no ponto de referência. Observe que o operando para um EQU também é uma expressão crítica (seção 3.7). O prefixo TIMES faz com que a instrução seja montada várias vezes. Isso está parcialmente presente como o equivalente de NASM da sintaxe DUP suportada por montadoras compatíveis com MASM, na medida em que você pode codificar ou coisas similares, mas TIMES é mais versátil do que isso. O argumento para TIMES não é apenas uma constante numérica, mas uma expressão numérica. Para que você possa fazer coisas como o que irá armazenar exatamente o suficiente espaços para fazer o comprimento total de buffer até 64. Finalmente, TIMES pode ser aplicado a instruções comuns, para que você possa código trivial desenrolou loops nele: Note que não há diferença efetiva Entre os tempos 100 resb 1 e resb 100. excepto que este último será montado cerca de 100 vezes mais rápido devido à estrutura interna do montador. O operando para TIMES. Como o EQU e os de RESB e amigos, é uma expressão crítica (seção 3.7). Observe também que TIMES não pode ser aplicado a macros: a razão para isso é que TIMES é processado após a fase de macro, que permite que o argumento para TIMES conter expressões como 64-buffer como acima. Para repetir mais de uma linha de código, ou uma macro complexa, use a diretiva de representante de pré-processamento. Um endereço eficaz é qualquer operando para uma instrução que faz referência à memória. Endereços efetivos, em NASM, têm uma sintaxe muito simples: eles consistem em uma expressão avaliando o endereço desejado, entre colchetes. Por exemplo: Qualquer coisa que não esteja de acordo com este sistema simples não é uma referência de memória válida no NASM, por exemplo, es: wordvarbx. Endereços efetivos mais complexos, como aqueles que envolvem mais de um registro, funcionam exatamente da mesma maneira: a NASM é capaz de fazer álgebra nesses endereços efetivos, de modo que coisas que não necessariamente parecem legais estão perfeitamente bem: Algumas formas de endereço efetivo Têm mais de uma forma montada na maioria desses casos NASM irá gerar a menor forma possível. Por exemplo, existem formas separadas para os endereços efetivos de 32 bits eax20 e eaxeax. E o NASM geralmente gerará o último com o argumento de que o primeiro exige quatro bytes para armazenar um deslize zero. NASM tem um mecanismo de insinuação que fará eaxebx e ebxeax para gerar diferentes opcodes isso é ocasionalmente útil porque esiebp e ebpesi têm diferentes registros de segmento padrão. No entanto, você pode forçar o NASM a gerar um endereço efetivo em uma forma específica pelo uso das palavras-chave BYTE. PALAVRA. DWORD e NOSPLIT. Se você precisar eax3 para ser montado usando um campo de deslocamento de palavra dupla em vez do byte NASM normalmente gerará, você pode codificar dword eax3. Da mesma forma, você pode forçar o NASM a usar um deslocamento de bytes para um pequeno valor que ele não viu na primeira passagem (veja a seção 3.7 para um exemplo de tal fragmento de código) usando byte eaxoffset. Como casos especiais, byte eax codificará eax0 com um deslocamento de byte de zero, e dword eax codificará com um deslocamento de palavra dupla de zero. A forma normal, eax. Será codificado sem campo de offset. Da mesma forma, NASM irá dividir eax2 em eaxeax porque isso permite que o campo de deslocamento para ser ausente e espaço para ser salvo de fato, ele também irá dividir eax2offset em eaxeaxoffset. Você pode combater esse comportamento pelo uso da palavra-chave NOSPLIT: nosplit eax2 forçará eax20 a ser gerado literalmente. NASM compreende quatro tipos diferentes de constante: numérico, caractere, seqüência de caracteres e ponto flutuante. Uma constante numérica é apenas um número. NASM permite que você especifique números em uma variedade de bases de números, em uma variedade de maneiras: você pode sufixo H. Q e B para hex, octal e binário, ou você pode prefixar 0x para hex no estilo de C, ou você pode Prefixo para hex no estilo de Borland Pascal. Note-se, no entanto, que o prefixo dobrar dever como um prefixo em identificadores (ver seção 3.1), portanto, um número hexadecimal prefixado com um sinal deve ter um dígito após o em vez de uma letra. Uma constante de caractere consiste em até quatro caracteres incluídos em aspas simples ou duplas. O tipo de citação não faz diferença para NASM, exceto, claro, que ao redor da constante com aspas simples permite que aspas duplas aparecem dentro dele e vice-versa. Uma constante de caractere com mais de um caractere será organizada com a ordem little-endian em mente: se você codificar, então a constante gerada não é 0x61626364. Mas 0x64636261. De modo que se você estivesse então para armazenar o valor na memória, seria lido abcd em vez de dcba. Este é também o sentido das constantes de caractere entendidas pela instrução CPUID do Pentium (ver seção A.22). Constantes de string são aceitáveis ​​apenas para algumas pseudo-instruções, ou seja, a família DB e INCBIN. Uma constante de cadeia parece uma constante de caractere, apenas mais. Ele é tratado como uma concatenação de constantes de caracteres de tamanho máximo para as condições. Então, o seguinte é equivalente: E os seguintes também são equivalentes: Observe que, quando usado como um operando para db. Uma constante como ab é tratada como uma string constante apesar de ser curta o suficiente para ser uma constante de caracteres, porque caso contrário db ab teria o mesmo efeito que db a. O que seria bobo. Da mesma forma, as constantes de três caracteres ou quatro caracteres são tratadas como strings quando são operandos para dw. Constantes de ponto flutuante são aceitáveis ​​apenas como argumentos para DD. DQ e DT. Eles são expressos na forma tradicional: dígitos, então um período, então opcionalmente mais dígitos, então opcionalmente um E seguido por um expoente. O período é obrigatório, de modo que NASM pode distinguir entre dd 1. que declara uma constante inteira e dd 1.0 que declara uma constante de ponto flutuante. NASM não pode fazer aritmética de tempo de compilação em constantes de ponto flutuante. Isso ocorre porque o NASM foi projetado para ser portátil - embora sempre gere código para ser executado em processadores x86, o próprio assembler pode ser executado em qualquer sistema com um compilador ANSI C. Portanto, o montador não pode garantir a presença de uma unidade de ponto flutuante capaz de manipular os formatos de número da Intel e, portanto, para que a NASM possa fazer aritmética flutuante, teria que incluir seu próprio conjunto completo de rotinas de ponto flutuante, Significativamente o tamanho do montador para muito pouco benefício. Expressões em NASM são semelhantes em sintaxe para aqueles em C. NASM não garante o tamanho dos inteiros utilizados para avaliar expressões em tempo de compilação: uma vez que NASM pode compilar e executar em sistemas de 64 bits com bastante alegria, não assumir que as expressões são avaliadas em Registros de 32 bits e assim tentar fazer uso deliberado de estouro de número inteiro. Pode não funcionar sempre. A única coisa que o NASM garantirá é o que é garantido pelo ANSI C: você sempre tem pelo menos 32 bits para trabalhar. O NASM suporta dois tokens especiais em expressões, permitindo que os cálculos envolvam a posição de montagem atual: the e tokens. Avalia a posição de montagem no início da linha que contém a expressão para que você possa codificar um loop infinito usando JMP. Avalia para o início da seção atual para que você possa dizer até que ponto na seção você está usando (-). Os operadores aritméticos fornecidos pela NASM são listados aqui, em ordem crescente de precedência. O operador dá um OR bit a bit, exatamente como executado pela instrução OU da máquina. O OR bit a bit é o operador aritmético de prioridade mais baixa suportado pelo NASM. Fornece a operação XOR bit a bit. O amplificador fornece a operação AND bit a bit. Ltlt dá um bit-shift para a esquerda, assim como faz em C. Assim 5ltlt3 avalia 5 vezes 8, ou 40. gtgt dá um bit-turno para a direita em NASM, tal mudança é sempre unsigned, de modo que o Os bits deslocados para dentro da extremidade esquerda são preenchidos com zero em vez de uma extensão de sinal do bit mais alto anterior. Os operadores e - fazem adição e subtração perfeitamente comuns. É o operador de multiplicação. E são ambos os operadores de divisão: é divisão sem assinatura e é divisão assinada. Da mesma forma, e fornecer assinado e assinado modulo operadores, respectivamente. NASM, como ANSI C, não fornece nenhuma garantia sobre a operação sensata do operador modulo assinado. Uma vez que o caractere é usado extensivamente pelo pré-processador de macro, você deve garantir que os operadores de módulo modulados e não assinados sejam seguidos de espaço em branco onde quer que apareçam. 3.5.7 Operadores Unários:. -. Os operadores de maior prioridade na gramática de expressão NASMs são aqueles que só se aplicam a um argumento. - nega seu operando, não faz nada (o seu fornecido para a simetria com -), calcula o complemento de seu operando, e SEG fornece o endereço do segmento de seu operando (explicado com mais detalhes na seção 3.6). Ao escrever grandes programas de 16 bits, que devem ser divididos em vários segmentos, muitas vezes é necessário ser capaz de se referir à parte do segmento do endereço de um símbolo. NASM suporta o operador SEG para executar esta função. O operador SEG retorna a base de segmento preferencial de um símbolo, definido como a base do segmento em relação à qual o deslocamento do símbolo faz sentido. Assim, o código irá carregar ES: BX com um ponteiro válido para o símbolo símbolo. As coisas podem ser mais complexas do que isso: já que os segmentos e grupos de 16 bits podem se sobrepor, você pode ocasionalmente querer se referir a algum símbolo usando uma base de segmento diferente da preferida. O NASM permite que você faça isso, pelo uso da palavra-chave WRT (com referência para). Então, você pode fazer coisas como carregar ES: BX com um ponteiro diferente, mas funcionalmente equivalente, ao símbolo de símbolo. O NASM suporta chamadas e saltos distantes (inter-segmento) por meio do segmento de chamada de sintaxe: deslocamento. Onde o segmento e o offset representam valores imediatos. Então, para chamar um procedimento distante, você pode codificar qualquer um dos (Os parênteses estão incluídos para clareza, para mostrar a análise pretendida das instruções acima. Não são necessárias na prática.) O NASM suporta o procedimento distante de chamada de sintaxe como um sinônimo para o Primeiro dos usos acima. O JMP funciona de forma idêntica à CALL nestes exemplos. Para declarar um ponteiro distante para um item de dados em um segmento de dados, você deve codificar NASM não suporta sinônimo conveniente para isso, embora você sempre pode inventar um usando o processador de macro. Uma limitação do NASM é que é um montador de duas passagens ao contrário de TASM e outros, sempre faz exatamente duas passagens de montagem. Portanto, ele é incapaz de lidar com arquivos de origem que são complexos o suficiente para exigir três ou mais passes. A primeira passagem é usada para determinar o tamanho de todo o código e dados montados, de modo que a segunda passagem, ao gerar todo o código, conheça todos os endereços de símbolos aos quais o código se refere. Então, uma coisa que o NASM não pode suportar é o código cujo tamanho depende do valor de um símbolo declarado após o código em questão. Por exemplo, o argumento para TIMES neste caso poderia igualmente avaliar legalmente qualquer coisa em tudo NASM irá rejeitar este exemplo porque ele não pode dizer o tamanho da linha TIMES quando vê-lo pela primeira vez. Ele também irá rejeitar firmemente o código ligeiramente paradoxal em que qualquer valor para o argumento TIMES é, por definição, incorreto NASM rejeita esses exemplos por meio de um conceito chamado uma expressão crítica. Que é definida como uma expressão cujo valor é necessário para ser computável na primeira passagem e que, portanto, deve depender apenas de símbolos definidos antes dela. O argumento para o prefixo TIMES é uma expressão crítica pelo mesmo motivo, os argumentos para a família RESB de pseudo-instruções também são expressões críticas. Expressões críticas também podem surgir em outros contextos: considere o seguinte código. Na primeira passagem, o NASM não pode determinar o valor de symbol1. Porque symbol1 é definido para ser igual a symbol2 que NASM hasnt visto ainda. Na segunda passagem, portanto, quando encontra a linha mov ax, symbol1. Ele é incapaz de gerar o código para ele porque ele ainda não sabe o valor de symbol1. Na próxima linha, veria novamente o EQU e seria capaz de determinar o valor de symbol1. Mas naquela época seria tarde demais. NASM evita esse problema definindo o lado direito de uma instrução EQU para ser uma expressão crítica, portanto, a definição de symbol1 seria rejeitada na primeira passagem. Existe um problema relacionado envolvendo referências avançadas: considere este fragmento de código. O NASM, ao passar um, deve calcular o tamanho da instrução mov eax, ebxoffset sem saber o valor do deslocamento. Não tem como saber que o deslocamento é pequeno o suficiente para se encaixar em um campo de deslocamento de um byte e que, portanto, poderia fugir com a geração de uma forma mais curta da codificação de endereço efetivo para tudo o que sabe, para passar um, o deslocamento poderia ser Um símbolo no segmento de código, e pode ser necessário o formulário completo de quatro bytes. Portanto, é forçado a calcular o tamanho da instrução para acomodar uma parte de endereço de quatro bytes. Na passagem dois, depois de ter tomado esta decisão, é agora forçado a honrá-lo e manter a instrução grande, de modo que o código gerado neste caso não é tão pequeno como poderia ter sido. Esse problema pode ser resolvido definindo o deslocamento antes de usá-lo, ou forçando o tamanho do byte no endereço efetivo codificando byte ebxoffset. NASM dá tratamento especial para símbolos começando com um período. Um rótulo que começa com um único período é tratado como um rótulo local, o que significa que está associado ao rótulo não local anterior. Assim, por exemplo: No fragmento de código acima, cada instrução JNE salta para a linha imediatamente antes dela, porque as duas definições de. loop são mantidas separadas em virtude de cada ser associado com o rótulo não local anterior. Esta forma de manipulação de rótulo local é emprestada do antigo montador Amiga DevPac no entanto, NASM vai um passo adiante, em permitir o acesso a rótulos locais de outras partes do código. Isso é conseguido por meio da definição de um rótulo local em termos do rótulo não local anterior: a primeira definição de. loop acima está realmente definindo um símbolo chamado label1.loop. E o segundo define um símbolo chamado label2.loop. Então, se você realmente precisasse, você poderia escrever às vezes é útil - em uma macro, por exemplo - para poder definir um rótulo que pode ser referenciado de qualquer lugar, mas que não interfere com o mecanismo de etiqueta local normal. Esse rótulo não pode ser não-local porque iria interferir com definições subsequentes de, e referências a, rótulos locais e não pode ser local porque a macro que o definiu wouldnt conhece o rótulo nome completo. O NASM, portanto, introduz um terceiro tipo de rótulo, que provavelmente só é útil nas definições de macro: se um rótulo começar com o prefixo especial. . Então ele não faz nada para o mecanismo de rótulo local. Então você pode codificar o NASM tem a capacidade de definir outros símbolos especiais começando com um período duplo: por exemplo. O início é usado para especificar o ponto de entrada no formato de saída obj (veja a seção 6.2.6). Nunca experimente quebras de 404 novamente Saiba mais. Este pacote foi aprovado pelo moderador ferventcoder em 8182017. O Netwide Assembler, NASM, é um 80x86 e x86-64 montador projetado para a portabilidade e modularidade. Ele suporta uma variedade de formatos de arquivo de objeto, incluindo Linux e BSD a. out, ELF, COFF, Mach-O, Microsoft OBO de 16 bits, Win32 e Win64. Ele também produzirá arquivos binários simples. Sua sintaxe é projetada para ser simples e fácil de entender, semelhante ao Intels, mas menos complexo. Ele suporta todas as extensões arquitetônicas x86 atualmente conhecidas, e tem forte suporte para macros. Para instalar o NetWide Assembler, execute o seguinte comando a partir da linha de comando ou do PowerShell: C: gt choco install nasm Para atualizar o NetWide Assembler, execute o seguinte comando a partir da linha de comando ou do PowerShell: C: gt choco upgrade nasm Virus Scan Results In Casos em que o malware real é encontrado, os pacotes estão sujeitos a remoção. Software às vezes tem falsos positivos. Os moderadores não necessariamente validam a segurança do software subjacente, apenas que um pacote recupera o software do ponto de distribuição oficial e / ou valida o software embutido contra o ponto de distribuição oficial (onde os direitos de distribuição permitem a redistribuição). O Chocolatey Pro fornece proteção de tempo de execução contra possíveis malwares. Dependências Este pacote não possui dependências. Autor (es) do (s) Software Autor (es) Simon Tatham e Julian Hall e agora é mantido por uma equipe liderada por H. Peter Anvin. Copyright 1996-2017 Autores da NASM - Todos os direitos reservados. Discussão para o pacote NetWide Assembler Regras básicas: Esta discussão é apenas sobre NetWide Assembler eo pacote NetWide Assembler. Se você tiver feedback para a Chocolatey, entre em contato com o grupo do google. Esta discussão irá transportar várias versões. Se você tiver um comentário sobre uma versão específica, observe que em seus comentários. Os mantenedores deste Pacote Chocolatey serão notificados sobre novos comentários que são publicados neste tópico Disqus, no entanto, não é uma garantia de que você receberá uma resposta. Se você não receber as respostas dos mantenedores depois de postar uma mensagem abaixo, faça o acompanhamento usando o link no lado esquerdo desta página ou siga este link para contatar os mantenedores. Se ainda não ouvir nada, siga o processo de triagem do pacote. Diga-nos o que você gosta sobre o pacote ou NetWide Assembler, ou diga-nos o que precisa de melhoria. Compartilhe suas experiências com o pacote, ou configurações extras ou achados que você encontrou. Se você usar um url, o comentário será sinalizado para moderação até youve sido whitelisted. Os comentários moderados da Disqu são aprovados numa programação semanal, se não antes. Pode demorar entre 1-5 dias para o seu comentário aparecer. Seja o primeiro a saber sobre os próximos recursos, lançamentos de segurança, e notícias sobre Chocolatey. The Netwide Assembler: NASM A Netwide Assembler, NASM, é um 80x86 montador projetado para portabilidade e modularidade. Ele suporta uma variedade de formatos de arquivos de objetos, incluindo Linux a. out e ELF, NetBSDFreeBSD, COFF, Microsoft de 16 bits OBJ e Win32. Ele também produzirá arquivos binários simples. Sua sintaxe é projetada para ser simples e fácil de entender, semelhante à de Intel, mas menos complexa. Ele suporta os opcodes Pentium, P6 e MMX e possui capacidade de macro. 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. Gás é livre, e as portas sobre DOS e Unix, mas não é muito bom, uma vez que o seu concebido 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 is Linux-specific, and (my version at least) doesnt seem to have much (or any) documentation. MASM isnt very good, and its expensive, and it runs only under DOS. TASM is better, but still strives for MASM compatibility, which means millions of directives and tons of red tape. And its syntax is essentially MASMs, with the contradictions and quirks that entails (although it sorts out some of those by means of Ideal mode). Its expensive too. And its DOS-only. So here, for your coding pleasure, is NASM. At present its still in prototype stage - we dont promise that it can outperform any of these assemblers. But please, please send us bug reports, fixes, helpful information, and anything else you can get your hands on (and thanks to the many people whove done this already You all know who you are), and well improve it out of all recognition. Novamente. Please see the file Licence. supplied as part of any NASM distribution archive, for the licence conditions under which you may use NASM. The current version of NASM (since 0.98) are maintained by H. Peter Anvin, hpazytor. If you want to report a bug, please read section 10.2 first. If you dont have Usenet access, or would rather be informed by e-mail when new releases come out, you can subscribe to the nasm-announce email list by sending an email containing the line subscribe nasm-announce to majordomolinux. kernel. org. If you want information about NASM beta releases, please subscribe to the nasm-beta email list by sending an email containing the line subscribe nasm-beta to majordomolinux. kernel. org. Once youve obtained the DOS archive for NASM, nasmXXX. zip (where XXX denotes the version number of NASM contained in the archive), unpack it into its own directory (for example c:nasm ). The archive will contain four executable files: the NASM executable files nasm. exe and nasmw. exe. and the NDISASM executable files ndisasm. exe and ndisasmw. exe. In each case, the file whose name ends in w is a Win32 executable, designed to run under Windows 95 or Windows NT Intel, and the other one is a 16-bit DOS executable. The only file NASM needs to run is its own executable, so copy (at least) one of nasm. exe and nasmw. exe to a directory on your PATH, or alternatively edit autoexec. bat to add the nasm directory to your PATH. (If youre only installing the Win32 version, you may wish to rename it to nasm. exe .) Thats it - NASM is installed. You dont need the nasm directory to be present to run NASM (unless youve added it to your PATH ), so you can delete it if you need to save space however, you may want to keep the documentation or test programs. If youve downloaded the DOS source archive, nasmXXXs. zip. the nasm directory will also contain the full NASM source code, and a selection of Makefiles you can (hopefully) use to rebuild your copy of NASM from scratch. The file Readme lists the various Makefiles and which compilers they work with. Note that the source files insnsa. c. insnsd. c. insnsi. h and insnsn. c are automatically generated from the master instruction table insns. dat by a Perl script the file macros. c is generated from standard. mac by another Perl script. Although the NASM 0.98 distribution includes these generated files, you will need to rebuild them (and hence, will need a Perl interpreter) if you change insns. dat. standard. mac or the documentation. It is possible future source distributions may not include these files at all. Ports of Perl for a variety of platforms, including DOS and Windows, are available from cpan. org. Once youve obtained the Unix source archive for NASM, nasm-X. XX. tar. gz (where X. XX denotes the version number of NASM contained in the archive), unpack it into a directory such as usrlocalsrc. The archive, when unpacked, will create its own subdirectory nasm-X. XX. NASM is an auto-configuring package: once youve unpacked it, cd to the directory its been unpacked into and type. configure. This shell script will find the best C compiler to use for building NASM and set up Makefiles accordingly. Once NASM has auto-configured, you can type make to build the nasm and ndisasm binaries, and then make install to install them in usrlocalbin and install the man pages nasm.1 and ndisasm.1 in usrlocalmanman1. Alternatively, you can give options such as --prefix to the configure script (see the file INSTALL for more details), or install the programs yourself. NASM also comes with a set of utilities for handling the RDOFF custom object-file format, which are in the rdoff subdirectory of the NASM archive. You can build these with make rdf and install them with make rdfinstall. if you want them. If NASM fails to auto-configure, you may still be able to make it compile by using the fall-back Unix makefile Makefile. unx. Copy or rename that file to Makefile and try typing make. There is also a Makefile. unx file in the rdoff subdirectory.

Comments

Popular Posts