Jump to content

Criação de um programa


tiagomsmslb

Recommended Posts

Bom dia, foi-me proposto um trabalho em assembly, o qual tem que percorrer um texto e no fim apresentar o número total de caracteres que compõem esse texto; número de letras minúsculas (sem acentos, ASCII puro); e por fim, número total de caracteres ASCII não representáveis. Agradeço desde já quem puder ajudar.

Link to comment
Share on other sites

Eu utilizo o MARS , em principio isso não afeta o programa.

.data 
string1: .asciiz "Numero de caracteres: "
string2: .asciiz ", numero de minusculas: "
string3: .asciiz ", numero de nao representaveis: "
string4: .asciiz 

.text 
la $a1, string1 	#carrega o endereço onde começa a string1
la $a2, string2 	#carrega o endereço onde começa a string2
la $a3, string3 	#carrega o endereço onde começa a string3
la $t0, string4 	#carrega o endereço onde começa a string4
li $v0, 8 		#carrega em $v0 o valor imediato de 8 para a syscall
addi $a0, $t0,0 	#copia o endereço que está em $t0 para $a0 (obrigatorio pelo syscall)
syscall

 
li $t2, 97		#carrega em $t2 o valor decimal de 'a'
li $t3, 32		#carrega em $t3 o valor decimal de ' '
li $t4, 0		#inicia registo a 0
li $t5, 0		#inicia registo a 0
li $t6, 0		#inicia registo a 0
li $s0,10		#carrega em $s0 o valor decimal de '\n'
loop:			
lb $t1,0($t0)		#carrega o valor decimal guardado no endereço $t0
beq $t1,$s0,exit	#se o valor for igual a '\n' o programa salta para a label exit
addi $t4,$t4,1 		#caso contrario o contador de caracteres aumenta 1
bge $t1,$t2,add_min	#se o valor for maior ou igual que 'a' salta para a label add_min
ble $t1,$t3, add_nr	#se o valor for menor ou igual a ' ' salta para a label add_nr

addi $t0,$t0,1		#aumenta 1 a $t0 para que o endereço de memoria passe a apontar para os 8 bits seguintes
j loop


add_min:
addi $t5,$t5,1		#aumenta o contador de minuscula em 1
addi $t0,$t0,1		#aumenta 1 a $t0 para que o endereço de memoria passe a apontar para os 8 bits seguintes
j loop			#salta para o loop em ordem a continuar o processo até acabar a string

add_nr:
addi $t6,$t6,1		#aumenta o contador de ñ representaveis
addi $t0,$t0,1
j loop			

exit:
move $a0,$a1		#nesta secção são carregados os endereços de memoria das strings que aparecem no .data e os
li $v0,4		#valores dos contadores e imprime na tela
syscall			#o ultimo syscall com $v0=10 termina o programa
li $v0,1
move $a0, $t4
syscall
move $a0,$a2
li $v0,4
syscall
move $a0,$t5
li $v0,1
syscall
move $a0,$a3
li $v0,4
syscall
li $v0,1
move $a0,$t6
syscall
li $v0,10
syscall

O programa foi feito um bocado à pressa mas funciona bem
Espero ter ajudado 🙂

Edited by KasterShoot
Bad formatting
  • Vote 1
Link to comment
Share on other sites

4 minutos atrás, KasterShoot disse:

Eu utilizo o MARS , em principio isso não afeta o programa.

 

<

.data 
string1: .asciiz "Numero de caracteres: "
string2: .asciiz ", numero de minusculas: "
string3: .asciiz ", numero de nao representaveis: "
string4: .asciiz 

.text 
la $a1, string1     #carrega o endereço onde começa a string1
la $a2, string2     #carrega o endereço onde começa a string2
la $a3, string3     #carrega o endereço onde começa a string3
la $t0, string4     #carrega o endereço onde começa a string4
li $v0, 8         #carrega em $v0 o valor imediato de 8 para a syscall
addi $a0, $t0,0     #copia o endereço que está em $t0 para $a0 (obrigatorio pelo syscall)
syscall

 
li $t2, 97        #carrega em $t2 o valor decimal de 'a'
li $t3, 32        #carrega em $t3 o valor decimal de ' '
li $t4, 0        #inicia registo a 0
li $t5, 0        #inicia registo a 0
li $t6, 0        #inicia registo a 0
li $s0,10        #carrega em $s0 o valor decimal de '\n'
loop:            
lb $t1,0($t0)        #carrega o valor decimal guardado no endereço $t0
beq $t1,$s0,exit    #se o valor for igual a '\n' o programa salta para a label exit
addi $t4,$t4,1         #caso contrario o contador de caracteres aumenta 1
bge $t1,$t2,add_min    #se o valor for maior ou igual que 'a' salta para a label add_min
ble $t1,$t3, add_nr    #se o valor for menor ou igual a ' ' salta para a label add_nr

addi $t0,$t0,1        #aumenta 1 a $t0 para que o endereço de memoria passe a apontar para os 8 bits seguintes
j loop


add_min:
addi $t5,$t5,1        #aumenta o contador de minuscula em 1
addi $t0,$t0,1        #aumenta 1 a $t0 para que o endereço de memoria passe a apontar para os 8 bits seguintes
j loop            #salta para o loop em ordem a continuar o processo até acabar a string

add_nr:
addi $t6,$t6,1        #aumenta o contador de ñ representaveis
addi $t0,$t0,1
j loop            

exit:
move $a0,$a1        #nesta secção são carregados os endereços de memoria das strings que aparecem no .data e os
li $v0,4        #valores dos contadores e imprime na tela
syscall            #o ultimo syscall com $v0=10 termina o programa
li $v0,1
move $a0, $t4
syscall
move $a0,$a2
li $v0,4
syscall
move $a0,$t5
li $v0,1
syscall
move $a0,$a3
li $v0,4
syscall
li $v0,1
move $a0,$t6
syscall
li $v0,10
syscall
 

>

O programa foi feito um bocado à pressa mas funciona bem
Espero ter ajudado 🙂

Agradeço imenso a sua ajuda mas no qtspim não sei porque não corre o programa tem alguma ideia do que será?

Link to comment
Share on other sites

1 minuto atrás, KasterShoot disse:

Nunca usei o qtspim 
Mas experimenta com o MARS, acho este emulador muito mais simples e tem a informação bem organizada

Instalei agora o mars e não consigo correr já passei o codigo todo tal e qual e não me deixa correr, nem a clicar no atalho f5 nem manualmente, sabe porque?

Link to comment
Share on other sites

4 minutos atrás, KasterShoot disse:

O programa está feito para que se introduza uma string depois de lançar o programa

Se o programa tiver algum erro no MARS aparece numa caixa no fundo o erro sublinhado a amarelo


Tenta fazer assim:

clicas na primeira seta verde 

depois escreves a string que quiseres numa caixa que diz Run I/0

Essa seta não me aparece aí está o problema, aparecem cinzentas e nao consigo clicar nelas, ou seja, executar o programa

Pode ver aqui como está https://gyazo.com/2ac051a194b6e645c00f47b6af62ac70

Link to comment
Share on other sites

Normalmente o programa para poder ser executado o programa precisa ser salvo e "assemblado", consegues "assemblar" se carregares no ícone que parece ter ferramentas.

Esse ícone só fica ativo depois de o programa ser salvo no disco

No teu caso como não tens o programa salvo ele não te deixa nem assemblar nem executar

Também  é uma cena que me acontece muitas vezes xD  

Edited by KasterShoot
Link to comment
Share on other sites

3 minutos atrás, KasterShoot disse:

Normalmente o programa para poder ser executado o programa precisa ser salvo e "assemblado", consegues "assemblar" se carregares no ícone que parece ter ferramentas.

Esse ícone só fica ativo depois de o programa ser salvo no disco

No teu caso como não tens o programa salvo ele não te deixa nem assemblar nem executar

Também  é uma cena que me acontece muitas vezes xD  

Muito obrigado mesmo, já consegui! Estou muito grato pela sua ajuda, muito obrigado! 😄

Link to comment
Share on other sites

On ‎14‎/‎01‎/‎2017 at 4:37 PM, tiagomsmslb said:

Muito obrigado mesmo, já consegui! Estou muito grato pela sua ajuda, muito obrigado! 😄

eu tenho certas retcencias a este tipo de ajuda... Normalmente, quando pretendo uma solução final a um problema, contacto um indiano.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Eu ajudei da melhor maneira que sei 

Se não está satisfeito tente ajudar você e deixe-se de comentários que não trazem nenhuma informação útil.

Quando realmente se quer aprender não se faz copy-paste do código, entende-se o código.

No entanto não posso proibir que apenas façam o mais fácil 

Edited by KasterShoot
Link to comment
Share on other sites

49 minutes ago, KasterShoot said:

Eu ajudei da melhor maneira que sei 

Se não está satisfeito tente ajudar você e deixe-se de comentários que não trazem nenhuma informação útil.

Quando realmente se quer aprender não se faz copy-paste do código, entende-se o código.

No entanto não posso proibir que apenas façam o mais fácil 

eu não disse que não ajudaste o melhor que sabes, eu simplesmente disse que não deverá ser a melhor maneira de o fazer.

se achas que o comentário não tem informação útil, é incoerente com o resto da tua resposta onde assumes que existe problemas em respostas com soluções completas.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

6 minutos atrás, HappyHippyHippo disse:

eu não disse que não ajudaste o melhor que sabes, eu simplesmente disse que não deverá ser a melhor maneira de o fazer.

se achas que o comentário não tem informação útil, é incoerente com o resto da tua resposta onde assumes que existe problemas em respostas com soluções completas.

O problema é a preguiça, lá por teres as soluções de um exercício não implica diretamente que não o vais tentar fazer sozinho mas caso tenhas alguma dúvida tens a solução para te ajudar.

Toma como exemplo as soluções dos livros dos exames nacionais nas respostas de construção, elas são completas, bem documentadas para os alunos entenderem o que devem ou não fazer nessas situações, na programação vai dar ao mesmo.

Claro que vai haver gente que vai simplesmente copiar as soluções, isso nunca é problema das soluções mas sim da maneira que são usadas. 

Link to comment
Share on other sites

  • 8 months later...
Em Saturday, January 14, 2017 às 12:22, tiagomsmslb disse:

Bom dia, foi-me proposto um trabalho em assembly, o qual tem que percorrer um texto e no fim apresentar o número total de caracteres que compõem esse texto; número de letras minúsculas (sem acentos, ASCII puro); e por fim, número total de caracteres ASCII não representáveis. Agradeço desde já quem puder ajudar.

Boa noite a todos. Nao sei se esse é o sitio certo. Sera que algum colega tem o disquete que acompanha o livro -- assembly puro e simples de vasco correia veloso. Qual o conteudo desse disco ?? Julio praiaclube@msn.com 

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.