Ir para conteúdo

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


Pedro Otavio

Posts Recomendados

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

  • 1 ano depois...
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 para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...