Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Vertygo

Alguém por aqui fluente em Assembly (do P3)?

Mensagens Recomendadas

Vertygo

Boas a todos!

Estou perante um exercicí, em que tenho de prucurar um numero, dentro de uma cadeira de dados em Assembly P3 (input/linha2/linha3).

Existem algumas condicionantes. Nomeadamente retornar em R1 o endereço onde foi encontrado o numero em causa.

Como estou a iniciar-me em Assembly e o material didático para esta linguagem é bastante, coloco-Vos este pedido de ajuda.

 

Eis o que tenho feito, mas que por motivos que desconheço, o simulador não retorna qualquer dado...

; Conjunto de dados

                    ORIG    8000h
Input            STR     60385, 8536, 7627, 24376, 49543, 13210, 9866, 53798
linha2          STR     60526, 42549, 27769, 25234, 60984, 49533, 45468, 26128
linha3          STR     56370, 34983, 13129, 62576, 62248, 63856, 57035, 20429
Tamanho     EQU     24

;Localizar

Localizar    WORD    62576

;Código
                
                MOV     R2, 1
                MOV     R4, 62576
                
Find:        CMP     R4, M[R2]
                BR.Z    Step2
                INC     R2
                MOV     R3, 0
                BR Find

Step2:      MOV     R3, 1
                MOV     R1, M[R2]


FIM:         JMP     FIM    ; fim programa

 

Abrigado pela ajuda que me puderem dar, a perceber porque não retorna quaisquer dados... NEm do R1, nem R2 e nem o R3

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

Não sendo fluente nesse Assembly em particular, uma leitura do 'Manual do Simulador do Processador P3' permite constatar que estás a colocar os dados a pesquisar a partir do endereço 8000h (ORIG 8000h) mas estás a procurar a partir do endereço 1 (MOV R2, 1). Se mudares esta última linha para MOV R2, 8000h o código já encontrará o valor.

  • Voto 2

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo
2 hours ago, bsccara said:

Não sendo fluente nesse Assembly em particular, uma leitura do 'Manual do Simulador do Processador P3' permite constatar que estás a colocar os dados a pesquisar a partir do endereço 8000h (ORIG 8000h) mas estás a procurar a partir do endereço 1 (MOV R2, 1). Se mudares esta última linha para MOV R2, 8000h o código já encontrará o valor.

bsccara, dizes então que não és fluente... tá certo.

Passei horas a olhar pra isto e passou-me ao lado... Ainda estou bastante verdinho nisto de assembly.

Fiz a troca como sugeriste e lá apareceu ele! 

Muito obrigado! (possivelmente vou abusar da tua booooooua vontade e colocar mais uma duvida ou outra)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo

Boas!

Estou com um problema em mãos, que passa por codificar em assembly (P3), uma verificação de bits distintos entre 2 numeros.

Por exemplo. Se pretendo saber quantos bits têm distintos os numeros (R1) f470h e dc32h. Sei que o resultado será 0004, pois será 0(F/D)0(4/C)0(7/3)4(0/2), mas não estou a conseguir chegar ao raciocício para aqui chegar...

Aguem pode ajudar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo
8 hours ago, Vertygo said:

Boas!

Estou com um problema em mãos, que passa por codificar em assembly (P3), uma verificação de bits distintos entre 2 numeros.

Por exemplo. Se pretendo saber quantos bits têm distintos os numeros (R1) f470h e dc32h. Sei que o resultado será 0004, pois será 0(F/D)0(4/C)0(7/3)4(0/2), mas não estou a conseguir chegar ao raciocício para aqui chegar...

Aguem pode ajudar?

Bom, para exemplificar e tentar apelar aos entendidos.

Tenho (imaginemos), 2 numeros em hexa; (R1) 1111 1111 1111 1111 e (R2) 1110 1111 1111 1111.

Se quiser saber entre ambos, a olho nú consegue-se identificar que se trata apenas de um bit (que varia de 1 para 0).

A instrução XOR, permite pelo que penso, fazer a diferença; XOR R1, R2

O problema, é que o resultado desta instrução, escreve a diferença como sendo: 0020h e o que pretendia, seria um resultado de 0001 (1bit e diferença).

Existe alguma forma ou raciocínio que aconselhem para lá chegar?

Many thanks!

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

A ideia de usar o operador XOR está correcta (pequena correcção; no teu exemplo o resultado seria 1000h).A maneira mais simples de resolver isso é a mesma que usas quando o fazes manualmente; contar os digitos '1' que aparecem no resultado do XOR, lendo digito a digito, de uma ponta para a outra e somando mentalmente. Em código podes usar uma instrução de rotação, que coloque o bit que sai do registo numa flag, normalmente a Carry, e incrementa um contador de cada vez que a Carry fôr a um, num ciclo que inclua todos os bits do resultado.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo

Ok, percebi o raciocício, mas está dificil colocar em prática...

Imagina, tenho o XOR feito entre 2 numeros. De seguida estou a aplicar a rotação (RORC -Rotação à direita com transporte) nesse resultado obtido, aplicando uma unidade de cada vez. Mas o resultado obtido não é o que deveria... A rotação é de um bit de cada vez, certo?

Exemplo:

(resultado do XOR = Rk = 1101101101101001b)

     MOV      Ry, R0   ;Ry está a 0, e recebe depois a soma do bit de transporte

     MOV      Rx, R0

     RORC    Rk, 1

     ADDC    Ry, Rk

     DEC       R5

     CMP       R5, 16

     BZ.NZ    Loop

    JMP        FIM

(loop x16 bits)

 

O resultado deveria ser 10 (contagem de bits a 1), certo? ...está a dar-me valor absurdos :S

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

Não estás longe... mas pensa bem no que é que a instrução 'ADDC Ry, Rk' irá fazer. Presumo que a etiqueta 'Loop' esteja na instrução RORC e que o registo Rx seja o R5. Assim sendo pensa também no que é que a instrução 'DEC R5' irá fazer à contagem dos passos do ciclo. E já agora pensa se será mais ou menos complexo, em termos de instruções, contar de 0 a 16 ou de 16 a 0.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fast7

Bom dia,

Alguém sabe de um simulador de P3 que realmente funcione no windows7?

Já fiz quase de tudo e o simulador não funciona de maneira nenhuma.

Até já testei o programa aqui apresentado no P3JS Assembler and Simulator e não obtenho nenhum resultado nos R's mesmo com a alteração do inicio da procura (8000h)

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo
4 hours ago, Fast7 said:

Bom dia,

Alguém sabe de um simulador de P3 que realmente funcione no windows7?

Já fiz quase de tudo e o simulador não funciona de maneira nenhuma.

Até já testei o programa aqui apresentado no P3JS Assembler and Simulator e não obtenho nenhum resultado nos R's mesmo com a alteração do inicio da procura (8000h)

Obrigado

Boas!

Estou a trabalhar com esse assembly.

Mete aqui o código e talvez consiga dar uma ou outra dica.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fast7
38 minutos atrás, Vertygo disse:

Boas!

Estou a trabalhar com esse assembly.

Mete aqui o código e talvez consiga dar uma ou outra dica.

Testei com o código aqui apresentado e não obtenho resultado nenhum nos R's, fica tudo a zero.

Há alguma configuração que se deva fazer antes?

obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo
12 hours ago, bsccara said:

Não estás longe... mas pensa bem no que é que a instrução 'ADDC Ry, Rk' irá fazer. Presumo que a etiqueta 'Loop' esteja na instrução RORC e que o registo Rx seja o R5. Assim sendo pensa também no que é que a instrução 'DEC R5' irá fazer à contagem dos passos do ciclo. E já agora pensa se será mais ou menos complexo, em termos de instruções, contar de 0 a 16 ou de 16 a 0.

Boas!

fiz as alterações infra, e mesmo assim não atino na contagem.

(resultado do XOR = R1 = 1101101101101001b)

                ORIG    0000h
                
                MOV     R1, 1111111111111111b ;resultado de XOR anterior
                MOV     R2, R0
                MOV     R3, 16
                MOV     R4, R0
                

Loop:       RORC    R1, 1 ;rotação de 1bit
                ADDC    R2, R1
                BR.C    Bits1
                
                DEC     R3
                CMP     R3, 16
                BR.NZ   Loop
                
Bits1:       INC     R4 ; contador dos bits de transporte, mas que apresente apenas o resultado 1....

                BR      FIM               
FIM:        JMP     FIM ; Fim do programa

 

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

Usa o simulador e executa uma instrução de cada vez; vê o que acontece aos registos e em que sequência as instruções são executadas. Como 'spoiler' digo-te já que o resultado é 1 porque na primeira execução do loop a instrução ADDC consome a flag Carry e volta a activá-la, a instrução BR.C salta para a instrução INC R4 (logo resultado = 1) e a instrução BR salta para o fim. Tenta agora perceber o que se passa. Usa a execução passo-a-passo do simulador; para aprender é inestimável.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Vertygo
1 hour ago, bsccara said:

Usa o simulador e executa uma instrução de cada vez; vê o que acontece aos registos e em que sequência as instruções são executadas. Como 'spoiler' digo-te já que o resultado é 1 porque na primeira execução do loop a instrução ADDC consome a flag Carry e volta a activá-la, a instrução BR.C salta para a instrução INC R4 (logo resultado = 1) e a instrução BR salta para o fim. Tenta agora perceber o que se passa. Usa a execução passo-a-passo do simulador; para aprender é inestimável.

Boas bsccara!

Antes de mais, muito obrigado pela tuas tuas inestimável dicas. Depois de várias horas de volta disto, entreguei o trabalho no código que te tinha referido.

Mas mesmo depois de ver as sequências e os teus alertas, não consigo perceber como contar as flags da carry... Pensei que a instrução ADDC adiciona a R2 (que foi iniciado com 0) e epois, increventava o contador (R4). Por mais voltas que dê, não percebo o passo que está a faltar, e queria de facto entender esta parte. às tantas é passo simples, e está-me agora a faltar fechar "o ciclo do meu raciocínio"...

A cena do assembly, é que não existem muitos exercicios resolvidos para perceber pela resolução, com atingir um determinado objectivo. Mas estou a gostar de mexer nisto.

(Sim, já tinha feito os step´s e o que me irrita, é que conto exatamente 16 bits na flag, mas não há modo de as contabilizar num registo - e ya, mais uma vez estás certo; dá mesmo 1)

Novamente, obrigadão :)

 

Editado por Vertygo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.