Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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 . 

Postado

@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
Postado
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
Postado

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
Postado

@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 */
}

 

Postado
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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!