ASM Strano errore con nasm e linux

Stato
Discussione chiusa ad ulteriori risposte.

MadCoder

Utente Electrum
26 Aprile 2014
198
18
32
106
Salve a tutti, in questi giorni ho deciso di dedicarmi un po all' assembly. Ho provato a fare un semplice programmino che stampa a schermo tre parole( "ciao", "come" e "stai?" ) e fin qui tutto bene, l'output è corretto, il problema è alla fine, ovvero mi esce scritto anche "Errore di segmentazione (core dump creato)". Qualcuno sa spiegarmi il perchè ? non mi sembra di aver commesso errori di logica o sinstassi.

Codice:
section .data
   one: db 'Ciao ', 10, 0
   two: db 'come ', 10, 0
  end: db 'stai?', 10
   
   sOne equ $-one
   sTwo equ $-two
   sEnd equ $-end

section .text
   global _start

_start:
   ; stampo a schermo la prima parola
   mov ecx, one
   mov edx, sOne
   call print
   
   ; stampo a schermo la seconda parola
   mov ecx, two
   mov edx, sTwo
   call print

   ; stampo a schermo l'ultima parola
   mov ecx, end
   mov edx, sEnd
   call print

   mov eax, 1
   mov ebx, 0
   int 0x80

print:
   mov eax, 4
   mov ebx, 1
   int 80h

l'output è questo:
PHP:
Ciao
come
stai?
Errore di segmentazione (core dump creato)
 
da comunque lo stesso errore.
Ho provato adesso a cambiare print (ho aggiunto ret alla fine), adesso è cosi
Codice:
section .data
   one: db 'Ciao ', 10, 0
   two: db 'come ', 10, 0
  end: db 'stai?', 10, 0
  
   sOne equ $-one
   sTwo equ $-two
   sEnd equ $-end

section .text
   global _start

_start:
   ; stampo a schermo la prima parola
   mov ecx, one
   mov edx, sOne
   call print
  
   ; stampo a schermo la seconda parola
   mov ecx, two
   mov edx, sTwo
   call print

   ; stampo a schermo l'ultima parola
   mov ecx, end
   mov edx, sEnd
   call print

   mov eax, 1
   mov ebx, 0
   int 0x80

print:
   mov eax, 4
   mov ebx, 1
   int 0x80
   ret
Cosi non da più l'errore ma l'output non è correto
PHP:
Ciao
come
stai?
come
stai?
stai?
 
Se lo metto come hai detto l'output rimane identico, probabilmente ho capito male
Codice:
section .data
   one: db 'Ciao ', 10, 0
   two: db 'come ', 10, 0
   end: db 'stai?', 10, 0
  
   sOne equ $-one
   sTwo equ $-two
   sEnd equ $-end

section .text
   global _start

_start:
   ; stampo a schermo la prima parola
   mov ecx, one
   mov edx, sOne
   call print
  
   ; stampo a schermo la seconda parola
   mov ecx, two
   mov edx, sTwo
   call print

   ; stampo a schermo l'ultima parola
   mov ecx, end
   mov edx, sEnd
   call print

   mov eax, 1
   mov ebx, 0
   int 0x80

   mov eax, 0
   ret  ;                                       <-------

print:
   mov eax, 4
   mov ebx, 1
   int 0x80
   ret
 
Stato
Discussione chiusa ad ulteriori risposte.