-
Postagens
1.510 -
Registro em
-
Última visita
-
Dias Ganhos
164
Tipo de Conteúdo
Fóruns
Treinamentos
Notícias
Artigos
Contribuindo
Profissões
Materiais de estudo
Pesquisa
Downloads
Loja
Eventos
Blogs
Galeria
Posts postados por Fernando Mercês
-
-
É outro label sim, porque tem dois underscores. Mas não vejo onde ele está sendo definido. Talvez esteja vazio? Como fica no binário depois de assemblado?
Abraço!
-
3 horas atrás, Thailsson Baumstark disse:
Minha dúvida está em como fazer a sintaxe do NASM funcionar
Não acho que dê. Que eu saiba, o NASM não suporta a sintaxe da AT&T usada pelo GAS. Eu insistiria no seu exemplo anterior com o ld mesmo. ?
Abraço.
-
Ah, você pode tentar linkar com o ld também:
ld -o assembly assembly.obj
-
Olha, eu não tenho certeza, mas acho que o NASM requer símbolos globais começando com underscore. De qualquer forma, como você tá usando o gcc, acho que ele vai buscar a main. Então tenta aí:
bits 64 global main main: mov eax, 777 ret
Ou tenta com _main ao invés de main (altera nos dois lugares).
Boa sorte!
-
Envia o código também, pra gente dar uma olhada. ?
-
Oi Marvin,
Acho que idade não tem grilo algum. Tá tudo certo.
Sobre entrar para a área de segurança, acho que o caminho é por computação tradicional, senão fica muito inconsistente. Recomendo você buscar um curso de Ciência da Computação. É bem capaz que no terceiro ano você já consiga um emprego na área. Aí você continua os estudos e vai ter uma formação forte para uma carreira sólida. ?
Vale também dar uma olhada no nosso Guia de Estudos e Profissões em https://menteb.in/guia também, para se guiar no que estudar no auto-estudo.
Conta com a gente!
Abraço!
-
Opa, a gente tem bastante coisa sobre Assembly aqui mesmo: https://www.mentebinaria.com.br/search/?q=assembly&quick=1&type=downloads_file
A maioria dos autores usa a sintaxe Intel, mas pode ter algumas comparações lá. Dá uma olhada. ?
Valeu!
-
51 minutos atrás, SpaceHoll0w disse:
pior falta o "eax, "
kkkkk então tudo que eu falei você aplica na origem. E o registrador EAX é o destino, no caso. ?
44 minutos atrás, SpaceHoll0w disse:vlw mano!
é nóis!
-
Opa, a instrução não tá completa aí.. falta o segundo argumento do MOV, mas é o seguinte:
A sintaxe Intel, que é essa que você usou o exemplo, funciona assim:
instrução argumento1, argumento2, argumento3...
No caso do MOV, que é uma instrução de cópia de dados e por isso possui dois argumentos, o destino vem primeiro e a origem depois. Então é:
mov destino, origem
Então no seu exemplo:
mov dword ptr ds:[eax + 0x30]
Ou seja, você colocou só o destino, por isso a instrução tá incompleta, mas tudo bem, talvez sua dúvida seja no destino mesmo. Esse destino aí diz o seguinte:
Copie uma DWORD (palavra dupla, ou seja, 32-bits/4 bytes) para o endereço apontado pelo registrador EAX, mas some 0x30 (48 em decimal) a este endereço antes. Ou seja, suponha que tenhamos o valor 0x950000 no registrador EAX e a instrução completa seja:
mov dword ptr ds:[eax + 0x30], 0xffffffff
Após executar essa instrução, o valor 0xffffffff será copiado para o endereço 0x950030 (que é o tal EAX + 0x30). O ds vem de data segment e já dá a dica que este é um segmento de dados. No caso de executáveis de Windows, provavelmente este endereço estará na seção .data, já que está sendo usado para escrita (o valor é copiado para lá) e esta seção em geral possui permissão de escrita quando mapeada em memória.
Abraço,
Fernando
-
Ué, mas você usa loops for e while em várias partes do teu código. Não entendi...
De qualquer forma, ignorando tudo que pode ser corrigido e/ou melhorado, no caso da sua implementação das opções 4 e 5, só faltou imprimir na tela o número do cacifo, dentro do loop. Então ao invés de:
cout << "O cacifo esta " << cacifo[i] << endl;
Você pode fazer:
cout << "O cacifo " << i << " esta " << cacifo[i] << endl;
Abraço.
-
Olá, @herculespt, beleza?
Acho que antes de implementar as opções 4 e 5, precisamos acertar o seu código. Do contrário, vai ficar cada vez mais difícil. ?
Vejo os seguintes problemas:
1. main() precisar retornar int
A função main() não pode retornar um float. Tem que ser int. Falta também um return 0 no fim do seu código.
2. A variável que vai abrigar a opção não precisa ser um array
Você declara essa variável int op[6], mas como ela só vai abrigar uma opção por vez, ou seja, um número por vez, basta que seja int op.
3. Provavelmente era pra você criar um tipo cacifo
Pela estrutura do programa, me parece que a resposta mais correta seria criar uma struct ou class do tipo cacifo, ou seja, seu próprio tipo. Até dá pra fazer com as propriedades do cacifo (nome e estado - ocupado ou vazio), em variáveis independentes, mas seria mais complicado e menos eficiente. A não ser que você não precise do nome, aí basta um array de strings mesmo ou, mais eficiente, de inteiros (você pode usar 0 para vazio e 1 para ocupado). Se for nesta última opção, você só vai precisar declarar como int cacifos[20], mas acho que antes vale verificar se estes cacifos não precisam de nome ou de outras propriedades. Se precisarem, aí é melhor criar uma struct ou class (depende do que seu professor, ou professora, ensinou).
4. Você precisa usar mais loops
Ao invés de fazer:
cout << "\nCacifo " << i << cacifo[0] << endl; cout << "Cacifo 1: " << cacifo[1] << endl; cout << "Cacifo 2: " << cacifo[2] << endl; cout << "Cacifo 3: " << cacifo[3] << endl; cout << "Cacifo 4: " << cacifo[4] << endl; cout << "Cacifo 5: " << cacifo[5] << endl; cout << "Cacifo 6: " << cacifo[6] << endl; cout << "Cacifo 7: " << cacifo[7] << endl; cout << "Cacifo 8: " << cacifo[8] << endl; cout << "Cacifo 9: " << cacifo[9] << endl; cout << "Cacifo 10: " << cacifo[10] << endl; cout << "Cacifo 11: " << cacifo[11] << endl; cout << "Cacifo 12: " << cacifo[12] << endl; cout << "Cacifo 13: " << cacifo[13] << endl; cout << "Cacifo 14: " << cacifo[14] << endl; cout << "Cacifo 15: " << cacifo[15] << endl; cout << "Cacifo 16: " << cacifo[16] << endl; cout << "Cacifo 17: " << cacifo[17] << endl; cout << "Cacifo 18: " << cacifo[18] << endl; cout << "Cacifo 19: " << cacifo[19] << endl;
Você pode fazer:
for (int i=0; i<20; i++) { cout << "Cacifo " << i + 1 << ":" << cacifo[i] << "\n"; }
Sempre que estiver repetindo linhas como essas no seu código, substitua por um loop. Você vai errar muito menos assim
Faz essas correções aí, porque pra avançar precisaremos delas. Aí a gente continua a conversa. ?
Um abraço!
-
Bem lembrado. Mas tem um ponto.. Eu acho que a gente deve considerar o que o aluno está estudando (admitindo que isso é um exercício de um curso de programação). Normalmente, em enunciados deste tipo, que miram a lógica, considerar tabulações verticais e outros caracteres é um pouco "demais". Usar a isspace() provavelmente vai na mesma linha. Mas concordo que sua consideração é mais completa. Se quem passou o exercício falou de outros caracteres, e/ou falou da isspace() - o que pode ter acontecido vide a inclusão do ctype.h pelo @lucas costa da cruz -, você está certíssimo. Do contrário, comparar com ' ' deve ser suficiente. ?
Um abraço,
Fernando
-
Bom dia, @lucas costa da cruz, tudo bem?
Eu precisei editar seu post original pra formatar o código como código (é só clicar no botão <> aqui do editor na hora de postar). Pode fazer isso da próxima vez que postar código, por gentileza? ?
Também fiz as seguintes edições no seu código, para melhorar a visualização:
- Indentação: aninhei os códigos dentro dos blocos {}
- Espaços: pus espaços entre coisas como include<arquivo> e for (i=0;i<...;i++), etc.
- Coloquei os comentários das declarações de variáveis alinhados.
- Adicionei também um espaço depois do caractere ":" (dois pontos) na linha "Digite sua frase: ".
Tudo isso foi pra deixar o código melhor pra quem for te ajudar, inclusive pra você mesmo ler.
Agora em relação à lógica do programa em si, me parece que você modificou um programa que já contava vogais para agora contar espaços, foi isso? Achei inteligente fazer isso, parabéns! ?
A sua contagem está certa. Só faltou imprimir o valor da variável ContadorEspacos. E nem precisa usar um condicional (if) pra testar se é maior que zero. Basta imprimir o valor dela, mesmo que seja zero.
Mais uma coisa: você aloca um vetor de apenas 12 posições com char texto[12]. Isso vai fazer com que sua frase não possa ter mais do que 11 caracteres. Eu usaria pelo menos uns 255. ?
NOTA: O seu programa possui um bug de segurança ao combinar um buffer que pode ser facilmente estourado com o uso da função gets(), mas este assunto foge do tema da lógica de programação em si, e acredito que este exercício seja para treinar sua lógica, então abrir este assunto com seus professores pode desviar muito, mas se quiser saber mais sobre o assunto, é só googlar por "buffer overflow".
Um abraço!
-
Linguagem c
em C/C++
Oi Ernany, tudo bem? Que tipo de ajuda? Posta até onde você foi (seu código) e a dúvida. ?
-
Opa, resolveu já?
-
Resolveu já?
-
Opa, tá funcinando o programa? Se não, qual requisito que não tá sendo entendido? Em outras palavras, em qual requisito você precisa de ajuda? ?
Abraço!
-
Oi lucas. O que acontece quando você tenta usar? Qual requisito que não funciona? ?
-
Opa, bem vindo!
Tá um pouco embolado isso... Pra começar, queria pedir que você edite seu post e use o bloco de código no seu código, usando o realce de sintaxe em C. Olha só a diferença. ?
Sem realce:
printf("Digite a %d%c nota do %d%c Aluno --: ",j+1,166,i+1,167);
Com realce (na tela de edição do post, seleciona seu código, clica no botão <>, escolhe C na caixa de seleção no canto inferior direito e clica em Inserir?
printf("Digite a %d%c nota do %d%c Aluno --: ",j+1,166,i+1,167);
Aí você corrige a indentação pra facilitar pra gente também. Fica melhor pra gente ver e tentar entender teu código.
Abraço!
-
Que bom!
É difícil dizer o que foi que rolou com a versão que você tava tentando rodar. São muitas possibilidades...
Mas estudar o apt, apt-get, dpkg, etc é muito legal pra quem usa Debian, Ubuntu, Kali, etc. Adianta bastante a instalação e manutenção de programas. ?
Grande abraço!
-
Tenta o seguinte:
$ sudo killall codeblocks $ sudo apt-get update $ sudo apt-get install --reinstall codeblocks
Copia e cola a saída de cada comando aqui, por favor. ?
Abraço.
-
Opa que distro Linux que é?
Abraço!
-
Legal. O código parece ok! Agora você precisa criar duas funções, uma que imprima o conteúdo dos procedimentos e outra que imprima a soma de todas as durações, certo? A primeira poderia ser algo do tipo:
void imprimeDadosProcedimento(struct procedimento proc[], int qtd) { // loop para imprimir os dados }
Topa fazer e postar o código aqui? ?
Abraço!
-
Humm.. do jeito que você fez essa alocação aí, não sei, acho que vai precisar de uma função que receba ambas as matrizes por referência, mas também seus números de linhas e colunas. E retorne uma matriz. Algo assim:
float **mult_mat(float **a, int linA, int colA, float **b, int linB, int colB)
Mas pode haver soluções melhores que não pensei. Alguém mais? ?
Abraços!
Problema em gerar executável no Windows - PoC Aprendendo Assembly
em Assembly
Postado
Opa, quando a gente fala "binário" é em referência ao arquivo executável (ou biblioteca), mas não precisa dar a saída em sistema binário de numeração não. ?
Na verdade a melhor saída pra ver isso é com um disassembler, então você pode ou anexar o arquivo aqui (hello.o) ou postar a saída do seguinte comando:
Valeu!