Pergunta

Estou lendo o livro intitulado "Introdução à linguagem assembly 80x86 e arquitetura de computadores", de Richard C.Detmer e na página 59 fala sobre o BYTE diretiva em linguagem assembly e usando-a para caracteres e strings.Aqui está o texto:

"Além dos operandos numéricos, o BYTE A diretiva permite operandos de caracteres com um único caractere ou operandos de string com muitos caracteres.Apóstrofos (') ou aspas (") podem ser usados ​​para designar caracteres ou delimitar strings.Devem estar em pares;você não pode colocar um apóstrofo à esquerda e aspas à direita.Uma string delimitada por apóstrofos pode conter aspas, e uma string delimitada por aspas pode conter apóstrofos, possibilitando ter strings contendo esses caracteres especiais."

Isso é muito compreensível, mas minha curiosidade é a BYTE diretiva porque pensei que ela só poderia conter um único byte, oito bits.Eu fiz um teste e se eu dissesse

string BYTE "HelloWorld"

ele seria compilado, é claro, mas se você verificasse o hexadecimal, perceberia que não é apenas um único byte, mas vários bytes.Olhando para uma tabela ascii já sabemos que um único caractere é um byte.Então, como podemos ter cordas?Tentei aplicar isso com números.Conhecemos o alcance do BYTE diretiva é de -128 a 255.Eu tentei este código:

number BYTE 9987

quando tentei compilar e executar, recebi um erro porque é claro que 9987 era maior que um byte.Mas por que as strings são imunes a isso?Por que pode o BYTE diretiva contém mais de um byte nos contextos de strings, mas não faz o mesmo com números?

Eu imagino que quando compilei e executei a primeira instrução de código listada, teria o mesmo erro da segunda.Por que a “regra” foi quebrada aqui?

-Dan

Foi útil?

Solução

Observe que não existe uma sintaxe única em assembler; programas diferentes podem usar sintaxes diferentes.Você deve consultar o manual do seu montador.

Dito isto, a constante de string geralmente é apenas uma notação abreviada para cada um dos caracteres separadamente, e o BYTE A diretiva permite que vários itens sejam definidos de uma só vez.

Então, por exemplo, BYTE 1, 2, 3, 4 é válido e define 4 bytes, e seu string BYTE "HelloWorld" é equivalente a string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' e define 10 bytes.A razão pela qual você não recebe um erro é porque cada caractere por si só cabe em um byte.

Alguns montadores nem permitem literais de string em BYTE ou diretivas equivalentes, eles possuem diretivas especializadas para strings, por exemplo .string ou .ascii.

Outras dicas

O BYTE A diretiva diz ao montador para reservar um bloco de armazenamento e lembrar seu comprimento em bytes.O comprimento é determinado pelo número de bytes no inicializador, que podem ser números entre 0-255 decimais ou caracteres entre aspas simples.Strings são comuns em linguagens de programação e geralmente são consideradas matrizes de caracteres em bytes consecutivos na memória.Como conveniência para o programador, o montador permite reservar uma sequência de bytes inicializados em uma sequência de caracteres, especificando a sequência entre aspas simples ou duplas.Estes são equivalentes

string1 BYTE 'H', 'e', 'l', 'l', 'o'

ou

string1 BYTE 'Hello'

Alguns montadores possuem diretivas diferentes para isso, por exemplo o Oracle Solaris x86 Assembly Language possui um

  • .byte diretiva que leva apenas bytes
  • .ascii diretiva que recebe uma string que não será terminada em NUL
  • .string diretiva que usa uma string que will ser encerrado em NUL
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top