PDA

Visualizza la versione completa : [ASSEMBLER] Operazioni sui caratteri (visualizzazione, colorazione, ...)


Helgast
20-02-2007, 13:56
Salve a tutti

Volevo sapere se qualcuno poteva aiutarmi col seguente esercizio di assembler...

visto che le mie conoscenze sono limitate :master: o deciso di postare qui per cercare aiuto


Allora l'esercizio richiede di creare un programma (in assembler) che:

1) Trasformi le lettere maiuscole presenti a video in minuscole

2) Al posto dei numeri inserire il carattere *

3) Visualizzare le lettere presenti sullo schermo in reverse di colore, ovvero se ad esempio una lettera è bianca su sfondo nero, bisogna rappresentarla nera su sfondo bianco

4) Colorare con colori casuali (sia di sfondo che di carattere) i dittonghi(due vocali di seguito) presenti sullo schermo

I primi due punti del programma sono riuscito a svolgerli da solo, i punti 3 e 4 però non ho idea di come poterli fare :(


EXTRN getche:FAR, putch:FAR, getbyte:FAR, putbyte:FAR, randomize: FAR, rand:FAR

; Segmento di definizione dati

DIM1 EQU 16
; Segmento Dati
DATA SEGMENT
VETT1 DB DIM1 DUP (?) ; vettore di 16 byte
DATA ENDS

; Segmento Stack

STACK SEGMENT STACK
DW 128 DUP (?)
STACK ENDS

; Segmento Video

VIDEO SEGMENT at 0B800h
DW 2000 DUP (?)
VIDEO ENDS

; Segmento Programma

CODE SEGMENT
START PROC FAR ; la procedura principale necessariamente FAR
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:VIDEO

MOV AX,DATA ; Il registro di segmento DS adesso fa riferimento
MOV DS,AX ; alla zona dati
MOV AX,VIDEO ; Il registro di segmento ES adesso fa riferimento
MOV ES,AX ; alla zona video
;
; PROGRAMMA UTENTE
XOR SI,SI
XOR DI,DI
XOR BX,BX
CICLO: MOV AL,ES:[BX]
CMP AL,'A'
JB FORSENUM
CMP AL,'Z'
JA NOLETTERA
ADD AL,'a'-'A'
JMP NOLETTERa
FORSENUM: CMP AL,'0'
JB NOLETTERa
CMP AL,'9'
JA NOLETTERA
MOV AL,'*'
NOLETTERA: MOV ES:[BX],AL
FINE: ADD BX,2
CMP BX,4000
JB CICLO

MOV AH,4Ch
INT 21h

START ENDP
CODE ENDS
;
END START
; Chiusura file, richiama la procedura principale, inserire invio
; affinchè l'assemblatore riconosca l'ultima riga


Volevo quindi sapere se qualcuno è in grado di modificare il programma qui sopra e ripostarlo completo x favore...

Grazie in anticipo per qualsiasi forma di aiuto.

alka
20-02-2007, 16:01
Usa titoli più significativi in futuro, come richiesto dal Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887), indicando una descrizione rappresentativa del problema, oltre al linguaggio.

Ciao! :ciauz:

Helgast
20-02-2007, 16:25
Originariamente inviato da alka
Usa titoli più significativi in futuro, come richiesto dal Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887), indicando una descrizione rappresentativa del problema, oltre al linguaggio.

Ciao! :ciauz:

ok scusa... terrò a mente... :(

Helgast
21-02-2007, 11:00
Qualcuno conosce bene l'assembler e mi può aiutare? altrimenti qualche link utile pls...

scancode
21-02-2007, 16:58
Originariamente inviato da Helgast
Salve a tutti

Volevo sapere se qualcuno poteva aiutarmi col seguente esercizio di assembler...

visto che le mie conoscenze sono limitate :master: o deciso di postare qui per cercare aiuto


Allora l'esercizio richiede di creare un programma (in assembler) che:

1) Trasformi le lettere maiuscole presenti a video in minuscole

2) Al posto dei numeri inserire il carattere *

3) Visualizzare le lettere presenti sullo schermo in reverse di colore, ovvero se ad esempio una lettera è bianca su sfondo nero, bisogna rappresentarla nera su sfondo bianco

4) Colorare con colori casuali (sia di sfondo che di carattere) i dittonghi(due vocali di seguito) presenti sullo schermo

I primi due punti del programma sono riuscito a svolgerli da solo, i punti 3 e 4 però non ho idea di come poterli fare :(


EXTRN getche:FAR, putch:FAR, getbyte:FAR, putbyte:FAR, randomize: FAR, rand:FAR

; Segmento di definizione dati

DIM1 EQU 16
; Segmento Dati
DATA SEGMENT
VETT1 DB DIM1 DUP (?) ; vettore di 16 byte
DATA ENDS

; Segmento Stack

STACK SEGMENT STACK
DW 128 DUP (?)
STACK ENDS

; Segmento Video

VIDEO SEGMENT at 0B800h
DW 2000 DUP (?)
VIDEO ENDS

; Segmento Programma

CODE SEGMENT
START PROC FAR ; la procedura principale necessariamente FAR
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:VIDEO

MOV AX,DATA ; Il registro di segmento DS adesso fa riferimento
MOV DS,AX ; alla zona dati
MOV AX,VIDEO ; Il registro di segmento ES adesso fa riferimento
MOV ES,AX ; alla zona video
;
; PROGRAMMA UTENTE
XOR SI,SI
XOR DI,DI
XOR BX,BX
CICLO: MOV AL,ES:[BX]
CMP AL,'A'
JB FORSENUM
CMP AL,'Z'
JA NOLETTERA
ADD AL,'a'-'A'
JMP NOLETTERa
FORSENUM: CMP AL,'0'
JB NOLETTERa
CMP AL,'9'
JA NOLETTERA
MOV AL,'*'
NOLETTERA: MOV ES:[BX],AL
FINE: ADD BX,2
CMP BX,4000
JB CICLO

MOV AH,4Ch
INT 21h

START ENDP
CODE ENDS
;
END START
; Chiusura file, richiama la procedura principale, inserire invio
; affinchè l'assemblatore riconosca l'ultima riga


Volevo quindi sapere se qualcuno è in grado di modificare il programma qui sopra e ripostarlo completo x favore...

Grazie in anticipo per qualsiasi forma di aiuto.



non ci penso proprio a rifartelo:

mov ax,0B800h ; segmento del buffer del video
mov es,ax ; mettilo in es
xor di,di ; azzera di, ES:DI punta alla memoria video
mov ah,4 ; attributo - rosso (red)
mov al,"G" ; carattere da scrivere
...

oppure a blocchetto:

// by okay alias scancode

.model tiny
.code
org 100h

Start:

mov Row,4 ; riga di stampa del carattere
mov Col,5 ; colonna di stampa del carattere
mov Char,254 ; codice ascii del carattere da visualizzare
mov Colour,4 ; colore con cui visualizzarlo

call PrintChar ; stampa il carattere
mov ax,4C00h ; termina il programma
int 21h

PrintChar PROC NEAR

push ax cx bx ; salva i registri che saranno cambiati

xor bh,bh ; azzera bh - pagina video 0
mov ah,2 ; funzione 2 - sposta il cursore
mov dh,Row
mov dl,Col
int 10h ; chiamata al Bios

mov al,Char
mov bl,Colour
xor bh,bh ; pagina di visualizzazione - 0
mov ah,9 ; funzione 09h stampa carattere con attributo
mov cx,1 ; visualizzane una sola copia
int 10h ; chiama il servizio del Bios

pop bx cx ax ; ripristina i registri

ret ; riprende dal punto in cui era stata chiamata
PrintChar ENDP

; variabili per memorizzare i dati

Row db ?
Col db ?
Colour db ?
Char db ?

end Start

Loading