Ir ao conteúdo
  • Cadastre-se
neto giampaulo

C programação como fazer esses programas

Posts recomendados

1) Suponha que, a partir do endereço 2000H de memória esteja armazenada uma string em linguagem C (ou seja, um arranjo de caracteres ASCII terminado com um byte 0). Suponha que a string tenha, no máximo 255 caracteres. Escreva um programa que calcule o comprimento da string e o armazene no endereço 3000H.

2) Suponha que, a partir do endereço 2000H de memória estejam armazenados dois números inteiros, sem sinal de 16 bits cada. Escreva um programa que some esses dois números e armazene o resultado a partir do endereço 2010H. Dê o resultado em 16 bits.

3) Escreva um programa que divida um número inteiro sem sinal de 8 bits por outro número inteiro sem sinal de 8 bits. Assuma que o dividendo e o divisor estejam armazenados em 2000H e 2001H, respectivamente. O quociente deve ser armazenado em 2010H e o resto em 2011H. Obs: se o divisor for zero, o quociente e resto devem ser 0xFF.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@neto giampaulo @neto giampaulo    na linguagem c ou c++ não tem como determinar em qual endereço da memória fazer  a leitura ,   então o que se pode fazer é saber o endereço de uma variável ,  usando ponteiros , e a partir desse endereço , que será aleatório escolhido pelo compilador , pode se ler o que tem nesse endereço e nos endereço seguintes para menos ou para mais , mas não se pode escrever ou armazenar  nele . 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010  eu só precisava de um esquema em si e que não entendo muito, não precisa rodar o programa é só entregar a estrutura.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@neto giampaulo      então você cria um ponteiro do tipo char e uma variável também char  e uma do tipo int para o contador inicializada com valor zero , então use o comando strcpy para armazenar os dados na string e  faça o ponteiro igual ao endereço da variável usando o & antes dessa variável , coloque um loop do / while com condição de repetir enquanto o conteúdo do ponteiro for diferente de   ' \0  '  e dentro do loop  pegue o valor do conteúdo do ponteiro na posição apontado pelo contador , e verifique se é igual  " \0 " e se for então saia do loop usando o comando break , mas se não for então incremente o contador  , e depois que sair do loop coloque o valor do contador no endereço hexadecimal 3000H que é igual 12280 decimal ,   mas não posso te dar um código pronto pois é contra as regras do fórum , então faça seu código e poste aqui para vermos como está e em que podemos ajudar  .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 horas atrás, devair1010 disse:

@neto giampaulo @neto giampaulo    na linguagem c ou c++ não tem como determinar em qual endereço da memória fazer  a leitura ,   então o que se pode fazer é saber o endereço de uma variável ,  usando ponteiros , e a partir desse endereço , que será aleatório escolhido pelo compilador , pode se ler o que tem nesse endereço e nos endereço seguintes para menos ou para mais , mas não se pode escrever ou armazenar  nele . 

Na verdade tem sim colega, é só fazer um ponteiro com valor 2000H

#include <iostream>

using namespace std;

int main()
{
    char *c = (char *)0x2000; //aponta para o endereco 2000h
    printf ("%c", *c); //imprime o byte amrazenado naquele endreco

    return 0;
}

Obviamente, se for rodar o código irá da erro de segmentação, pois tal endereço de memória provavelmente estará alocada por outra aplicação, mas a ideia do exercício é essa. 

Devo dizer que os problemas são bem avançados, na verdade. Vou tentar ajudar no primeiro problema:

#include <iostream>

using namespace std;

int main()
{
    char *c = (char *)0x2000; //aponta para o endereco 2000h
    unsigned char tam = 0;//tamanho da string -max 255
    //Fazer o código para determinar o tamanho da string
    c = (char *)0x3000; //aponta para 3000h agora
    *c = tam;//agora em 3000h esta armazenado o tamanho da string
    return 0;
}

"Só" falta o meio agora.

Edit: existe uma função em c que já determina o tamanho de strings: strlen.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza  Nossa amigo você me salvou, eu não manjo quase nada, não ia conseguir, se não for pedir muito você poderia me ajuda com o terceiro também fazenda um grande favor.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O terceiro é semelhante, você vai ler as variáveis da memória nos endereços dados:

#include <iostream>

using namespace std;

int main()
{
    unsigned char *c = (unsigned char *)0x2000; //aponta para o endereco 2000h
    unsigned char divisor = c[0]; //pega o valor do endereco 2000h
    unsigned char dividendo = c[1];  //pega o valor do endereco 2001h
    (...)
    return 0;
}

Acho que você consegue completar o resto agora.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza    opa, obrigado pela dica , mas testei esse código e não funcionou , não mostra o conteúdo da memória .  como seria para pegar o dado que esta no endereço 2000H ?  , obrigado desde já . . . !

   tentei com esse código mas não mostrou o que tem no endereço do ponteiro :

#include <stdio.h>
int main(){
    int *ptr;                                   /* criando um ponteiro                              */
    ptr=0x2000;                                 /* atribuindo um valor hexadecimal para o ponteiro  */
    printf("valor de ptr ---------= %d\n", ptr);/* mostrar o valor de ptr                           */
    printf("endereco Real de ptr -= %d\n",&ptr);/* mostrar o endereço de ptr                        */
    printf("conteudo de ptr ------= %d\n",*ptr);/* mostrar o conteúdo da memória no endereço de ptr */
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, devair1010 disse:

@Flávio Pedroza    opa, obrigado pela dica , mas testei esse código e não funcionou , não mostra o conteúdo da memória .  como seria para pegar o dado que esta no endereço 2000H ?  , obrigado desde já . . . !

   tentei com esse código mas não mostrou o que tem no endereço do ponteiro :


#include <stdio.h>
int main(){
    int *ptr;                                   /* criando um ponteiro                              */
    ptr=0x2000;                                 /* atribuindo um valor hexadecimal para o ponteiro  */
    printf("valor de ptr ---------= %d\n", ptr);/* mostrar o valor de ptr                           */
    printf("endereco Real de ptr -= %d\n",&ptr);/* mostrar o endereço de ptr                        */
    printf("conteudo de ptr ------= %d\n",*ptr);/* mostrar o conteúdo da memória no endereço de ptr */
}

 

Na prática não funciona, no windows não tem como. Por medida de segurança, o sistema operacional não permite que você acesse endereços de memória não alocados pelo próprio programa.   

O exemplo serve apenas para estudo teórico. Funciona apenas em s.o. antigos, sem memória virtual, ou algo sem s.o. nenhum, como um microcontrolador.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!