Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Assembly - Ajuda laço de repetição

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Assembly - Ajuda laço de repetição

    Gostaria de converter este programa em C para Assembly
    no entanto esta dando erro na divisão e na hora de copiar o valor de um registrador para outro

    Código:
    #O registrador $t0 será usado para mostrar o valor A
    #O registrador $t1 será usado para mostrar o valor de SENA
    #O registrador $t2 será usado para mostrar o valor N
    .data
    A: .asciiz "\n A($t0:) " #mostra o valor de A
    SENA: .asciiz "\n SENA($t1:) " #mostra o valor de SENA
    N: .asciiz "\n N($t2:) " #mostra o valor de N
    .globl main
    .text
    main:
    
    li $t0, 0 #inicializa A com 0
    loop1: #inicia o Loop 1
    addi $t0,$t0,0.1 #O registrador $t0 recebe $t0 + 0.1
    bgt $t0, 1.6, parar1 #se $t3 (A > 1.6) desvia para o rotulo (parar1)
    b loop1 # fica em looping até que o valor da soma $t0 + 0.1 seja maior que 1.6
    parar1:
    #O registrador $t1 será usado para armazenar 0 em SENA (0 mesmo que irá mostrar o resultado no final)
    #O registrador $t3 será usado para armazenar o valor de A
    li $t1, 0 #inicializa SENA com 0
    li $t3,$t3 #inicializa T com o valor calculado de A
    li $t2,0 #inicializa N com O
    
    loop2:
    blt $t3, 0.0001, parar2 #se $t3 < 0.0001 desvia para o rotulo (parar2)
    
    add $t1,$t1,$t3 #O registrador $t1 recebe a soma de $t1 com $t3
    addi $t2,$t2,1 #O registrador $t2 recebe a soma de $t2 com 1
    
    #calculo da expressão: T = -T  x  AxA / (2 x N x (2 x N + 1));
    addi $t2, $t2,1 #N + 1
    mult $t2,$t2,2 #N x 2
    mult $t2,$t2,2  #N x 2
    mult $t0,$t0,$t0 # $t0 = $t0,$t0
    div $t3,$t0,$t2 #divide A x A por (2 x N x (2 x N + 1))
    neg $t3,-1 #faz com que o registrador fique negativo
    b loop2 # fica em looping até que o valor da soma de $t3 seja menor que 0.0001
    
    #Procedimentos para escrever o resultado (parar 2)
    li $v0, 4
    la $a0, A
    la $a1, SENA
    la $a3, N
    syscall
    li $v0, 1
    move $a0, $t0
    move $a0, $t1
    move $a0, $t2
    syscall
    
    nop # Diretiva para o SO interromper a execução. Alguma “coisa” do tipo “não faça nada! ”
    Alguém poderia ajudar por favor

  • Font Size
    #2
    Postado Originalmente por rs23 Ver Post
    Gostaria de converter este programa em C para Assembly
    no entanto esta dando erro na divisão e na hora de copiar o valor de um registrador para outro

    Código:
    #O registrador $t0 será usado para mostrar o valor A
    #O registrador $t1 será usado para mostrar o valor de SENA
    #O registrador $t2 será usado para mostrar o valor N
    .data
    A: .asciiz "\n A($t0:) " #mostra o valor de A
    SENA: .asciiz "\n SENA($t1:) " #mostra o valor de SENA
    N: .asciiz "\n N($t2:) " #mostra o valor de N
    .globl main
    .text
    main:
    
    li $t0, 0 #inicializa A com 0
    loop1: #inicia o Loop 1
    addi $t0,$t0,0.1 #O registrador $t0 recebe $t0 + 0.1
    bgt $t0, 1.6, parar1 #se $t3 (A > 1.6) desvia para o rotulo (parar1)
    b loop1 # fica em looping até que o valor da soma $t0 + 0.1 seja maior que 1.6
    parar1:
    #O registrador $t1 será usado para armazenar 0 em SENA (0 mesmo que irá mostrar o resultado no final)
    #O registrador $t3 será usado para armazenar o valor de A
    li $t1, 0 #inicializa SENA com 0
    li $t3,$t3 #inicializa T com o valor calculado de A
    li $t2,0 #inicializa N com O
    
    loop2:
    blt $t3, 0.0001, parar2 #se $t3 < 0.0001 desvia para o rotulo (parar2)
    
    add $t1,$t1,$t3 #O registrador $t1 recebe a soma de $t1 com $t3
    addi $t2,$t2,1 #O registrador $t2 recebe a soma de $t2 com 1
    
    #calculo da expressão: T = -T  x  AxA / (2 x N x (2 x N + 1));
    addi $t2, $t2,1 #N + 1
    mult $t2,$t2,2 #N x 2
    mult $t2,$t2,2  #N x 2
    mult $t0,$t0,$t0 # $t0 = $t0,$t0
    div $t3,$t0,$t2 #divide A x A por (2 x N x (2 x N + 1))
    neg $t3,-1 #faz com que o registrador fique negativo
    b loop2 # fica em looping até que o valor da soma de $t3 seja menor que 0.0001
    
    #Procedimentos para escrever o resultado (parar 2)
    li $v0, 4
    la $a0, A
    la $a1, SENA
    la $a3, N
    syscall
    li $v0, 1
    move $a0, $t0
    move $a0, $t1
    move $a0, $t2
    syscall
    
    nop # Diretiva para o SO interromper a execução. Alguma “coisa” do tipo “não faça nada! ”
    Alguém poderia ajudar por favor
    Esqueci de colocar o código em C

    Segue abaixo:

    Código:
    {
         
    float A,N,SENA,T;
    
    A = 0;
    
    do { //inicio 1
    
    if (A>1.6) {
     
      SENA = 0;
      T = A;
      N = 0;
      
      do { //inicio 2
       
       break;
       
       SENA = SENA + T;
       N = N + 1;
      if (T < 0.0001)
      T = -T * (A * A) / (2 * N * (2 * N + 1));
      } //while 2
      
      
      
      printf("A: %f",A);  
      printf("\n\n");  
      printf("SENA: %f",SENA);  
      printf("\n\n");  
      printf("N: %f",N);  
    
    A = A + 0.1;
    
    } //while 1

    Comment


    • Font Size
      #3
      Kra...se vc puder ser um pouco mais específico quanto ao erro que vc está tendo e qual montador (assembler) vc ta usando dai eu acho que posse te ajudar
      Black-Hat.

      Comment


      • Font Size
        #4
        Uma dica interessante para o seu caso seria usar o GCC para gerar o arquivo nome_do_projeto.s e ver o código Assembly gerado pelo montador do GCC.

        Como fazer isso:

        na linha de comando digite "gcc -s nome_so_programa.c"

        O programa deve ser válido, ou seja, não pode possuir erros de sintaxe e tem que ter a função main...

        Tenta aí e ve se o código do GCC te ajuda, qualquer coisa posta ai.

        Obs: estou assumindo que vc ta compilando isso no GCC (ou MinGW) e não no visual C++



        Flws e boa sorte
        Black-Hat.

        Comment

        X
        Working...
        X