Esempio pratico: inversione di una stringa

Da Hacknowledge.

Con le conoscenze che abbiamo maturato finora (syscall, variabili, salti condizionati, operazioni logico-aritmetiche) consideriamo un piccolo esempio che non fa altro che prendere una stringa da stdin, invertire fra loro i caratteri al loro interno e stampare quindi la stringa ribaltata. Il codice è abbastanza commentato e con le conoscenze che abbiamo ora non dovrebbe essere un problema capirlo:

.data
  // La mia stringa
  str:            .space  30
 
  // Lunghezza di str
  s_len = .-str
 
  // Stringa per il carattere a capo
  nline:  .string "\n"
 
.text
        .global main
main:
        # Leggo la stringa da stdin (sys_read)
        movl            $3,%eax
        movl            $0,%ebx
        movl            $str,%ecx
        movl            $s_len,%edx
        int             $0x80
 
        # In %edi metto la lunghezza della stringa
        movl            $s_len,%edi
 
loop:
        # Metto l indirizzo di $str[%edi] in %ecx
        movl            $str,%ecx
        addl            %edi,%ecx
 
        # Stampo $str[%edi] su stdout (sys_write)
        movl            $4,%eax
        movl            $1,%ebx
        movl            $1,%edx
        int             $0x80
 
        # Decremento %edi. Una volta arrivato a 0, esco dal ciclo
        decl            %edi
        cmpl            $-1,%edi
        jne             loop
 
        # sys_exit(0)
        movl            $1,%eax
        movl            $0,%ebx
        int             $0x80
Strumenti personali