Assembly · Intermediário
Manipulação de Ponteiros e Arrays em Assembly
Enunciado
Considere o seguinte trecho de código em Assembly, que manipula um array de inteiros e utiliza ponteiros para acessar seus elementos:
```assembly
section .data
array db 1, 2, 3, 4, 5
length db 5
section .text
global _start
_start:
mov rsi, array ; Carrega o endereço do array em rsi
mov cl, [length] ; Carrega o tamanho do array em cl
xor rax, rax ; Zera rax para usar como índice
loop_start:
cmp rax, rcx ; Compara índice com tamanho
jge loop_end ; Se índice >= tamanho, sai do loop
movzx rbx, byte [rsi + rax] ; Carrega o elemento atual
; (Aqui você poderia fazer algo com rbx)
inc rax ; Incrementa o índice
jmp loop_start ; Volta para o início do loop
loop_end:
; Finaliza o programa
mov rax, 60 ; syscall: exit
xor rdi, rdi ; status: 0
syscall
```
- Explique como o código realiza a iteração sobre os elementos do array utilizando ponteiros.
- Identifique e discuta um possível bug que poderia ocorrer se o valor de
lengthfosse alterado para um número maior que o tamanho real do array. - Descreva como você poderia modificar o código para que ele imprimisse os valores do array na saída padrão (stdout).
Solução detalhada
- O código realiza a iteração sobre os elementos do array utilizando um ponteiro armazenado em
rsi, que contém o endereço base do array. O índiceraxé inicializado em 0 e é incrementado a cada iteração. A instruçãomovzx rbx, byte [rsi + rax]carrega o valor atual do elemento do array na variávelrbx, permitindo que o programador realize operações com esse valor. A comparaçãocmp rax, rcxgarante que o loop não exceda o tamanho do array, que está armazenado emcl.
- Se o valor de
lengthfosse alterado para um número maior que o tamanho real do array, o código poderia tentar acessar posições de memória que não pertencem ao array, resultando em um erro de segmentação (segmentation fault) ou, dependendo do sistema, em comportamento indefinido. Isso ocorre porque o loop não tem uma verificação adequada para garantir queraxnão ultrapasse o limite do array.
- Para modificar o código e imprimir os valores do array na saída padrão, você poderia adicionar uma chamada de sistema (syscall) para escrever na saída padrão. Abaixo está uma versão modificada do loop:
``assembly``
loop_start:
cmp rax, rcx ; Compara índice com tamanho
jge loop_end ; Se índice >= tamanho, sai do loop
movzx rbx, byte [rsi + rax] ; Carrega o elemento atual
; Converte o número para string e imprime (implementação não mostrada)
inc rax ; Incrementa o índice
jmp loop_start ; Volta para o início do loop
A conversão de rbx para string e a chamada para imprimir na saída padrão devem ser implementadas para que a modificação funcione corretamente.
Explorar Assembly · mais questões resolvidas da mesma matéria.
Outras questões
Pack sugerido: assembly-intermediario