Vertygo 0 Posted January 16, 2019 Report Share Posted January 16, 2019 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! Link to post Share on other sites
bsccara 27 Posted January 16, 2019 Report Share Posted January 16, 2019 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. 2 Report Link to post Share on other sites
Vertygo 0 Posted January 16, 2019 Author Report Share Posted January 16, 2019 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) Link to post Share on other sites
Vertygo 0 Posted January 17, 2019 Author Report Share Posted January 17, 2019 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? Link to post Share on other sites
Vertygo 0 Posted January 18, 2019 Author Report Share Posted January 18, 2019 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! Link to post Share on other sites
bsccara 27 Posted January 19, 2019 Report Share Posted January 19, 2019 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. 1 Report Link to post Share on other sites
Vertygo 0 Posted January 20, 2019 Author Report Share Posted January 20, 2019 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 Link to post Share on other sites
bsccara 27 Posted January 20, 2019 Report Share Posted January 20, 2019 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. 1 Report Link to post Share on other sites
Fast7 0 Posted January 20, 2019 Report Share Posted January 20, 2019 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 Link to post Share on other sites
Vertygo 0 Posted January 20, 2019 Author Report Share Posted January 20, 2019 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. Link to post Share on other sites
Fast7 0 Posted January 20, 2019 Report Share Posted January 20, 2019 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 Link to post Share on other sites
Vertygo 0 Posted January 20, 2019 Author Report Share Posted January 20, 2019 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 Link to post Share on other sites
bsccara 27 Posted January 21, 2019 Report Share Posted January 21, 2019 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. 1 Report Link to post Share on other sites
Vertygo 0 Posted January 21, 2019 Author Report Share Posted January 21, 2019 (edited) 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 Edited January 21, 2019 by Vertygo Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now