[NASM] un programma semplice e commentato
Posted by quakkaro on 08-11-2006 15:46
premessa: AMBIENTE LINUX

-scaricatevi le demo dal questo link : http://www.drpaulcarter.com/pcasm/linux-ex.zip

-create i vostri .asm dentro la cartella che contiene i vostri files scompattati. vi renderà il lavoro piu semplice perche avrete a disposizine il driver.o e asm_io.o necessari per eseguire i vostri super programmi che andrete a creare ed altre fonti per ulteriori copia-incolla!

- create un file e chiamatelo "test1.asm"

-incollategli il seguente codice: (puo essere formattato male a causa della risoluzione del vostro monitor)


%include "asm_io.inc"

segment .data ; inzializzo e assegno le costanti. Non possono essere piu cambiate.
;
;Stringhe di output
;

ask_first_number db "Insert plz the first num: ", 0 ;Diretteva Byte 0 = indica 1 byte (credo e/o spero)
ask_second_number db "Insert plz the second num: ", 0
response_add db "ADD result: ", 0

segment .bss ; segmento contenente le variabili nn inizializzate

input1 resd 1 ; si usa RESX -> d sta per double. in [input1] mettero il primo numero che mi verrà inserito
input2 resd 2 ; in [input2] metterò il secondo valore che verra inserito

segment .text ; segmento contenente lo stack... il codice da eseguire
global asm_main ; lancia il pezzo di codice definito asm_main

asm_main: ;pezzo di codice chiamato asm_main
enter 0,0 ;setup routine --> crea uno stack frame
pusha ; metti tutto il codice nello stack

mov eax, ask_first_number ; sposta nel regitro eax la direttiva di out db
call print_string ; chiamata di routine di asm_io

;Per utilizzare le routine di stampa, occorre caricare in ;EAX il valore corretto e utilizzare l’istruzione CALL
;per invocare la routine. L' istruzione CALL è equivalente
;ad una chiamata di funzione in un linguggio di alto
;livello. CALL sposta l'esecuzione di un'altra sezione di
;codice, e ritorna all' origine della chiamata quando la
;routine è completata
;!!!IMPORTANTE!!!!!
; ricordarsi che funziona solo se i valori sn carcati in EAX

call read_int ; richiedo input all utente
mov [input1], eax ; sposto in [input] il valore di eax
; sposto in [input] il valore di eax (utilizzo le [] per
; indicare il contenuto di input e nn l' indirizzo di
; memoria)


mov eax, ask_second_number ; metto nel registro eax -> ask_second_number
; notare come per questo tipo di direttiva nn indico il suo
; contenuto con le [] Non so il perchè ma è cosi! :|

call print_string ; chiamo la routine di asm_io

call read_int ; chiamo routine di asm_io per prendere dati da tastiera
mov [input2], eax

; faccio l' addizione

mov eax, response_add
call print_string

mov eax, [input1] ; eax = [input1]
add eax, [input2] ; eax = eax + [input2]

call print_int ; stampo a video il risultato
; !!!!ATTENZIONE!!!!!
; è un int ed uso print_int e non print_string


call print_nl ;new line -> va a capo


popa
mov eax, 0 ;ritorna a C
leave ;lascia lo stack
ret ;main return to operating system



- ora assembliamo, compiliamo, linkiamo e lanciamo:

assembliamo:
myro@myro-laptop:~/Università/SIcurezza 2/homeworkNasm$ nasm -f elf test1.asm
compiliamo il driver.c:
myro@myro-laptop:~/Università/SIcurezza 2/homeworkNasm$ gcc -c driver.c
linkiamo:
myro@myro-laptop:~/Università/SIcurezza 2/homeworkNasm$ gcc -o prg_test1 test1.o driver.o asm_io.o
eseguiamo:
myro@myro-laptop:~/Università/SIcurezza 2/homeworkNasm$ ./prg_test1


Insert plz the first num: 3
Insert plz the second num: 3
ADD result: 6


p.s.
il comando gcc -c driver.c serve a compilare. una volta fatto è nn serve più compilarlo

dicendovi di mettere tutto nella cartella delle demo di asm per far girare il tutto in realtà nn è cosi neccessario, perche vi servirebbero solo i files asm_io e driver.
purtroppo copiando solo questi files con le relative estensioni giuste, a me nn va. evidentemente serve qualche altro file che nn ho capito bene quale. se qualcuno sa la risposta, plz posti :oops:
Powered by: vbHome (lite) v3.8 and vBulletin v2.3.1
Copyright © 2000 - 2002 Jelsoft Enterprises Limited