[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
Powered by: vbHome (lite) v3.8 and vBulletin v2.3.1
Copyright © 2000 - 2002 Jelsoft Enterprises Limited