DOMANDA Stampare stringa di caratteri in Assembly

Pubblicità

Haidakan

Nuovo Utente
Messaggi
125
Reazioni
2
Punteggio
35
Salve, sembra un problema veramente stupido, ma non riesco in alcun modo a stampare una stringa di caratteri in assembly. Ho provato scrivendo
messaggio1 db 'Hello World!' , '$' (insieme alle altre istruzioni come model, stack ecc.) ma non restituisce nulla. Provando in altri modi trovati qua e la su internet mi stampa caratteri strani che sembrano non supportati...
Grazie in anticipo
 
Salve, sembra un problema veramente stupido, ma non riesco in alcun modo a stampare una stringa di caratteri in assembly. Ho provato scrivendo
messaggio1 db 'Hello World!' , '$' (insieme alle altre istruzioni come model, stack ecc.) ma non restituisce nulla. Provando in altri modi trovati qua e la su internet mi stampa caratteri strani che sembrano non supportati...
Grazie in anticipo

Ti servono le funzioni 09H per la visualizzazione della stringa e 0AH per la sua acquisizione, la stringa la devi dichiarare nel segmento dati (ad es. messaggio db "Hello World! $") e l'indirizzo devi porlo nel registro DX (ad esempio utilizzando l'istruzione LEA) :sisi:
Infine ricorda che per richiamare una funzione devi inserire il numero della funzione nel registro AH e quindi richiedere i servizi DOS con l'istruzione INT 21H :asd:
A presto ;)
 
Sto iniziando a studiare assembly anch'io per un esame all'università. Questo codice è scritto nell'assembly dell'Intel 8086
Codice:
.MODEL small
.STACK
.DATA
stringa DB "Hello World!"
dim DB 12       ;salvo la dimensione della stringa
.CODE
.STARTUP
MOV DI, 0         ;inizializzio a 0 l'indice nel registro DI
MOV CH, dim       ;copio la dimensione nel registro CH
MOV AH, 2         ;parametro per la INT 21H che specifica che vogliamo stampare
    ciclo: MOV DL, stringa[DI] ;sposto nel registro DL (quello usato dalla INT 21h) il carattere da stampare
        INT 21H  ;stampa il carattere presente in DL
        DEC CH   ;decremento il numero di caratteri rimanenti
        INC DI   ;incremento l'indice
    CMP CH,0     ; CH == 0
    JNZ ciclo    ;"JumpNotZero", torna a ciclo: se la condizione del CMP non è verificata
.EXIT
END

Magari c'è un modo più semplice ma non saprei
 
Sto iniziando a studiare assembly anch'io per un esame all'università. Questo codice è scritto nell'assembly dell'Intel 8086
Codice:
.MODEL small
.STACK
.DATA
stringa DB "Hello World!"
dim DB 12       ;salvo la dimensione della stringa
.CODE
.STARTUP
MOV DI, 0         ;inizializzio a 0 l'indice nel registro DI
MOV CH, dim       ;copio la dimensione nel registro CH
MOV AH, 2         ;parametro per la INT 21H che specifica che vogliamo stampare
    ciclo: MOV DL, stringa[DI] ;sposto nel registro DL (quello usato dalla INT 21h) il carattere da stampare
        INT 21H  ;stampa il carattere presente in DL
        DEC CH   ;decremento il numero di caratteri rimanenti
        INC DI   ;incremento l'indice
    CMP CH,0     ; CH == 0
    JNZ ciclo    ;"JumpNotZero", torna a ciclo: se la condizione del CMP non è verificata
.EXIT
END

Magari c'è un modo più semplice ma non saprei

In effetti questo è sufficiente:

Codice:
.MODEL small

.STACK

.DATA
stringa DB "Hello World!$"

.CODE
.STARTUP

mov   ah, 09h
mov   dx, offset stringa
int   21h

.EXIT
END

09h è l'ISR richiesta, mentre 21h - come diceva sopra gronag - è l'interrupt dei servizi del DOS. Qui maggiori info: http://spike.scu.edu.au/~barry/interrupts.html#ah09
L'esempio postato da te, @stokdam , ha inoltre come limitazione il numero di caratteri mantenuto in una costante. Di norma si utilizza un carattere terminatore della stringa (quel $ che vedi al termine della stessa).
 
Grazie mille, adesso funziona :)
Oltre al fatto che non sapevo si dovesse usare l'offset, scrivevo tutto sotto .startup e perciò mi dava caratteri strani ahahah
Solo una cosa, se volessi stampare più volte lo stesso messaggio con un ciclo come potrei fare?
 
Ultima modifica:
Grazie mille, adesso funziona :)
Oltre al fatto che non sapevo si dovesse usare l'offset, scrivevo tutto sotto .startup e perciò mi dava caratteri strani ahahah
Solo una cosa, se volessi stampare più volte lo stesso messaggio con un ciclo come potrei fare?
Dovresti tenere un contatore, solitamente CX.
Ad esempio:

Codice:
xor cx, cx
_while:
cmp  cx, 10
jge     _endwhile

; stampa la stringa

inc cx
jmp _while
_endwhile:
 
Pubblicità
Pubblicità
Indietro
Top