|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Mar 2014
Messaggi: 5
|
[Assembly] Stampa di un messaggio al contrario
Salve! Ho 17 anni ed ho iniziato a studiare il linguaggio Assembly da qualche mese... Oggi mi sono trovato un problema: come esercizio ho da stampare un messaggio inizializzato al contrario... Mi sono bloccato perchè non riesco a capire come "estrapolare" il valore contenuto nella cella "0102"
Codice HTML:
#make_COM# ORG 100h jmp start msg db 'Il ciclista', '$' inizio dw 00h cont1 dw 00h start: lea dx, msg mov inizio, dx mov cont1, dx add cont1, 10d mov cx, inizio controllo: cmp cont1, cx JE fine ;QUI DEVO METTERCI LA PARTE DI CODICE PER STAMPARE IL CONTENUTO DELLA CELLA 010C... dec cont1 jmp controllo fine: mov ah, 4ch int 21h Spero mi riusciate ad aiutare, grazie mille in anticipo! P.S.: Come ambiante utilizzo "Emu8086 v2.57" |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Ovvero "come complicare un ciclo"...
ad ogni modo devi utilizzare un interrupt per stampare i caratteri uno alla volta, nelle cartelle di emu8086 ci sono molti esempi, in alternativa puoi guardare uno dei tanti esempi disponibili in rete, tipo questo: http://showmecodes.blogspot.it/2012/...-assembly.html |
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: Mar 2014
Messaggi: 5
|
Quote:
P.S.: Potresti postarmi il codice che fa la stessa cosa di questo sopra, ma più semplificato? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Con quale codice hai risolto?
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quote:
Sarebbe ancora meglio però se invece di mettere un numero fisso di caratteri partissi dall'inizio della stringa, individuassi il terminatore e poi tornassi indietro, così l'algoritmo andrebbe bene per qualunque stringa. |
|
|
|
|
|
|
#6 | |
|
Junior Member
Iscritto dal: Mar 2014
Messaggi: 5
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
L'utilizzo di push e pop è un metodo di convenienza, naturalmente per stringhe lunghe è deleterio perché satura rapidamente lo stack, comunque prova a farlo funzionare anche in questo modo per esercizio.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Alcuni appunti...
- perchè usi più la memoria che i registri? - perchè un salto inutile (jmp controllo) quando ne potresti fare a meno? - nel tuo caso dovresti poter sostituire lea con OFFSET Questo è il tuo algoritmo arrivato a cont1 == inizio + 1: - stampi il secondo carattere - decrementi facendo diventare cont1 == inizio - salti a controllo e dato che sono uguali salti a fine Puoi sistemare il tuo codice modificando l'algoritmo come ad esempio: - cont1 == inizio + lunghezza stringa - decrementi cont1 - stampi il carattere - se cont1 è diverso da inizio ripeti il ciclo Una maniera abbastanza standard è: - crei un contatore con valore lunghezza stringa - 1 - accedi al carattere usando l'indirizzamento base + index (es: mov CX, [DX + DI]) -- probabilmente nel tuo caso anche questo funziona: mov CX, msg[DI] - decrementi il contatore - se il contatore è diverso da -1 ripeti il ciclo
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 Ultima modifica di nico159 : 05-03-2014 alle 18:43. |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 86
|
Questo è un programma che feci qualche tempo fa, utilizzando macro e interrupt di input e output.
Codice:
#make_com#
org 100h
lettura macro str
lea dx,leggere
mov ah,09h
int 21h
xor si,si
lea dx,stringa
mov ah,0Ah
int 21h
xor bx,bx
mov bl,str[1]
mov str[bx+2],'$'
endm
finale macro str_inv
lea dx,invertita
mov ah,09h
int 21h
lea dx,stringa_inversa
mov ah,09h
int 21h
endm
jmp start:
stringa db 9,?,9 dup(' ')
stringa_inversa 9,?,9 dup(' ')
leggere db "Inserisci la stringa (max 8 caratteri): $"
invertita db "La stringa invertita e': $"
start:
lettura stringa
mov stringa_inversa[bx+2],'$'
xor di,di
ciclo:
cmp stringa[si],'$'
je esci
inc si
jmp ciclo
esci:
sub si,1
mov di,2
ciclo2:
cmp stringa_inversa[di],'$'
je fine
mov cl,stringa[si]
mov stringa_inversa[di],cl
dec si
inc di
jmp ciclo2
fine:
finale stringa_invertita+2
ret
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:54.




















