[assembly] il mio primo programmino

Stato
Discussione chiusa ad ulteriori risposte.

fojeaf

Utente Silver
3 Marzo 2008
235
8
0
95
salve, ho tentato ri realizzare il mio primo programmino in assembly.
Il programma in questione DOVREBBE prendere 2 input e farne la somma, visualizzando anche alcuni messaggi.
Il codice che ho scritto è il seguente:
Codice:
;Programma per addizioni by Malex
SEG_A		SEGMENT
			ASSUME CS:SEG_A, DS:SEG_A
			ORG 100h
Addizione		PROC	FAR
Inizio:		jmp		START
Message1	db	"Ti verranno richiesti gli addendi",13,10,'$'
Message2	db	"Primo Addendo ",13,10,'$'
Message3	db	"Secondo Addendo ",13,10,'$'
separ		db	"   ",13,10,'$'
num1	db	0
num2	db	0
sum		db	0
START:
	mov		bx,OFFSET Message1
	mov		ah,09h
	int		21h
	mov		bx,OFFSET Message2
	mov		bx,OFFSET separ
	mov		ah,09h
	int		21h
	mov		ah,09h
	int		21h
	mov		si,OFFSET num1
	mov		ah,01h
	int		21h
	cmp		al,0Dh
	je		SecondoAddendo
SecondoAddendo:
	cmp		al,03h ;questa riga serve a settare il Flag a 0 per il confronto successivo
	mov		num1[si],al
	mov 		di,si
	mov		bx,OFFSET separ
	mov		ah,09h
	int		21h
	mov		dx,OFFSET Message3
	mov		ah,09h
	int		21h
	mov		bx,OFFSET separ
	mov		ah,09h
	int		21h
	mov		si,OFFSET num2
	mov		ah,01h
	int		21h
	cmp		al,0Dh
	je		Somma
Somma:
	mov		num2[si],al
	add		si,di
	mov		bx,si
	mov		si,OFFSET sum
	add		si,bx
	mov		ah,09h
	int		21h
	
	Retn
Addizione endp
SEG_A	ENDS
		END		Inizio

sicuramente si può fare meglio di così ma per iniziare poteva andare bene. Il punto è che una volta compilato questo è il risultato:
Codice:
C:\Documents and Settings\Alex\Desktop\assembly programms>add.com
     ³ââ€Â￾ÂÂ￾ı*ïN
 ¾ñ© =║ı*â•ÂÂ￾!s7=♥ t♣=☻ u,Þ+ © =║ı*â•ÂÂ￾!s =♥ t♣=☻ u§¥║*ââ€Â￾ÂÂ￾ı*╣♫ ¾ñ© =║ı*â•ÂÂ￾!Ù☺¨ââ€Â￾œâ™ WVQââ€Â￾ÂÂ￾, Ä♣3÷
 ¾ñY^_ââ€Â￾Å“QRVWï▲z"ï▬£"ï♫Ãâ€â€￾"ââ€Â￾¤Bâ–‘ â•ÂÂ￾!s☻Ù;ï°╣= u§G♫ì6â•š*â•£
0☼☺     ë☺;♦K5      þ♀º    ¨Ó☺v☻Ù§ââ€Â￾¤?â•ÂÂ￾!s☻Ù

      ³ââ€Â￾ÂÂ￾ı*ïN
 ¾ñ© =║ı*â•ÂÂ￾!s7=♥ t♣=☻ u,Þ+ © =║ı*â•ÂÂ￾!s =♥ t♣=☻ u§¥║*ââ€Â￾ÂÂ￾ı*╣♫ ¾ñ© =║ı*â•ÂÂ￾!Ù☺¨ââ€Â￾œâ™ WVQââ€Â￾ÂÂ￾, Ä♣3÷
 ¾ñY^_ââ€Â￾Å“QRVWï▲z"ï▬£"ï♫Ãâ€â€￾"ââ€Â￾¤Bâ–‘ â•ÂÂ￾!s☻Ù;ï°╣= u§G♫ì6â•š*â•£
0☼☺     ë☺;♦K5      þ♀º    ¨Ó☺v☻Ù§ââ€Â￾¤?â•ÂÂ￾!s☻Ù

      ³ââ€Â￾ÂÂ￾ı*ïN
 ¾ñ© =║ı*â•ÂÂ￾!s7=♥ t♣=☻ u,Þ+ © =║ı*â•ÂÂ￾!s =♥ t♣=☻ u§¥║*ââ€Â￾ÂÂ￾ı*╣♫ ¾ñ© =║ı*â•ÂÂ￾!Ù☺¨ââ€Â￾œâ™ WVQââ€Â￾ÂÂ￾, Ä♣3÷
 ¾ñY^_ââ€Â￾Å“QRVWï▲z"ï▬£"ï♫Ãâ€â€￾"ââ€Â￾¤Bâ–‘ â•ÂÂ￾!s☻Ù;ï°╣= u§G♫ì6â•š*â•£
0☼☺     ë☺;♦K5      þ♀º    ¨Ó☺v☻Ù§ââ€Â￾¤?â•ÂÂ￾!s☻Ù

 4     ³ââ€Â￾ÂÂ￾ı*ïN
 ¾ñ© =║ı*â•ÂÂ￾!s7=♥ t♣=☻ u,Þ+ © =║ı*â•ÂÂ￾!s =♥ t♣=☻ u§¥║*ââ€Â￾ÂÂ￾ı*╣♫ ¾ñ© =║ı*â•ÂÂ￾!Ù☺¨ââ€Â￾œâ™ WVQââ€Â￾ÂÂ￾, Ä♣3÷
 ¾ñY^_ââ€Â￾Å“QRVWï▲z"ï▬£"ï♫Ãâ€â€￾"ââ€Â￾¤Bâ–‘ â•ÂÂ￾!s☻Ù;ï°╣= u§G♫ì6â•š*â•£
0☼☺     ë☺;♦K5      þ♀º    ¨Ó☺v☻Ù§ââ€Â￾¤?â•ÂÂ￾!s☻Ù

 Secondo Addendo
Secondo Addendo
5 Secondo Addendo

C:\DOCUME~1\Alex\Desktop\ASSEMB~1>
perché compaiono quei strani caratteri??? e perché alla fine visualizza di nuvo il messaggio secondo addendo?? (il 4 in mezzo ai caratteri strani è il primo input che gli ho dato...)
 
scusa la domanda ma è la sintassi tasm questa?
Veramente complementi sei veloce a capire le cose XD io c'ho messo qualche mese prima di non prendere paura davanti a un po' di assembly
 
grazie, alla fine basta capire il funzionamento dei registri.
Cmq è la sintassi usata da questa guida a partire dal secondo esempio e (su tasm) basta usare tlink.exe <nomefile> /t ...
ho trovato che compaiono strani cartteri e cuoricini quando alle stringhe non viene aggiunto il carattere '$' ma mi sembra di averlo messo su tutte...
 
infatti, visto che la guida usava tasm l'ho temporaneamente usato anch'io, visto che per ora mi interessa capire il funzionamento, poi mi convertirò a MASM o NASM...


ho modificato un po' il codice e ora è così:
Codice:
SEG_A		SEGMENT
			ASSUME CS:SEG_A, DS:SEG_A
			ORG 100h
Addizione		PROC	FAR
Inizio:		jmp		START
Message1	db	"Ti verranno richiesti gli addendi",13,10,'$'
Message2	db	"Primo Addendo ",13,10,'$'
Message3	db	"Secondo Addendo ",13,10,'$'
separ		db	"   ",13,10,'$'
num1	db	0
num2	db	0
sum		db	0
START:
	mov		dx,OFFSET Message1
	mov		ah,09h
	int		21h
	mov		dx,OFFSET Message2
	int		21h
	mov		dx,OFFSET separ
	int		21h
	mov		si,OFFSET num1
	mov		ah,01h
	int		21h
	cmp		al,0Dh
	je		SecondoAddendo
SecondoAddendo:
	cmp		al,03h ;questa riga serve a settare il Flag a 0 per il confronto successivo
	mov		num1[si],al
	mov 		di,si
	mov		bx,OFFSET separ
	mov		ah,09h
	int		21h
	mov		dx,OFFSET Message3
	int		21h
	mov		dx,OFFSET separ
	int		21h
	mov		si,OFFSET num2
	mov		ah,01h
	int		21h
	cmp		al,0Dh
	je		Somma
Somma:
	mov		num2[si],al
	add		si,di
	mov		bx,si
	mov		si,OFFSET sum
	add		si,bx
	mov		dx,si
	mov		ah,09h
	int		21h
	
	Retn
Addizione endp
SEG_A	ENDS
		END		Inizio
sono vicino a farlo funzionare perché ora l'output è:
Codice:
C:\Documents and Settings\Alex\Desktop\assembly programms>add.com
Ti verranno richiesti gli addendi
Primo Addendo

3
Secondo Addendo

Ò∟ì>´∟ë3â•â€Â￾¼
ââ€Â￾â€Â￾t♣¬¼AÙ¸ëN
Y_^â–¼ââ€Â￾Å“

C:\DOCUME~1\Alex\Desktop\ASSEMB~1>
questa volta i caratteri strani compaiono appena do il secondo input....
 
sinceramente sarebbe una buona idea separare i segmenti con le variabili (e costanti) da quello del codice.

mettere le variabili in mezzo al codice è utile per ridurre la dimensione, ma è rischioso e difficile da interpretare.


cmq io sapevo che l'int 21h usava ax (ah e al) e dx (dh e dl) e non bx....


EDIT
cmp al,03h ;questa riga serve a settare il Flag a 0 per il confronto successivo
questa riga non serve a niente,visto che c'è un cmp successivo che lo reimposta indipendentemente dal valore assunto prima.

Codice:
je        SecondoAddendo
SecondoAddendo:
Codice:
je        Somma
Somma:
che senso hanno?
sono salti nulli


guarda, ci sono proprio errori logici nei cicli (nell'imput dei numeri), devi fare molte modifiche.
oggi non ho tempo,se vuoi te lo correggo fra qualche giorno
 
in effetti è la prima modifica che ho fatto, se leggi il mex sopra il tuo, che è stato modificato col nuovo codice... infatti sbagliavo ad usare bx invece di dx, nonostante ciò ha ancora qualche problema (riguardo alla sintassi: per ora sto seguendo quella usata dalla guida, successivamente scriverò il codice in maniera + chaira)

EDIT: visto che ho appena cominciato non sapevo che il flag veniva impostato indipendentemente dal valore precedente. Riguardo ai salti in effetti ora mi sto chiedendo anch'io il perché li ho messi.....

Potresti spiegarmi quali sarebbero gli errori nell'input?
 
credevo che volessi prendere numeri di più cifre (ciò avrebbe spiegato quei salti, anche se usati male e con altri errori. senza contare l'uso di [SI] come se ci fossero degli array).....
visto che è una cifra sola, allora non c'è quell'errore (ma quello di [si] inutile si ^^)....
comunque ti ripeto, ti conviene cancellare tutto e rifarlo da capo pensando a cosa fare....
non prenderla male, ma oltre ad essere difficile da comprendere per chi legge, che è il minore dei mali, secondo me non funziona (almeno non l'eseguibile) e comunque se funziona ha una logica troppo contorta...
il programma è molto più semplice di così
 
ok ci proverò
per quanto riguarda il [si], se facevo un mov x,num1 (x è un qualsiasi registro)
senza il [si] mi dava errore...
 
quello te lo dava perchè sono di dimensioni diverse.... prova MOVZX (altrmenti devi uare al, ah, ecc)
 
ok, lo scritto diversmante, credevo fosse giusto ma: nn mi fa niente, neanche il primo mess :tunz: :tunz: :tunz:
Codice:
Programma per addizioni by Malex
.MODEL small

.STACK  200h

.DATA
mess1   db  "Inserisci il primo addendo ",13,10,'$'
mess2   db  "Inserisci il secondo addendo ",13,10,'$'
num1    dd  0
num2    dd  0
sum     dd  0
max_len		EQU		1000
sorgente		db		max_len dup(?)

.CODE

mex1:
    mov ax,SEG mess1
    mov ds,ax
    mov dx,OFFSET mess1
    mov ah,09h
    int 21h
END mex1
get1:
    mov ax,SEG sorgente
    mov ds,ax
    mov si,OFFSET sorgente
    mov ah,01h
    int 21h
    cmp al,0Dh
    je  next
    mov sorgente[si],al
    inc si
    jmp get1
END get1
next:
    mov ax,SEG num1
    mov ds,ax
    mov bx,sorgente
    mov num1,bx
    mov ax,SEG mess2
    mov ds,ax
    mov dx,OFFSET mess2
    mov ah,09h
    int 21h
END next
get2:
    mov ax,SEG sorgente
    mov ds,ax
    mov su,OFFSET sorgente
    mov ah,01h
    int 21h
    cmp al,ODh
    je sam
    mov sorgente[si],al
    inc si
    jmp get2
END get2
sam:
    mov ax,SEG num2
    mov ds,ax
    mov bx,sorgente
    mov num2,bx
    mov cx,num2
    mov bx,num1
    add cx,bx
    mov ax,SEG sum
    mov ds,ax
    mov si,OFFSET sum
    mov bx,sum
    add bx,cx
    mov sum[bx+1],'$'
    mov dx,sum
    mov ah,09h
    int 21h
    mov ah,4Ch
    int 21h
END sam
 
Stato
Discussione chiusa ad ulteriori risposte.