AngoLinux

Chiamata di funzioni C

- A cura del Prof. Stefano Salvi -


Chiamiamo delle funzioni C dall'assembler.

Il testo dell'esercizio è il seguente:

Scrivere un programma Assembler per 8086 che misuri la lunghezza di una stringa, ustilizzando la funzione di libreria strlen(char *str) e stampi un messaggio con la stringa da misurare ed il numero di caratteri della stringa, usando la funzione printf (char *format, ...).

NOTE:

  • La codifica delle istruzioni in formato AT&T, per l'assemblatore di Linux sono disponibili nel Reference delle istruzioni 80386 in formato AT&T (in inglese)
  • L'ambiente del C richiama una funzione di nome main, quindi il nostro programma dovrà essere scritto a partire da una label .global di nome main e dovrà terminare con una istruzione ret.
    Non è necessario utilizzare la chiamata ad exit per terminare il programma. Se si vuole ritornare un codice di terminazione, si deve lasciarlo nel registro %eax.
  • Tutte le funzioni di libreria lasciano il valore di ritorno nel registro %eax.
  • I parametri delle funzioni vanno posti nello stack (tramite operazioni push) in ordine inverso a come compaiono nel prototipo della funzione (per prima la push dell'ultimo parametro, per ultima la push del primo).
  • È compito del chiamante eliminare i parametri dallo stack. Questo potrà essere fatto con delle operazioni pop oppure sommando un valore allo stack (occorre sommare 4 per ogni parametro da togliere).

Una possibile soluzione è la seguente:
# lp2.s
# Stefano Salvi - 8/9/02
# Programma che calcola la lunghezza di una stringa costante
# Stampa un messaggio con la lunghezza.
# Utilizza funzioni di libreria C
#
.data
# Stringa da misurare
stringa: .string "Stringa da misurare\0"
# Formato di stampa per printf; richiede due dati da stampare
formato: .string "Stringa '%s' lunga %d caratteri\n"

.text
.globl main

main:
	pushl	$stringa	# Parametro: stringa da misurare
	call	strlen		# Chiama la funzione
	add	$4,%esp		# elimina il parametro dallo stack
	
	
	pushl	%eax		# Terzo parametro: Valore di ritorno di 'strlen'
	pushl	$stringa	# Secondo parametro: Stringa misurata
	pushl	$formato	# Primo parametro: stringa di formato
	call	printf		# Chiama la funzione
	add	$12,%esp	# Ripulisce lo stack

	ret			# Ritrona alla routine di avvio del C

Il sorgente del programma è strlen.s.

Per provare il programma, lo si deve assemblare, utilizzando lo script 'cc' del compilatore C, con il comando cc -o strlen strlen.s e quindi mandato in esecuzione con il comando ./strlen.


[Home Page dell'ITIS "Fermi"] [Indice Quarta] [Precedente] [Successivo]

© Ing. Stefano Salvi - Released under GPL licence