|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
[ASM] modificare variabile
mi sto addentrando nel assembly e vorrei modificare questo codice
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
(per esempio mi dica ciò che ho commentato nel blocco) ma non so proprio come fare... Ultima modifica di andros94 : 16-12-2012 alle 21:10. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Premetto che non ho capito esattamente cosa tu voglia fare ma ti propongo del codice per vedere se ci capiamo
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
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
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
Intendevo dere che ci dovrebbe essere una sola variabile per il testo e che vorrei
modificare il suo contenuto nei blocchi IF/ELSE |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Se ti esprimi in maniera così criptica non avrai molte risposte.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
|
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
Quote:
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 ;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
Ultima modifica di andros94 : 17-12-2012 alle 14:36. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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. |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
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 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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. |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
non potrei inserire una stringa minore delle dimensioni massime o comunque scrivere su quel buffer?
topo MOV msgboxtest,"abc" Ultima modifica di andros94 : 18-12-2012 alle 07:50. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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? |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2011
Città: Cassino
Messaggi: 326
|
state proprio avanti... io proprio adesso sto facendo asm MIPS... ma qui vedo già cose i386...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:56.




















