Devo stampare 5 volte un asterisco in assembly

di il
7 risposte

Devo stampare 5 volte un asterisco in assembly

Qui sotto allego il codice, mi va in segmentation faul
sono alle prime armi con assembly in terza itis e sto facendo fatica

section .data
asterisco: db "*", 10
lasterisco: equ $-asterisco

section .bss

section .text

global _start

_start:

mov edx, 5
call _stampaasterisco

_stampaasterisco:
push rdx  
push rbx
push rcx
push rax

mov ecx, edx
 
cicloasterischi:
call _stampasterischi
loop cicloasterischi
cmp ecx, edx

pop rdx   
pop rbx
pop rcx
pop rax  
ret

_stampasterischi:
push rdx  ;prendo il contenuto del registro e lo metto in memoria, poi incremento di uno lo stack pointer
push rbx
push rcx
push rax
mov eax, 4
mov ebx, 1
mov ecx, asterisco
mov edx, lasterisco
int 0x80
pop rdx   ;decremento di 1 lo stack pointer 
pop rbx
pop rcx
pop rax  
ret

fine:
mov eax, 1
mov ebx, 0
int 0x80

7 Risposte

  • Re: Devo stampare 5 volte un asterisco in assembly

    Leggi il regolamento … a che serve “aiuto” nel titolo?

    E il codice va tra tag CODE …

    In _stampasterischi i pop vanno fatti in ordine contrario rispetto ai push … stai lavorando con uno stack

  • Re: Devo stampare 5 volte un asterisco in assembly

    27/02/2023 - oregon ha scritto:


    Leggi il regolamento … a che serve “aiuto” nel titolo?

    E il codice va tra tag CODE …

    In _stampasterischi i pop vanno fatti in ordine contrario rispetto ai push … stai lavorando con uno stack

    ok, ho sistemato il post

    Nel codice, invertendo i pop, l'esecuzione si ferma in core dump

    “Errore di segmentazione (core dump creato)”

  • Re: Devo stampare 5 volte un asterisco in assembly

    Cioè adesso il codice com'è?

    E dopo

    call _stampaasterisco

    come finisce il programma? Mi pare che manchino le istruzioni per terminare …

  • Re: Devo stampare 5 volte un asterisco in assembly

    Questo è il codice dopo la modifica

    section .data
    asterisco: db "*", 10
    lasterisco: equ $-asterisco

    section .bss

    section .text

    global _start

    _start:

    mov edx, 5
    call _stampaasterisco

    _stampaasterisco:
    push rdx  
    push rbx
    push rcx
    push rax

    mov ecx, edx
     
    cicloasterischi:
    call _stampasterischi
    loop cicloasterischi
    cmp ecx, edx

    pop rdx   
    pop rbx
    pop rcx
    pop rax  
    ret

    _stampasterischi:
    push rdx  ;prendo il contenuto del registro e lo metto in memoria, poi incremento di uno lo stack pointer
    push rbx
    push rcx
    push rax
    mov eax, 4
    mov ebx, 1
    mov ecx, asterisco
    mov edx, lasterisco
    int 0x80
    pop rax 
    pop rcx
    pop rbx
    pop rdx   ;decremento di 1 lo stack pointer 

    ret

    fine:
    mov eax, 1
    mov ebx, 0
    int 0x80

  • Re: Devo stampare 5 volte un asterisco in assembly

    Ok ho aggiunto jmp fine dopo call _stampaasterisco e ho risolto

    grazie mille

  • Re: Devo stampare 5 volte un asterisco in assembly

    Guarda che anche push e pop non sono ancora corretti e del jmp non c'è bisogno

    section .data
    asterisco: db "*", 10
    lasterisco: equ $-asterisco
    
    section .bss
    section .text
    global _start
    _start:
    
    push rax  
    push rbx
    push rcx
    push rdx
    
    mov edx, 5
    call _stampaasterisco
    
    pop rdx   
    pop rcx
    pop rbx
    pop rax  
    
    mov eax, 1
    mov ebx, 0
    int 0x80
    
    _stampaasterisco:
    mov ecx, edx
    
    cicloasterischi:
    call _stampasterischi
    loop cicloasterischi
    ret
    
    _stampasterischi:
    mov eax, 4
    mov ebx, 1
    mov ecx, asterisco
    mov edx, lasterisco
    int 0x80
    ret
    
    
  • Re: Devo stampare 5 volte un asterisco in assembly

    section .data
        asterisk db "*"
    
    section .text
        global _start
    
    _start:
        ; prepara il conteggio
        mov ecx, 5
    
    loop:
        ; stampa l'asterisco
        mov eax, 4        ; la system call per scrivere su stdout
        mov ebx, 1        ; stdout
        mov ecx, asterisk ; il carattere da stampare
        mov edx, 1        ; la lunghezza del carattere
        int 0x80          ; esegui la system call
    
        ; decrementa il conteggio e controlla se abbiamo finito
        loop loop
    
    exit:
        ; esce dal programma
        mov eax, 1   ; la system call per uscire
        xor ebx, ebx ; il codice di uscita (0 = successo)
        int 0x80     ; esegui la system call
    
Devi accedere o registrarti per scrivere nel forum
7 risposte