Jump to content

Dúvidas sobre alocação de memória e diretivas DB, DW, DD, DQ,...


Pedro Otavio
 Share

Recommended Posts

Boa tarde, galera!

Tenho acompanhado o livro "Aprendendo Assembly" disponibilizado aqui no Mente Binária. https://mentebinaria.gitbook.io/assembly/

Quero primeiramente parabenizar a iniciativa de disponibilizar este conteúdo, assim como muitos outros. Acho incrível a filosofia de compartilhar o conhecimento de forma "open source", pretendo fazer o mesmo assim que solidificar meus conhecimentos. 🙂

Bom, sou iniciante em Assembly e estou com algumas dúvidas que estão tirando o meu sono...

Não entendi muito bem o conceito das diretivas "db, dw, dd, dq,...". Andei pesquisando em outras fontes, porém essa névoa continua a pairar sobre meus pensamentos. Pelo que entendi até agora, essas diretivas tem o propósito de alocação de bytes em memória, db corresponde a 1 byte, dw corresponde a 2 bytes e assim por diante. Porém, não estou conseguindo assimilar como a instrução abaixo pode comportar na "variável" msg uma string contendo 14 caracteres sendo que db aloca somente um byte.

    msg: db 'Hello world!', 0xA, 0xD

Talvez pelo meu entendimento de alocação de memória em alto nível (como em C) esteja atrapalhando o meu entendimento sobre como essas diretivas funcionam. Meu pensamento é: "Ora, se db aloca somente 1 byte e cada caracter possui 1 byte, como pode comportar uma string contendo pelo menos 14 bytes se msg foi alocado com somente 1 byte?". Penso também: "Será então que a diretiva db é utilizada para despejar byte por byte na memória de rótulo msg? E caso fosse então dw, ao invés de db, seria despejado na "variável" msg de 2 em 2 bytes?"

Se alguém puder me jogar uma luz, ficarei muito agradecido! Peço também desculpas pela minha ignorância. Abraço a todos! o/

Link to comment
Share on other sites

  • Administrators

Opa, tudo bem?

Muito boas suas perguntas. 🙂

Essas diretivas definem dados. Por exemplo, da documentação do FASM:

image.png.bde3e873655efe39d98dbedde04b2fd2.png

Mas elas não estão limitadas apenas ao tamanho de um dado. Você também pode definir vários dados, que serão armazenados em sequência (conceito de array). Por exemplo, a seguinte diretiva define três bytes em sequência e associa o rótulo dados a ele (essa associação é como o nome de uma variável: só existe no código-fonte):

dados: db 0x41, 0x42, 0x43

Outra sintaxe possível para definição dos mesmos três bytes é:

dados: db 'A', 'B', 'C'

Ou ainda:

dados: db 'ABC'

Ou:

dados: db 'AB', 'C'

Ou:

dados: db 'AB', 0x43

E por aí vai...

É o mesmo que, em C, fazer algo como:

char *dados = "ABC";

Ou seja, o rótulo em Assembly será somente o endereço no segmento de dados do programa.

Abraço!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...