Programao em assembly Variveis noestruturadas reservar registos sempre
Programação em assembly Variáveis não-estruturadas • reservar registos sempre que possível • restantes variáveis em memória Exemplo int d, a=100, c=10, d=15; main () { d = a / (c + d); }. text li $s 0, 100 li $s 1, 10 li $s 2, 15 add $t 0, $s 1, $s 2 div $s 2, $s 0, $t 0 jr $ra Pseudo-instruções # a=100 # c=10 # d=15 # d = a/(c +d) div $s 0, $t 0 mflo $s 2 addi $s 0, $0, 100 07/01/2022 Arquitectura de Computadores 1
Programação em assembly Estruturas de controlo de fluxo: if. . then. . else. . Exemplo int a, b, c; main () { if (a==b) c = c+1; else c = c-1; }. text bne $s 0, $s 1, else addi $s 2, 1 b fim # a==b ? ? ? # c = c+1 else: addi $s 2, -1 fim: jr $ra Pseudo-instrução beq $0, fim 07/01/2022 Arquitectura de Computadores 2
Programação em assembly Estruturas de controlo de fluxo: if. . then. . else. . Exemplo int a, b, c; main () { if (a>=b) c = c+1; else c = c-1; }. text blt $s 0, $s 1, else addi $s 2, 1 b fim # a<b ? ? ? # c = c+1 else: addi $s 2, -1 fim: jr $ra Pseudo-instrução slt $at, $s 0, $s 1 bne $at, $0, else 07/01/2022 Arquitectura de Computadores 3
Programação em assembly Estruturas de controlo de fluxo: while (. . ) {. . } Exemplo int a, b; main () { while (a>b) a++; }. text ciclo: ble $s 0, $s 1, fim addi $s 0, 1 b ciclo # a>b ? ? ? # a = a+1 fim: jr $ra Pseudo-instrução slt $at, $s 1, $s 0 beq $at, $0, fim Optimização. text b fim ciclo: addi $s 0, 1 fim: bgt $s 0, $s 1, ciclo jr $ra 07/01/2022 Arquitectura de Computadores 4
Programação em assembly Estruturas de controlo de fluxo: for (. . ; . . ) {. . } Exemplo int a, b, i; main () { for (i=0 ; i<a ; i++) b = b + a; }. text li $t 0, 0 ciclo: bge $t 0, $s 0, fim add $s 1, $s 0 addi $t 0, 1 b ciclo # i<a ? ? ? # b = b+a # i++ fim: jr $ra Pseudo-instrução slt $at, $t 0, $s 0 beq $at, $0, fim Poder-se-á aplicar uma optimização semelhante à do exemplo anterior? 07/01/2022 Arquitectura de Computadores 5
Programação em assembly Variáveis estruturadas: arrays XXXX Endereço base [0] Deslocamento = índice * factor de escala XXXX+4 [1] XXXX+8 [2] 07/01/2022 Arquitectura de Computadores 6
Programação em assembly Variáveis estruturadas: arrays Exemplo int a[10], i; main () { for (i=0 ; i<10 ; i++) a[i] = a[i] + 5; }. text li $t 0, 0 la $t 1, a ciclo: bge $t 0, 10, fim add $t 2, $t 0 add $t 2, $t 2 add $t 2, $t 1, $t 2 lw $t 3, 0($t 2) addi $t 3, 5 sw $t 3, 0($t 2) addi $t 0, 1 b ciclo # i<10 ? ? ? # $t 2 = i*2 # $t 2 = i*4 # a[i]=a[i]+5 # i++ fim: jr $ra 07/01/2022 Arquitectura de Computadores 7
Programação em assembly Variáveis estruturadas: arrays Acesso com apontadores Exemplo int a[10], *ptr; main () { for (ptr=a ; ptr<a+10 ; ptr++) *ptr = *ptr + 5; }. text la $t 0, a la $t 1, a addi $t 1, 40 # ptr = a bge $t 0, $t 1, fim lw $t 2, 0($t 0) addi $t 2, 5 sw $t 2, 0($t 0) addi $t 0, 4 b ciclo # ptr < a+10 ? ? ? # controlo do ciclo: # *ptr = *ptr + 5 # ptr++ fim: jr $ra 07/01/2022 Arquitectura de Computadores 8
Programação em assembly Variáveis estruturadas: estruturas Exemplo struct { double frac; int cnt; } a[10]; int i; main () { for (i=0 ; i<10 ; i++) a[i]. cnt = a[i]. cnt + 5; }. text li $t 0, a la $t 1, a # i = 0 bge $t 0, 10, fim mul $t 2, $t 0, 12 add $t 2, $t 1, $t 2 lw $t 3, 8($t 2) addi $t 3, 5 sw $t 3, 8($t 2) addi $t 0, 1 b ciclo # i < 10 ? ? ? # factor de escala ciclo: # offset = 8 # i++ fim: jr $ra 07/01/2022 Arquitectura de Computadores 9
Programação em assembly Stack Estrutura de dados mantida em memória, utilizada para manter dados com caracter temporário O registo $sp aponta para o início da última palavra colocada na stack A stack cresce de endereços mais altos para endereços mais baixos AAAA $sp AAAA+4 Push Pop subu $sp, 4 sw $t 0, 0($sp) lw $t 0, 0($sp) add $sp, 4 07/01/2022 Arquitectura de Computadores 10
Programação em assembly Procedimentos e funções Passos na execução de uma função: 1. Passagem de parâmetros Utilização de registos ($a 0. . $a 3) Stack para os restantes 2. Transferência de controlo jal <label> 3. Aquisição de recursos de memória para variáveis locais Salvaguardar os registos utilizados Stack para variáveis adicionais 4. Execução da rotina 5. Retorno do resultado Registos ($v 0, $v 1) 6. Transferência de controlo Reposição de registos jr $ra 07/01/2022 Arquitectura de Computadores 11
Programação em assembly Procedimentos e funções Vamos analisar o seguinte exemplo, tendo em conta que main também é uma função e que as várias funções podem ser codificadas separadamente. main () { int a, b, c; a = 10; b = 15; c = multi (a, b); . . . } int multi (int m 0, int m 1) { int i, res; res = 0; for (i=0 ; i<m 1 ; i++) res = res + m 0; return (res); } 07/01/2022 Arquitectura de Computadores 12
Programação em assembly Procedimentos e funções Solução: todos os registos têm que ser salvaguardados. text main: sub $sp, 20 sw $ra, 16($sp) sw $v 0, 12($sp) sw $a 0, 8($sp) sw $a 1, 4($sp) sw $t 0, 0($sp) li $a 0, 10 # a=10 li $a 1, 15 # b=15 jal multi move $t 0, $v 0. . . lw $t 0, 0($sp) lw $a 1, 4($sp) lw $a 0, 8($sp) lw $a 1, 12($sp) lw $ra, 16($sp) addi $sp, 20 jr $ra 07/01/2022 multi: sub $sp, 4 sw $t 0, 0($sp) li $v 0, 0 # res=0 li $t 0, 0 # i=0 ciclo: bge $t 0, $a 1, fim add $v 0, $a 0 addi $t 0, 1 b ciclo fim: lw $t 0, 0($sp) addi $sp, 4 jr $ra Arquitectura de Computadores 13
Programação em assembly Procedimentos e funções Na solução anterior são guardados em memória 6 registos, o que implica penalizações com acessos à memória Convenciona-se que: • os registos $t podem ser utilizados pelas funções sem que precisem de os salvaguardar • os registos $s, se alterados, são sempre salvaguardados • os registos $a e $v podem ser utilizados sem salvaguardar NOTA: Se uma função invoca outra e tem nos registos $t, $v, $a ou $ra valores de que necessita, então é a função invocadora a responsável por guardar estes valores. 07/01/2022 Arquitectura de Computadores 14
Programação em assembly Procedimentos e funções Solução: utilizando a convenção. text main: sub $sp, 4 sw $ra, 0($sp) li $a 0, 10 # a=10 li $a 1, 15 # b=15 jal multi move $t 0, $v 0. . . lw $ra, 0($sp) addi $sp, 4 jr $ra multi: li $v 0, 0 # res=0 li $t 0, 0 # i=0 ciclo: bge $t 0, $a 1, fim add $v 0, $a 0 addi $t 0, 1 b ciclo fim: jr $ra Apenas um registo é guardado na stack 07/01/2022 Arquitectura de Computadores 15
Programação em assembly Funções recursivas int factorial (int n) { if (n<=1) return (1); else return (n* factorial(n-1)); } ASSEMBLY factorial: sub $sp, 8 sw $ra, 4($sp) sw $a 0, 0($sp) bgt $a 0, 1, else li $v 0, 1 b fim else: addi $a 0, -1 jal factorial lw $a 0, 0($sp) mult $v 0, $a 0, $v 0 fim: lw $ra, 4($sp) addi $sp, 8 jr $ra 07/01/2022 Arquitectura de Computadores 16
Programação em assembly Activation record Se os registos não suficientes para todas as variáveis ou parâmetros, então estas são guardadas na stack, no activation record Parâmetros $fp Antigo $fp Endereço de retorno Registos $sp 07/01/2022 Variáveis locais Arquitectura de Computadores 17
- Slides: 17