Search code examples
assemblynested-loops32-bit

nested loop Assembly code


for (int i = 0; i < vec1.length; i++) {
        for (int j = 0; j < vec2.length; j++) {
           if(vec1[i]==vec2[j]){
               add=true;
               cont++;
               for (int k = 0; k < cont; k++) {
                   if(vec2[j]==vec3[k]){
                       add=false;
                   }                        
               }
               if(add==true){
                   vec3[cont+1]=vec2[j];
               }
           }

        }

    }

I'd like to translate this pseudocode java into correct Assembly 32-bit system. Can anyone help me?

i´m doing like this, ignore the comments are in foreign language but i don´t know exactly how to do the third loop in the addvec3, and the condition after

global ptrvec1, ptrvec2, ptrvec3
.section .text
.global   comuns #int comuns(void)
comuns:
movl $0, %eax # iniciar eax a 0
movl $0, %ebx # primeiro ciclo
movl $0, %ecx # segundo ciclo
movl $0, %edx # ciclo do vetor3
movl $ptrvec1, %ebp #endereco vetor1
movl $ptrvec2, %edi #endereco vetor2
movl $ptrvec3, %esi # resultado

ciclo:
cmpl $14, %ebx # compara para fim ciclo
je fim
movl (%ebp), %esp # move inteiro ptrvec1 para esp

ciclo2:
cmpl $14,%ecx # compara para fim ciclo2
je incrementarCiclo # se igual incrementa ciclo
movl (%edi), %eax
cmpl %eax, %esp #compara inteiro de esp com inteiro de edi
je adicionarAvetor3 # se igual adiciona a vetor3 em esi
jmp incrementarCiclo2 # se nao incrementao ciclo2

incrementarCiclo:
movl $0, %ecx # segundo ciclo a 0
incl %ebx # incrementa ciclo
addl $4, %ebp # passa para proximo inteiro vetor 1
jmp ciclo # passar para o ciclo

incrementarCiclo2: 
addl $4, %edi # passa para o proximo inteiro de vetor 2
incl %ecx # incrementa ciclo 2
jmp ciclo2


addvec3:



fim:
movl %edx,%eax
ret

the objective is to have 2 vec and compare them,if there repeated numbers check if the numbers aren't in the vec3 and add them.


Solution

  • If you've got not enough registers to store the variables, then use the memory:

    .section .data
    
        i: .int 0
        j: .int 0
        k: .int 0
        add: .int 0
        cont: .int 0
    
    .section .text
    
    comuns:
        movl $0, (i)
        ciclo1:
            cmpl $14, (i) # compara para fim ciclo
            jae endciclo1
    
            movl $0, (j)
            ciclo2:
                cmpl $14, (j) # compara para fim ciclo2
                jae endciclo2 # se igual incrementa ciclo
    
                ...
                movl $1, (add)
                incl (cont)
                ...
    
                movl $0, (k)
                ciclo3:
                    mov (cont), %eax
                    cmp %eax, (k)
                    jae endciclo3
    
                    ...
    
                    incl (k)
                    jmp ciclo3
    
                    endciclo3:
    
                ...
    
                incl (j)
                jmp ciclo2
    
            endciclo2:
    
            ...
    
            incl (i)
            jmp ciclo1
    
        endciclo1:
    
    fim:
        movl (cont),%eax
        ret