|
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
|