PDA

View Full Version : [ASM] modificare variabile


andros94
16-12-2012, 20:05
mi sto addentrando nel assembly e vorrei modificare questo codice
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption db "Esempio finestra",0
MsgBoxText db "Ciao mondo!",0

.code
start:
invoke MessageBox,
NULL,
addr MsgBoxText,
addr MsgBoxCaption,
MB_ICONERROR OR MB_ABORTRETRYIGNORE

.IF eax==IDABORT
;interrompi

.ELSEIF eax==IDRETRY
; riprova

.ELSEIF eax==IDCANCEL
;ignora
.ENDIF

invoke ExitProcess,NULL
end start

in modo che in ogni blocco IF/ELSEIF debba solo invocare MessageBox pero oppurtunamente modificando il testo dentro la variabile MsgBoxText
(per esempio mi dica ciò che ho commentato nel blocco) ma non so proprio come fare...

lorenzo001
16-12-2012, 23:24
Premetto che non ho capito esattamente cosa tu voglia fare ma ti propongo del codice per vedere se ci capiamo


.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption db "Esempio finestra",0
MsgBoxText db "Ciao mondo!",0
MsgBoxText1 db "abort",0
MsgBoxText2 db "retry",0
MsgBoxText3 db "cancel",0

.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_ICONERROR OR MB_ABORTRETRYIGNORE

cmp eax,IDABORT
jnz nxt1
invoke MessageBox, NULL, addr MsgBoxText1, addr MsgBoxCaption, MB_OK
jmp fine

nxt1:
cmp eax,IDRETRY
jnz nxt2
invoke MessageBox, NULL, addr MsgBoxText2, addr MsgBoxCaption, MB_OK
jmp fine

nxt2:
cmp eax,IDIGNORE
jnz fine
invoke MessageBox, NULL, addr MsgBoxText3, addr MsgBoxCaption, MB_OK

fine:
invoke ExitProcess,NULL
end start

andros94
17-12-2012, 06:20
Intendevo dere che ci dovrebbe essere una sola variabile per il testo e che vorrei
modificare il suo contenuto nei blocchi IF/ELSE

lorenzo001
17-12-2012, 08:33
Se ti esprimi in maniera così criptica non avrai molte risposte.

VegetaSSJ5
17-12-2012, 11:14
Se ti esprimi in maniera così criptica non avrai molte risposte.
Credo che lui intenda dire che non vuole definire nessuna stringa MsgBoxText, ma inserire la stringa da visualizzare direttamente "inline" all'interno dei blocchi if.

andros94
17-12-2012, 12:58
Credo che lui intenda dire che non vuole definire nessuna stringa MsgBoxText, ma inserire la stringa da visualizzare direttamente "inline" all'interno dei blocchi if.
la stinga la definisco e la assegno in .DATA ma poi voglio poter cambiare il suo valore nel corso del programma

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption db "Esempio finestra",0
MsgBoxText db "Ciao mondo!",0 ;questo rimane così

.code
start:
invoke MessageBox,
NULL,
addr MsgBoxText,
addr MsgBoxCaption,
MB_ICONERROR OR MB_ABORTRETRYIGNORE

.IF eax==IDABORT
;qui vorrei modificare il valore di MsgBoxText
; per esempio come si fa ne C MsgBoxText="hai selezionato interrompi "
; e poi richiamare di nuovo
;invoke MessageBox,
;NULL,
;addr MsgBoxText,
;addr MsgBoxCaption,
;MB_ICONERROR OR MB_ABORTRETRYIGNORE

.ELSEIF eax==IDRETRY
; riprova

.ELSEIF eax==IDCANCEL
;ignora
.ENDIF

invoke ExitProcess,NULL
end start

in pratica vorrei usare una sola variabile per il testo e quindi riassegnare il valore durante il corso del programma

lorenzo001
17-12-2012, 18:12
Prima considerazione : da dove arriva il nuovo valore della stringa? da tastiera ? Oppure? Se è una costante, allora l'esempio che ti ho mostrato prima è quello che cerchi.

Seconda considerazione : lo spazio allocato per MsgBoxText è ben definito. Se devi sostituire il suo contenuto con un'altra stringa (supponendo che arrivi da tastiera) allora devi prevedere un buffer di dimensioni adeguate.

andros94
17-12-2012, 20:37
scusate ma sto appena imparando l' asm

io ho la variabile MsgBoxTex che è uguale a "Ciao mondo!" giusto,
nella struttura If vorrei assegnare un altro valore a MsgBoxText che è uguale a ciò che ho scelto (per esempio la stringa "hai premuto annulla").

la suddetta stringa non viene da tastiera ma è scritto nel codice.

dopo la prima msgbox (quella di scelta)dovrebbe apparinre un' altra che dice cosa ho premuto

**********************************************************

ciò che voglio sapere è se nell 'asm si può cambiare il valore della variabile in seguito alla dichiarazione

tipo :
MsgBoxText="abort" o qualcosa del genere

oppure devo per forza dichiarare 4 variabili

lorenzo001
18-12-2012, 00:25
Devi comprendere che nel tuo caso si può parlare di costanti stringa dato che la frase è nel codice.

In realtà MsgBoxText non è proprio una variabile (come in un linguaggio di alto livello) ma il puntatore ad un buffer di memoria, con dimensioni ben definite e non modificabili.

Quindi, non potrai inserire in quell'area una stringa di dimensioni maggiori e non ha senso utilizzarla per un'altra stringa che comunque dovrai memorizzare nel testo.

A questo punto usa diverse stringhe (dai un'occhiata al codice che ti ho postato).

Se poi dovrai usare un buffer per l'input da tastiera (o da file) allora avrà senso dimensionare un buffer adeguatamente e fornirne l'indirizzo e la massima dimensione alle funzioni di input.

andros94
18-12-2012, 06:47
non potrei inserire una stringa minore delle dimensioni massime o comunque scrivere su quel buffer?
topo MOV msgboxtest,"abc"

lorenzo001
18-12-2012, 09:34
In assembly non hai a disposizione tutto quello che ti appare normale in un linguaggio di alto livello, proprio perché lavori direttamente con memoria e registri della CPU.

Su quel buffer ci puoi scrivere ma la stringa sorgente (quella che tu indichi con "abc") deve stare da qualche parte prima di essere copiata e quindi la devi inserire in un buffer. Ovvero avrai

MsgBoxText db "Ciao mondo!",0
AltraStringa db "abc",0

e potrai trasferire con le apposite istruzioni (per esempio una rep movsb) i caratteri di AltraStringa in MsgBoxText. Ma come ti dicevo prima, se hai già in memoria il buffer contenente AltraStringa perché non utilizzarla direttamente invece di copiarla?

andros94
18-12-2012, 12:23
Ma come ti dicevo prima, se hai già in memoria il buffer contenente AltraStringa perché non utilizzarla direttamente invece di copiarla?

volevo sapere se era possibile fare come dicevo io,per capire le dinamiche del linguaggio

grazie 1000 :D

pinosx
20-12-2012, 17:09
state proprio avanti... io proprio adesso sto facendo asm MIPS... ma qui vedo già cose i386...