Pedro Otavio Posted April 28, 2022 Posted April 28, 2022 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/ Quote
Administrators Fernando Mercês Posted April 28, 2022 Administrators Posted April 28, 2022 Opa, tudo bem? Muito boas suas perguntas. ? Essas diretivas definem dados. Por exemplo, da documentação do FASM: 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! Quote
Raphael Silva Posted June 27, 2023 Posted June 27, 2023 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! Quote
Felipe.Silva Posted June 29, 2023 Posted June 29, 2023 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). 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.