[ASM] A che serve addl??

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Plaoo
Linux 3.x
Linux 3.x
Messaggi: 809
Iscritto il: gio 10 apr 2008, 17:40
Slackware: 14 64
Kernel: 3.2.9
Desktop: KDE
Località: Ittiri (SS)

[ASM] A che serve addl??

Messaggio da Plaoo »

Salve a tutti sto leggendo un manuale di programmazione assembler su linux (quello di Claudio Daffra) ho questo esempio:

Codice: Seleziona tutto

#Primo programma

#SEZIONE DATI
.section .data
output_string:
.ascii "Hello world\n\0"
#SEZIONE DATI FINE

#SEZIONE CODICE
.section .text

.globl _start

_start:

pushl           $output_string
call               printf
addl             $4,%esp ;<-------a che serve??

pushl           $0
call              exit
#SEZIONE CODICE FINE
Qualcuno mi può spiegare a che serve quel addl sul registro dello stack?? Ho fatto altri programmi con stringhe più lunghe e variabili "spinte" e "riprese" dallo stack senza usare addl e non è successo niente i programmi funzionano benissimo lo stesso.
Il canale ufficiale di slacky.eu si trova sui server irc.syrolnet.org canale #slackware

Avatar utente
Naitso
Linux 2.x
Linux 2.x
Messaggi: 208
Iscritto il: lun 10 nov 2008, 15:09

Re: [ASM] A che serve addl??

Messaggio da Naitso »

dopo il primo esempio trovi la riga:
addl (trattazione estesa nel capitolo: Aritmetica e Logica 2)
nel capitolo 5 è spiegato
Ciao

Avatar utente
Plaoo
Linux 3.x
Linux 3.x
Messaggi: 809
Iscritto il: gio 10 apr 2008, 17:40
Slackware: 14 64
Kernel: 3.2.9
Desktop: KDE
Località: Ittiri (SS)

Re: [ASM] A che serve addl??

Messaggio da Plaoo »

Naitso ha scritto:dopo il primo esempio trovi la riga:
addl (trattazione estesa nel capitolo: Aritmetica e Logica 2)
nel capitolo 5 è spiegato
Ciao
Certo ho controllato, quindi so che somma ma perchè c'è bisogno di farlo??
Il canale ufficiale di slacky.eu si trova sui server irc.syrolnet.org canale #slackware

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [ASM] A che serve addl??

Messaggio da Mario Vanoni »

In

http://linuxgazette.net/issue94/ramankutty.html

5. Using The Stack

A section of your program's memory is reserved for use as a stack. The Intel 80386 and above microprocessors contain a register called stack pointer, esp, which stores the address of the top of stack. Figure 1 below shows three integer values, 49,30 and 72, stored on the stack (each integer occupying four bytes) with esp register holding the address of the top of stack.
Figure 1

Unlike the stack analogous to a pile of bricks growing up wards, on Intel machines stack grows down wards. Figure 2 shows the stack layout after the execution of the instruction pushl $15.
Figure 2

The stack pointer register is decremented by four and the number 15 is stored as four bytes at locations 1988, 1989, 1990 and 1991.

The instruction popl %eax copies the value at top of stack (four bytes) to the eax register and increments esp by four. What if you do not want to copy the value at top of stack to any register? You just execute the instruction addl $4, %esp which simply increments the stack pointer.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In Listing 3, the instruction call foo pushes the address of the instruction after the call in the calling program on to the stack and branches to foo. The subroutine ends with ret which transfers control to the instruction whose address is taken from the top of stack. Obviously, the top of stack must contain a valid return address.

Anche se non ho mai usato asm.

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [ASM] A che serve addl??

Messaggio da phobos3576 »

Come ha già scritto Mario Vanoni, si tratta della convenzione seguita dal linguaggio C per la pulizia dello stack quando si esce da un procedura (o funzione); tale convenzione è opposta a quella del linguaggio Pascal.

Prima di tutto, bisogna ricordare che, secondo la sintassi (bella o brutta, a seconda dei gusti) dell'Assembly AT&T:

l = long = 32 bit
w = word = 16 bit
b = byte = 8 bit

Convenzione Pascal:

Codice: Seleziona tutto

pushl    $output_string ; inserisce un parametro a 32 bit (4 byte) nello stack
call     printf         ; chiama la procedura printf

; Qui il programma prosegue dopo l'uscita dalla procedura printf
; Lo stack viene pulito automaticamente dall'istruzione RET all'uscita da printf
Convenzione C:

Codice: Seleziona tutto

pushl    $output_string  ; inserisce un parametro a 32 bit (4 byte) nello stack
call     printf          ; chiama la procedura printf
addl     $4,%esp         ; pulizia dello stack (4 byte) DOPO l'uscita da printf

Avatar utente
Plaoo
Linux 3.x
Linux 3.x
Messaggi: 809
Iscritto il: gio 10 apr 2008, 17:40
Slackware: 14 64
Kernel: 3.2.9
Desktop: KDE
Località: Ittiri (SS)

Re: [ASM] A che serve addl??

Messaggio da Plaoo »

Grazie ragazzi siete stati molto chiari!!! :thumbright:
Il canale ufficiale di slacky.eu si trova sui server irc.syrolnet.org canale #slackware

Rispondi