|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Passaggio di funzione assembler
Questo codice assembler sembra dover gestire una semplice chiemata di funzione.
Il funzionamento e del tutto commentato, ma purtroppo non funziona perchè indipendentemente dall'offset si verifica sempre il caso di non coincidenza. Mi viene stampato sempre il messaggio 2 Ho provato a variare l'offset da aggiungere a BP ma non cambia nulla. (Il TASM non mi da errori di sorta) -------------------------------------------------------- pila SEGMENT STACK DW 40 DUP(?) pila ENDS dati SEGMENT msg1 DB 10,13, "Il valore passato coincide", 10,13,'$' msg2 DB 10,13, "Il valore passato non coincide", 10,13,'$' msg3 DB 10,13, "Prova",10,13,'$' dati ENDS code SEGMENT principale PROC FAR ASSUME CS: code, DS: dati, SS: pila start: MOV AX, SEG dati MOV DS, AX MOV DX, OFFSET msg3 MOV AH, 09H INT 21H MOV BX, 10H PUSH BX ; pone 10H in bx e pusha bx nello stack CALL secondario ; chiama la funzione seconfaria (la call, in riferimento alla chiamapta vicita fa una push dell'ip) MOV AH, 4CH INT 21H principale ENDP secondario PROC NEAR MOV AX, SEG dati MOV DS, AX PUSH BP MOV BP, SP ; salviamo bp nella pila e copiano in esso il contenuto si sp MOV BX, 10H ;copio in BX 10H CMP DS:[BP+4], BX ; confronto il vecchio valore messo nella pila dalla procedura principale con BX JE messo ;se sono uguali stampo il messaggio 1 JMP messa ;ltrimenti il messaggio2 messo: MOV DX, OFFSET msg1 MOV AH, 09H INT 21H MOV AX, 1D ; pongo in AX 1D Serviva per una eventuale sviluppo del programma JMP fine messa: MOV DX, OFFSET msg2 MOV AH, 09H INT 21H MOV AX, 0D ; pongo in AX 0D Serviva per una eventuale sviluppo del programma fine: RET ; ritorno alla funzione principale secondario ENDP code ENDS END start
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Scusate l'intrusione....mi sono accorto che stavo solo sbagliando segmento...
![]() Per cercare nello stack usavo DS anzichè SS Me ne dispiace davvero!
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
In realtà ora il programma finziona, ma non viene terminato correttamente.
In pratica il dos riporta: C:\TASM>coco.exe Inserisci un numero o un carattere 4 Inserisci un numero o un carattere 4 Il valore passato coincide o create PM stac©☺♥3╔═1&ïE¶ïð┴Û♠┴Ó â─8¸┬pected DOS error C:\TASM> Cosa sono qei caratteri? da dove nasce l'errore. Il codice è il seguente pila SEGMENT STACK DW 40 DUP(?) pila ENDS dati SEGMENT msg1 DB 10,13, "Il valore passato coincide", 10,13,'$' msg2 DB 10,13, "Il valore passato non coincide", 10,13,'$' msg3 DB 10,13, "Inserisci un numero o un carattere",10,13,'$' dati ENDS code SEGMENT principale PROC FAR ASSUME CS: code, DS: dati, SS: pila start: MOV AX, SEG dati MOV DS, AX MOV CX, 2D insert: MOV DX, OFFSET msg3 MOV AH, 09H INT 21H MOV AH, 01H INT 21H MOV BL,AL MOV BH, 0H PUSH BX DEC CX CMP CX, 0D JNE insert conf: CALL secondario ; chiama la funzione seconfaria (la call, in riferimento alla chiamapta vicita fa una push dell'ip) MOV AH, 4CH INT 21H principale ENDP secondario PROC NEAR MOV AX, SEG dati MOV DS, AX PUSH BP MOV BP, SP ; salviamo bp nella pila e copiano in esso il contenuto si sp MOV BX, SS:[BP+6] ;copio in BX il contenuto dell'elemento passato tramite la pila CMP SS:[BP+4], BX ; confronto il vecchio valore messo nella pila dalla procedura principale con BX JE messo ;se sono uguali stampo il messaggio 1 JMP messa ;altrimenti il messaggio2 messo: MOV DX, OFFSET msg1 MOV AH, 09H INT 21H MOV AX, 1D ; pongo in AX 1D Serviva per una eventuale sviluppo del programma JMP fine messa: MOV DX, OFFSET msg2 MOV AH, 09H INT 21H MOV AX, 0D ; pongo in AX 0D Serviva per una eventuale sviluppo del programma fine: RET ; ritorno alla funzione principale secondario ENDP code ENDS END start
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Prompt dei comandi-passa.exe
La CPU NTVDM ha incontrato un'istruzione non valida CS:06f0 IP:091e OP:ff ff ff 1e ff Scegliere chiudi per terminare l'operazione. Questo è il nuovo messaggio di errore che il don mi manda sotto un messaggio di errore di win. Eppure non ho modificato niente. Come mai queto improvviso cambio? Cosa c'è di sbagliato nella mia funzione?
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Possibile che nessuno mi possa aiutare, vi prego ragazzi domani ho l'esame e questa stupidaggine mi sta bloccando!
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
|
C'è ancora ki programma con l'assembler a 16bit sotto dos !!!
![]() Sinceramente sono passato ai 32bit x win da 4 anni....non capisco xke a scuola insegnino ancora ste cose.....cmq.....stai facendo casino con lo stack. Ricorda ke la call memorizza il punto x tornare indietro nello stack...qunidi se nella proc all'inizio qli fai Push BP ricorda di fare il Pop BP prima di tornare (Ret) altrimenti l'esecuzione punta all'indirizzo salvato in quel registro. Cmq giusto x renderlo + carino : pila SEGMENT STACK DW 40 DUP(?) pila ENDS dati SEGMENT msg1 DB 10,13, "Il valore passato coincide", 10,13,'$' msg2 DB 10,13, "Il valore passato non coincide", 10,13,'$' msg3 DB 10,13, "Inserisci un numero o un carattere",10,13,'$' dati ENDS code SEGMENT principale PROC FAR ASSUME CS: code, DS: dati, SS: pila start: MOV AX, SEG dati MOV DS, AX MOV CX, 2D insert: MOV DX, OFFSET msg3 MOV AH, 09H INT 21H MOV AH, 01H INT 21H Mov AH, 00h Push AX Loop insert ; il registro CX (chiamato contatore) è decrementato/testato in modo automatico conf: CALL secondario ; chiama la funzione seconfaria (la call, in riferimento alla chiamapta vicita fa una push dell'ip) MOV AX, 4C00H INT 21H principale ENDP secondario PROC NEAR MOV AX, SEG dati MOV DS, AX PUSH BP MOV BP, SP ; salviamo bp nella pila e copiano in esso il contenuto si sp MOV AH, 09H MOV BX, SS:[BP+6] ;copio in BX il contenuto dell'elemento passato tramite la pila CMP SS:[BP+4], BX ; confronto il vecchio valore messo nella pila dalla procedura principale con BX JE messo ;se sono uguali stampo il messaggio 1 MOV DX, OFFSET msg2 INT 21H Xor AX, AX ; pongo in AX 0D Serviva per una eventuale sviluppo del programma JMP fine ;altrimenti il messaggio2 messo: MOV DX, OFFSET msg1 INT 21H MOV AX, 1D ; pongo in AX 1D Serviva per una eventuale sviluppo del programma fine: Pop BP RET; ritorno alla funzione principale secondario ENDP code ENDS END start Ciao.
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
In effetti avevo capito quale fosse l'errore...ma pensavo che ormai il topic fosse sprofondato e così avevo lasciato perder.
P.S. Comunque non è scuola, ma università ![]() Siamo davvero così arretrati?
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
|
Se devo essere sincero visto ke lo faccio come lavoro non vengo mai in questa sezione
![]() Se siete arretrati ? Secondo me si...non ke questo sia un dramma, tanto l'assembler non è così diffuso, però l'ultimo programma sotto dos ke ho visto sviluppato (a prescindere dal linguaggio) appartiene ormai alla storia. Sarebbe + interessante ke si insegnino a utilizzarlo all'interno di codice C o simili sotto win a 32bit, tipicamente x le parti critiche del codice, dove il compilatore non riesce a fare i miracoli.
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
In effetti il programma del corso prevede di integrarlo nei rogrammi in C
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:23.