Jump to content

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


Pedro Otavio

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

  • 1 year later...
Em 28/04/2022 em 10:43, Pedro Otavio disse:

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/

Compreendi a explicação do Fernando, mas quando usar dw, dq...?

Tenho essa mesma dúvida. Vou usar um trecho que voce (Pedro Otavio) citou:

...E caso fosse então dw, ao invés de db, seria despejado na "variável" msg de 2 em 2 bytes?"

Obrigado amigos!

Link to comment
Share on other sites

Em 27/06/2023 em 18:29, Raphael Silva disse:

Compreendi a explicação do Fernando, mas quando usar dw, dq...?

Tenho essa mesma dúvida. Vou usar um trecho que voce (Pedro Otavio) citou:

...E caso fosse então dw, ao invés de db, seria despejado na "variável" msg de 2 em 2 bytes?"

Obrigado amigos!

Quando você achar que deveria usar. Não existe "o momento certo" para usar, é você que decide isso. Quando você quiser valores de 2 bytes de tamanho, use `dw`. Quando quiser de 4 bytes, use `dd`. Quando quiser de 8 bytes, use `dq` e assim por diante.

Ninguém pode tomar essa decisão além do próprio programador que está escrevendo o código. Portanto só você sabe quando usar. Quando você vai precisar de valores de 4 bytes de tamanho ao invés de 1 byte só? Ou de 8 bytes? Ou 2 bytes? Você que sabe.

Veja o exemplo no print abaixo para entender o que essas pseudo-instruções fazem. Elas basicamente despejam os dados exatamente no lugar onde elas foram usadas. O que pode ser visto usando um visualizador hexadecimal como o `hd` (hexdump).

image.thumb.png.c15b3383aed417575c3d6888f9cdb39b.png

  • Curtir 1
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.   Paste as plain text instead

  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.

  • Recently Browsing   0 members

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