Newsgroup: it.comp.lang.visual-basic
Titolo: problemino assembly





ciao a tutti, ho il seguente problema.


devo richiamare da VB un programma scritto in 
assembly, che però parte solo se come linea di comando riceve una determinata 
password.


il programma gia l'ho fatto, e funziona benissimo, 
il problema è proprio la lettur adella line adi comando.


qualcuno del NG gia mi disse che doveva usare la 
funzione 21,2F, ma il mio problema ora è un altro.


come faccio, una volta chiamata questa funzione, a 
metterla in una variabile dichiarata Vuota all'inizio del programma 
asm?


devo usare sicuramente mov, ma in che modo? so che 
la linea di comando viene scritta in ES:DI, ma mica si puo scrivere mov 
argument,[ES:DI] o qualcosa del genere...


 


un modo per risolvere puo essere quello di usare, 
prima, l'interrupt "Set DTA" (21,1A). e sembra funzinoare.


 


perche vi ho scritto, dunque? beh, per sapere se 
qualcuno in ogni caso puo aiutarmi col problema piu generale di assegnare, per 
altre eventualita, un valore a una variabile, quando questo valore è una stringa 
che si trova in un determinato indirizzo.


 


grazie.


 


mario


 


 



 wrote in message
news:001b01c04efe$1bc18160$2af02dd5@h2k6e7...


Ma la funzione shell per lanciare dei programmi non fa' al caso tuo???
Salve
            Dbg





beh... so benissimo che questo è un NG sul 
visual basic, ma un NG sull'Asm non l'ho trovato e poi, da quando frequento 
questo NG ho avuto modo di constatare che siete tutti dei bravissimi 
programmatori, che conoscete diversi linguaggio, che date sempre ottime 
risposte, consigli, ecc. insomma dei geni dell'informatica... suvvia non siate 
modesti... (che leccata...::)))))


qualcuno sicuramente sa come fare... 
::)))


 


mario


 


 



Intanto non ho ben capito perchè hai bisogno di copiare la linea di comando
in una variabile: se hai bisogno di controllare la password puoi controllare
quello che c'è scritto in es:di. E poi non ho capito perchè non puoi usare
mov arg, [es:di] (come vedi ti sono di grande aiuto...): se non te lo sposta
in una locazione di memoria prova a spostarlo in un registro.
Comunque la persona ideale per rispondere al quesito è aa, se legge il
messaggio dovrebbe risponderti
"MH" ha scritto nel messaggio <001b01c04efe$1bc18160$2af02dd5@h2k6e7>...


 wrote in message
news:001b01c04efe$1bc18160$2af02dd5@h2k6e7...
ciao a tutti, ho il seguente problema.
devo richiamare da VB un programma scritto in assembly, che però parte solo
se come linea di comando riceve una determinata password.
il programma gia l'ho fatto, e funziona benissimo, il problema è proprio la
lettur adella line adi comando.
qualcuno del NG gia mi disse che doveva usare la funzione 21,2F, ma il mio
problema ora è un altro.
come faccio, una volta chiamata questa funzione, a metterla in una variabile
dichiarata Vuota all'inizio del programma asm?
devo usare sicuramente mov, ma in che modo? so che la linea di comando viene
scritta in ES:DI, ma mica si puo scrivere mov argument,[ES:DI] o qualcosa
del genere...
---
    Dovresti usare una REPZ:CMPSB se non ricordo male... Si ferma quando
trova una differenza tra le stringhe. Controlla sui manuali ASM.
    Tu hai un array in [ES:DI], dovresti confrontarlo con uno in [DS:SI],
dove [DS:SI] e' l'indirizzo di memoria in cui hai scritto la tua password
(quindi devi prima mettere in DS:SI segmento e puntatore alla variabile che
contiene la password)
    Metti in CX la lunghezza della password e accertati di cominciare dalla
lettera giusta strippando gli spazi iniziali con una REP:SCASB su 20H...
     Poi lascio alla tua abilita' il come pulire il mio suggerimento per
trarne un assemblato funzionante :)
    Occhio al flag di avanzamento.
---
un modo per risolvere puo essere quello di usare, prima, l'interrupt "Set
DTA" (21,1A). e sembra funzinoare.
perche vi ho scritto, dunque? beh, per sapere se qualcuno in ogni caso puo
aiutarmi col problema piu generale di assegnare, per altre eventualita, un
valore a una variabile, quando questo valore è una stringa che si trova in
un determinato indirizzo.
---
    I casi sono due:
    1) Conosci la lunghezza della stringa (che in tal caso puo' non essere
terminata)
    2) Non conosci la lunghezza della stringa (che in tal caso deve essere
terminata)
    Nel caso 1 (occhio che la variabile dichiarata all'inizio deve essere di
lunghezza sufficiente e passami se la sintassi non e' pulitissima ma non
tocco ASM da almeno un anno):
    MOV CX, [strlen]
    REP
    MOVSB
    Nel caso 2 (strlen a questo punto e' la dimensione del tuo buffer)
    MOV CX, [strlen]
    REPNZ
    MOVSB
    Se non ricordo male con questa sintassi continua a copiare la stringa
finche' non trova un NULL terminator o  finche' non arriva alla massima
lunghezza possibile.
    Poi c'e' il problema piu' generale di allocare memoria in runtime... Se
in DOS o stai scrivendo una routine per Win? C'e' una bella differenza...
---
grazie.
mario
---
Ciaotutti,
Alessandro





innanzitutto grazie 1000 per avermi 
risposto.


per quanto riguarda quella funzione 21,1A, ho 
provato meglio e non funziona.


 


per quanto riguarda il confronto tra le due 
stringhe, approfondisco meglio quella sintassi e poi faccio proprio così 
(credo).


 


per quanto riguarda infine il problema di spostare 
cio che si trova in una locazione di mem su una variabile, quando hai 
scritto


 


mov cx,[strlen]


rep


movsb


 


ci sono 2 cose che non mi sono chiare. è 
indispensabile racchiudere strlen tra le parentesi? se io scrivo mov cx,strlen 
non va a mettere in cx il VALORE di strlen?


e poi, rep e movsb servono per spostare in 
ripetizione, ma DOVE???? come faccio a metterele in una mia 
variabile?


grazie di nuovo.


 


mario


 


 



 wrote in message
news:002e01c05082$dae846c0$e3bfabd4@h2k6e7...
innanzitutto grazie 1000 per avermi risposto.
per quanto riguarda quella funzione 21,1A, ho provato meglio e non funziona.
per quanto riguarda il confronto tra le due stringhe, approfondisco meglio
quella sintassi e poi faccio proprio cosě (credo).
per quanto riguarda infine il problema di spostare cio che si trova in una
locazione di mem su una variabile, quando hai scritto
mov cx,[strlen]
rep
movsb
ci sono 2 cose che non mi sono chiare. č indispensabile racchiudere strlen
tra le parentesi? se io scrivo mov cx,strlen non va a mettere in cx il
VALORE di strlen?
---
Adesso la sintassi dei compilatori non me la ricordo... Dovresti poter
scrivere MOV CX, strlen e ricevere il valore, se non funzia prova con MOV
CX, [strlen].
---
e poi, rep e movsb servono per spostare in ripetizione, ma DOVE???? come
faccio a metterele in una mia variabile?
---
    Leggi l'help per movsb... L'unico modo di trattare le stringhe e'
spostarle da un posto all'altro della memoria oppure a byte, word o dword in
un registro.
    Se non ricordo male usano la coppia ES:DI - DS:SI, una in lettura
l'altra in scrittura. Occhio a quali sono i parametri giusti, senno' la tua
stringa sovrascrivera' la lina di comando :)
---
grazie di nuovo.
mario
---
Ciaotutti,
Alessandro