PDA

Visualizza la versione completa : [assembler] Questo strano dilemma


Rebirth_85
06-12-2003, 17:38
Ciao a tutti, chiedo scusa se ho già pubblicato questo 3D in precedenza, ma non riesco più a trovarlo, nemmeno col motore di ricerca...
Vorrei che qualcuno mi scrivesse una procedura per creare e gestire arrays o robe simili permettendo di porre al suo interno dei limiti...
Mi spiego meglio: ecco quello che ho ideato io:

_code segment para public 'code'
org 100h
inizio:jmp main

seek_var proc near
xor ax,ax
mov al,dh
add al,[xR0]
mov bl,[YN]
mul bl
add al,[yR0]
xor dh,dh
add ax,dx
mov bx,si
add bx,ax
mov si,bx
ret
seek_var endp


main:
mov ah,00
mov al,03
int 10h
mov byte ptr [xR0],5
mov byte ptr [yR0],5
mov byte ptr [xRN],15
mov byte ptr [yRN],15
mov cx,1900
mov al,32
mov si, offset buffer
ciclo:
push cx
mov [si],al
inc si
inc al
cmp al,127
jb ok
mov al,32
ok:
pop cx
loop ciclo
mov si, offset buffer
mov ah,00
int 16h
dec al,30h
mov dh,al
mov ah,00
int 16h
dec al,30h
mov dl,al

push dx
call seek_var
pop dx
add dh,[xR0]
add dl,[yR0]
mov bh,00
mov ah,02
int 10h
mov al,[si]
mov cx,0001
mov bh,00
mov bl,04eh
mov ah,09
int 10h
mov ah,00
int 16h
mov ah,4ch
int 21h

xR0 db 00
xRN db 00
yR0 db 00
yRN db 00
X0 db 00
XN db 24
Y0 db 00
YN db 79
buffer db 2000 dup(?)
_code ends

Questo funziona alla perfezione... (salvo un difettuccio che provvederò a eliminare...ma di mior entità...)
Ovviamente la parte MAIN è a solo scopo di test, ....
Vorrei sapere se esiste una codice più ottimizzato o più semplice,.....
Ciao a tutti e grazie

Rebirth_85
06-12-2003, 19:31
ok, mi focalizzerò su qualcosa di più particolare:
se io ho
AL=0ffh
AH=00
e faccio ADD AL,X <-- dove X è un numero maggiore di 0
ottengo
AH=00
AL=00 (se X era 1, alrimenti AL=(X-1))
per fare in modo che AH=1
DEvo fare un controllo dell'overflow flag/carry flag ogni volta che faccio l'addizione???

Es:

mov bl,1
xor ax,ax
mov al,54h
ciclo:
add al,bl
jnc ciclo ; oppure jno ciclo
inc ah
jmp ciclo

Oviamente questo esempio è inutile! Ma è questo l'unico modo per fare ciò? Infatti ho l'esigenza di considerare AL e non AX in quanto il compilatore non mi consente di fare ADD AX,BL in quanto registri di lunghezza diversa...
Ok, potrei fare
xor bh,bh
add ax,bx
ma se al posto di bl io avessi una variabile??? Ok, potrei definire una word, ma sprecherei 1 byte... (che pignolo)...
Comunque spero in un consiglio...

Rebirth_85
07-12-2003, 09:19
Nessuno a cui piace l'assembler??? :jam:

Rebirth_85
07-12-2003, 16:43
Nessuno che sa darmi un consiglio o scrivermi un codice ottimizzato???

scancode
08-12-2003, 02:26
per quanto riguarda la prima domanda il codice può essere ottimizzato come per cancellare (tipo il System(cls) di microsoft vc.
di routine così ce ne sono tante......... se vuoi te ne posto qualcuna.


per la seconda, .........

se vuoi fare in modo che ah sia a 1, ovvero 111 che corrisponde a -1, ma potrebbe corrispondere anche a +7, questo però è importante per te cioè, è importante per il programmatore, in quanto per il computer AX=111 corrisponde indifferentemente sia a -1 che a +7, Sta al programmatore in fase di stampa, dopo conversione da binario a stringa, stampare il valore che gli interessa ovvero -1 o +7.
Cosa vuol dire questo?
Se vuoi che a video venga mostrato il valore -1, devi stampare il carattere - e poi visualizzi 1, per accorgerti che corrisponde ad un valore negativo devi controllare il 3 bit che appunto sia negato e valga appunto 1. Se il 3 bit è 1 e consideri in numero in complemento a 1 (ovvero -127 +127), allora satmpi il numero 7.

Comunque sia se addizioni a 8bit cioè AL o AH il registrotrabboccherà per overfloow....... nel tuo esempio avrai non AH=01, ma un overfloow su AL(se il numero è >1)............. quindi è chearo che per avere il numero 111 devi lavorare con registri a 16bit OVVERO AX

ciao amico

Rebirth_85
08-12-2003, 20:47
beh, ho la necessità di lavorare esclusivamente con numeri POSITIVI, quindi non mi interessano i negativi ed i complementi...
Il mio dubbio era sul modo migliore per verificare se un'adadizione aveva generato un overflow...
COmunque grazie mille.
a proposito, non trovo un comando per settare lo Zero flag o il Carry flag o l'overflow flag direttamente...
sono costretto a fare
Mov ah,0ffh
inc ah
SOLO COSI' riesco a far settare l'overflow flag...
Credevo che i comandi fossero SZ è SNZ e via dicendo, ma il compilatore me li segnala come Unknown mnemonic....

scancode
08-12-2003, 21:11
neg eax ;controlla il bit + significativo, se è 1 il numero è negativo
; ....ma come detto prima, potrebbe essere positivo, dipende
; da cosa vuoi fare tu se stampare -1 o +7

...
imul ebx ; moltiplicazione
jc overf ;se overfloow vai all'etichetta overf


--------------------

CLEAR_SCREEN PROC ; funziona quasi come il com CLS del DOS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR AL,AL ;Cancella intera finestra
XOR CX,CX ;L'angolo superiore sinistro è a (0,0)
MOV DH,24 ;La riga inferiore dello schermo è la 24
MOV DL,79 ;Il limite destro è la colonna 79
MOV BH,7 ;Utilizza l'attributo normale per spazi
MOV AH,6 ;Richiama la funzione SCROLL-UP
INT 10h ;Cancella la finestra

MOV AH,06 ; funzione SCROLL UP
MOV AL,0 ; numero di linee 0
MOV BH,01110000b ; attributo di riemp.
;MOV BH,4 ; attributo di riemp
MOV CH,0 ; riga angolo alto sn 0
MOV CL,0 ; col. angolo alto sn 0
MOV DH,24 ; riga angolo basso dx 24
MOV DL,79 ; col. angolo basso dx 79
INT 10h ; interruzione BIOS


POP DX
POP CX
POP BX
POP AX
RET
CLEAR_SCREEN ENDP



ciao
--------------------

OT............
visto che ci sono............

Sto sviluppando un motore grafico con directx8 in direct3d
tutto procede bene, oggetti che ruotano, sfondi, sprite in movimento e finalmente il terreno.........okay

sul mio pc dove sviluppo il gioco con vc6 ho una scheda grafica buona di acquisizione video e gli oggetti (cubi sprite ecc,ecc) si vedono bene, mentre su altri pc gli oggetti sono trasparenti quindi per questo motivo, in particolar modo il terreno, è trasparente..........
dipenderà dalla scheda grafica?????

Se vuoi provarlo te lo faccio scaricare, sono circa 4.5 mb
(dovrei testarlo su altri pc)

Rebirth_85
11-12-2003, 14:36
ok, sono disposto molto volentieri a testarlo.
Ho 2 pc, uno con Matrox G-400, l'altro con scheda video PCI (è moooolto vecchio)...
Conosco molte persone con G-400, Ati radeon, Ge-force 2...
Quindi posso testarlo in lungo e in largo.
Se vuoi dimmi da dove scaricarlo.
Magari se usi ICQ posso scariarlo un giorno.
Se vuoi mandami un msg in privato.
Ciao.Grazie ancora.

scancode
11-12-2003, 17:07
Il problema l'ho risolto.
Era una funzione light();
in cui ho duvuto disabilitare l'AlphaBlendig
.. quindi tutto ok...

In privato ti mando il link per scaricarlo

Loading