|
|
|
![]() |
|
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 17: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: 00:41.