Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-02-2007, 20:22   #1
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
[Assembly] Stampare Stringa Alla Rovescio

Ho un problema..il programma stampa oltre alla stringa ribaltata anche
faccine varie . E ed U..ovvero codice ascii casuali..come posso risolvere?
vi posto il codice..


.MODEL TINY
.CODE
ORG 0100h

START: jmp MAIN

STRINGA db 5,0,0,0,0,0,0


;----------------------------------------------------------------------------

MAIN PROC

;input stringa
mov ah,0ah
lea dx,STRINGA
int 21h

;stampa stringa
lea bx, STRINGA
inc bx
mov cx,0
mov cl,[bx]
inc bx
mov ah,2; stampa

;stampa stringa al contrario


Ribaltamento:


mov ch,0
lbl_a: mov cl,[bx]
mov dl,[bx]
inc bx
loop lbl_a
mov ch,0
mov cl,dl
lbl_r: mov dl,[bx]
mov ah,2
int 21h
dec bx
loop lbl_r
lbl_s: mov dl,[bx]
mov ah,2
int 21h
dec bx
loop lbl_s

int 20h
MAIN ENDP
;----------------------------------------------------------------------------
END START
END
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 07:56   #2
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
non ho provato il code ma prova a dichiarare la stringa così:
STRINGA DB "mia stringa",'$'

probabilmente ti stampa segno strani, cuoricini e faccine perchè hai messo lo 0 finale alla stringa con il tasm devi limitarla con il '$' finale.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 08:42   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da okay Guarda i messaggi
prova a dichiarare la stringa così:
STRINGA DB "mia stringa",'$'
Lui non deve mettere una stringa "literal", in quanto usa il servizio 0Ah/int 21h che effettua l'input di una stringa. Il buffer deve essere impostato con 2 byte di "header" come spiegato <qui>.

Quote:
Originariamente inviato da okay Guarda i messaggi
probabilmente ti stampa segno strani, cuoricini e faccine perchè hai messo lo 0 finale alla stringa con il tasm devi limitarla con il '$' finale.
Il tasm non c'entra nulla. Il '$' va usato come terminatore di una stringa solo quando si usa il servizio 09h/int 21h (che lui non ha usato).

Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
Ho un problema..il programma stampa oltre alla stringa ribaltata anche
faccine varie . E ed U..ovvero codice ascii casuali..come posso risolvere?
Il sorgente è un po' confuso ... ci sono istruzioni a mio avviso inutili.
Se vuoi stampare una stringa rovesciata, hai 2 possibilità: rovesciare fisicamente la stringa nel buffer e quindi stamparla, oppure stampare semplicemente i caratteri partendo dall'ultimo verso il primo.

Se non ci sono richieste/necessità particolari, consiglierei il secondo modo. Una volta che in CX hai la lunghezza della stringa e BX punta al byte che contiene la lunghezza, basta sommare CX a BX, quindi finché CX è diverso da 0 stampare il carattere in [BX] e decrementare BX e CX.
Verrebbe circa la metà di quanto hai scritto ...

EDIT: Invece di usare BX e CX si potrebbe usare SI come base e BX come offset, usando il modo di indirizzamento [BX+SI]. Sarebbe ancora meglio!!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 28-02-2007 alle 09:10.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 12:44   #4
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
Quote:
BX punta al byte che contiene la lunghezza,
Come faccio a puntare bx al byte contenente la lunghezza?

Quote:
per sommare poi
JZ lbl_somma



lbl_somma: ADD bx,cx
DEC cx
DEC bx

Ho cercato di tradurre in codice quello che mi hai detto..ora ci vorrebbe un tuo aiuto nel collegare tutto quanto
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 13:07   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
Ho cercato di tradurre in codice quello che mi hai detto..ora ci vorrebbe un tuo aiuto nel collegare tutto quanto
Guarda ... è abbastanza semplice. Nel tuo codice hai usato BX che punta inizialmente al primo byte del buffer e CX come contatore (la parte bassa la prendi dal secondo byte del buffer).

Nell'EDIT ho detto che si può usare l'indirizzamento [BX+SI]. In effetti non mi è venuto in mente subito ma consentirebbe di eliminare alcune istruzioni.
In sostanza usi SI per puntare al buffer e il contatore dei caratteri lo metti in BX. Cambia poco dal tuo, solo i registri.
Poi però se SI lo lasci che punta al secondo byte (quello della lunghezza restituita), facendo [BX+SI] prendi il carattere dall'ultimo fino al primo.

Ad ogni ciclo verifichi prima che BX sia uguale a zero e se lo è esci dal ciclo. Altrimenti prendi il carattere con [BX+SI], lo stampi e quindi decrementi BX e ripeti il ciclo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 14:37   #6
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
Siccome a scuola non abbiamo mai usato si, è meglio utlizzare i reigstir utilizzati fino ad ora..visto che è un esercitazione da consegnare

Non potendo usare si, devo utilizzare esclusivamente i registri
cx,bx,dx e ax..

Quote:
Nel mio caso Bx= primo byte
Ma non capisco come fare a dirgli..Leggi a partire dall' ultimo byte di bx( senza usare si ovviamente)..grazie x la disponibilità
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 14:54   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
Ma non capisco come fare a dirgli..Leggi a partire dall' ultimo byte di bx( senza usare si ovviamente)..grazie x la disponibilità
Uh ... ok, allora non usiamo SI.

Se in CX hai il numero di caratteri e BX sta puntando al secondo byte del buffer, basta che sommi CX a BX. Poi nel loop dovrai decrementare sia BX che CX.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 18:00   #8
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
Ribaltamento:
add cx,bx

jz
lbl_b: dec bx
dec cx
loop
mov cx,[bx]
mov ah,2

E ora nel codice? come fare a mettere in pratica quello che hai detto tu?
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 19:08   #9
pisto
 
Messaggi: n/a
OTtissimo

mi consigliate una guida per super principianti per l'assembly? si intende x86, e che sia possibilmente aggiornata e gratis
  Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 19:29   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
Ribaltamento:
add cx,bx

jz
lbl_b: dec bx
dec cx
loop
mov cx,[bx]
mov ah,2

E ora nel codice? come fare a mettere in pratica quello che hai detto tu?
No no .. alt. Intanto ho detto di sommare CX a BX, non il contrario. Poi nel loop innanzitutto bisogna controllare che CX sia diverso da zero (lo puoi fare con una CMP o anche con una OR su sé stesso). Se è zero, esci dal ciclo. Poi metti in DL il carattere (cioè [BX]), chiami il servizio 02H/int 21H, quindi decrementi BX e CX e ripeti da capo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2007, 23:05   #11
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
allora ecco:


Codice HTML:
SEG_A SEGMENT
ASSUME CS:SEG_A, DS:SEG_A
ORG 100H

Ribalta PROC FAR

inizio: jmp START ;salta a START

max_len EQU 1000 ;massima lunghezza 
sorgente db max_len dup(?) ;stringa da ribaltare
destinaz db max_len dup(?) ;stringa ribaltata

START:
mov si,OFFSET sorgente
prossimo_car: mov ah,01h ;legge un car dalla tastiera
int 21h
cmp al,0Dh ;è = a return ?
je fine_lettura ;se si smetti di leggere
mov sorgente[si],al ;sposta il carattere in sorgente
inc si ;incrementa si
jmp prossimo_car ;leggi il prossimo car



fine_lettura:
mov cx,si 
push cx ;memorizza la lunghezza nello stack
mov bx,OFFSET sorgente
mov si,OFFSET destinaz
add si,cx ;metto in si la lunghezza della stringa
dec si ;decrementa si

Ribaltamento:
mov al,[bx] ;routine di ribaltamento
mov [si],al ; parto dal fondo e la copio
inc bx ; in destinaz
dec si
loop Ribaltamento ; salto a Ribaltamento

pop si ;prelevo la lunghezza
mov destinaz[si+1],'$' ;aggiungo il terminatore
mov ah,09h 
mov dx,OFFSET destinaz
int 21h ;stampo la stringa ribaltata

RETN
Ribalta ENDP

SEG_A ENDS
END inizio
okay è offline   Rispondi citando il messaggio o parte di esso
Old 01-03-2007, 13:18   #12
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
Quello che mi hai postato utilizza si..e cmq l'avevo già trovato..non fa al caso mio..


Ok il programma stampa la stringa rovesciata ma con 3 faccine(che progresso ) Come mai?


;Ribaltamento
add bx,cx

lbl_b: cmp cx,0
je lbl_fine
mov dl,[bx]
dec bx
dec cx
int 21h
loop lbl_b


lbl_fine:
int 20h
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 01-03-2007, 13:29   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
Ok il programma stampa la stringa rovesciata ma con 3 faccine(che progresso ) Come mai?
metti un jmp lbl_b invece di loop.

Si potrebbe anche benissimo usare l'istruzione loop ma a quel punto dovresti: a) togliere dec cx (lo fa già loop) e b) la comparazione di cx con 0 la puoi fare solo una volta fuori dal ciclo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 01-03-2007, 16:57   #14
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da pisto Guarda i messaggi
mi consigliate una guida per super principianti per l'assembly? si intende x86, e che sia possibilmente aggiornata e gratis
http://xoomer.virgilio.it/ramsoft/
okay è offline   Rispondi citando il messaggio o parte di esso
Old 01-03-2007, 18:33   #15
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
Ho provato a mettere il jmp ma purtoppo se inserisco 123 mi stampa 323 e il programma termina..ci siamo quasi?
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 18:35   #16
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
non funge
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 19:25   #17
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
non funge
Riposta il codice completo che vediamo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 19:49   #18
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
; Assemblaggio come .COM:
; TASM [nomefile.ASM]
; TLINK [nomefile.OBJ] /t
;---------------------------------------------------------------------------
.MODEL TINY
.CODE
ORG 0100h

START: jmp MAIN

STRINGA db 5,0,0,0,0,0,0


;----------------------------------------------------------------------------

MAIN PROC

;input stringa
mov ah,0ah
lea dx,STRINGA
int 21h

;stampa stringa
lea bx, STRINGA
inc bx
mov cx,0
mov cl,[bx]
inc bx
mov ah,2; stampa

;stampa stringa al contrario



Ribaltamento:
add bx,cx

lbl_b: cmp cx,0
je lbl_fine
mov dl,[bx]
dec bx
dec cx
int 21h
jmp lbl_b


lbl_fine:
int 20h
MAIN ENDP
;----------------------------------------------------------------------------
END START
END
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 20:03   #19
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da dengel_1 Guarda i messaggi
lea bx, STRINGA
inc bx
mov cx,0
mov cl,[bx]
inc bx
Quest'ultima inc bx non ci deve essere. L'avevo anche detto ... "Se in CX hai il numero di caratteri e BX sta puntando al secondo byte del buffer..."
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 20:22   #20
dengel_1
Member
 
Iscritto dal: Feb 2007
Messaggi: 42
Si vede che sei un programmatore esperto

Ora funziona... grazie
dengel_1 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Le sonde spaziali ESA ExoMars e Mars Exp...
Roscosmos: static fire per i propulsori ...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:39.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v