DOMANDA Stampare stringa di caratteri in Assembly

Haidakan

Nuovo Utente
125
2
CPU
Intel core i7 4790 - 3.60 Ghz
Scheda Madre
ASRock H81M-DGS R2.0
HDD
TOSHIBA DT01ACA100
RAM
8 GB DDR3
GPU
Nvidia Geforce GT 610
Audio
Integrata
Monitor
LG L1960TQ
PSU
Da 500 W
OS
Windows 8.1 Pro (64 bit)
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
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Posta il codice, devi inserire le parti giuste nei vari registri
 
U

Utente 16812

Ospite
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 ;)
 

stokdam

Nuovo Utente
21
3
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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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).
 
  • Mi piace
Reazioni: Utente 16812

Haidakan

Nuovo Utente
125
2
CPU
Intel core i7 4790 - 3.60 Ghz
Scheda Madre
ASRock H81M-DGS R2.0
HDD
TOSHIBA DT01ACA100
RAM
8 GB DDR3
GPU
Nvidia Geforce GT 610
Audio
Integrata
Monitor
LG L1960TQ
PSU
Da 500 W
OS
Windows 8.1 Pro (64 bit)
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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:
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!