Πρόβλημα στην εμφάνιση αποτελέσματος πολλαπλασιασμού.

συζητήσεις για assembly

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
xdanaskos
Δημοσιεύσεις: 4
Εγγραφή: 13 Δεκ 2011 16:30

Πρόβλημα στην εμφάνιση αποτελέσματος πολλαπλασιασμού.

Δημοσίευση από xdanaskos » 13 Δεκ 2011 16:44

Παιδιά καλησπέρα. Έχω ένα πρόβλημα με την assembly σε intel.
Το πρόγραμμα θέλει να διαβάζει έναν πίνακα 10 θέσεων και μετά να πολλαπλασιάζει κάθε νούμερο με έναν σταθερό αριθμό. Τέλος θέλει να εκτυπώνει το νούμερο που προκύπτει. Το πρόβλημα είναι ότι αν εγώ σαν σταθερό νούμερο βάλω το 4 και στις θέσεις του πίνακα βάλω για παράδειγμα τα νούμερα 2,9,0,4,2,6,0,3,1,8 αντίστοιχα τότε θα μου βγάλει αποτελέσματα 008,036,030,016,008,024,020,012,004,032. Όπως βλέπετε όταν εγώ βάλω το μηδέν τότε αντί να μου βγάλει 000 κρατάει το δεύτερο ψηφίο και μου βγάζει για παράδειγμα 030. Ευχαριστώ για τις απαντήσεις ο κώδικας είναι ο εξής:

Κώδικας: Επιλογή όλων

format MZ 
push cs 
pop ds 

mov SI, pinakasC 

 
mov cx,10 ; einai to loop gia 10 fores
mov bp,1 ;Xrisimopoiw ton bp gia na dwsw tin thesi tou pinaka stin ektipwsi pou zitaei to stixio tou pinaka(dwse to 001 stixeio tou pinaka)


diavasea:
mov dx,bp ;vazw ston dx to perexomeno tou bp gia na to kanw ascii kai xekinaw tin metatropi tou arithmou se ascii
mov DI,x
add DI,2


l1:
mov ax,dx
mov dx,0
mov BX,10
div BX
xchg AX,dX
add AL,30H
mov [DI],AL
dec DI
cmp dX,0
jnz l1

;ektipwnw to prwto kommati tou minimatos

mov ah, 09
mov dx, dwsea1
int 21h

;ekipwnw tin thesi tou pinaka (bp)

mov ah,09
mov dx,x
int 21h

;ektipwnw to deutero kommati tou minimatos

mov ah,09
mov dx, dwsea2
int 21h

;diavazw to stixeio tou pinaka ws ascii

mov ah,1
int 21h



;metatrepw ton ascii se arithmo

mov dx,0
mov dl,al
sub dl,30h


;ton pernaw ston pinaka

mov [SI], dl

;afinw keni grammi
mov ah,09
mov dx,keno
int 21h


;auxanw to si kai to bp kai paw pisw sto diavasea gia na diavasw to epomeno stixeio tou pinaka
inc SI
inc bp
loop diavasea

mov SI,pinakasC


mov cx,10

again:
mov al,[SI]

mov dl,4 ; to noumeo N
mul dl     ;aotelesma n*A[i]
push ax

mov ah,09
mov dx,na
int 21h

pop ax

mov DX,AX 
mov DI,X 
add DI,2

L2: 

mov AX,DX 
mov DX,0 
mov BX,10 
div BX 

xchg AX,DX 
add AL,30H 
mov [DI],AL 
dec DI
cmp DX,0 
jnz L2 

mov ah,09
mov dx,X
int 21h

mov ah,09
mov dx,keno
int 21h
inc SI
mov DI,0
mov dx,0

loop again

;---------------- mexri edw ektipwsame to N*a[i]------------------------------------




exit:	
mov AX,4C00h 
int 21h 

pinakasC db ?, ?, ?, ? ,?, ?, ?, ? ,?,?
keno db 0Ah, '$'
X db 30h,30h,30h,'$'
dwsea1 db 'Dwse to ','$'
dwsea2 db ' stixeio tou A: ','$'
x db 30h,30h,30h,'$'
na db 'To apotelesma tis praxis N*a[i] einai: ','$'

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

Πρόβλημα στην εμφάνιση αποτελέσματος πολλαπλασιασμού.

Δημοσίευση από LightForce » 14 Δεκ 2011 13:11

Γεια χαρά,

Πρέπει να κάνεις 'reset' τα τρία byte του X πριν από κάθε loop του L2.
Σε περιπτώσεις που το loop στον L2 εκτελείται μόνο μία φορά μέσα στην again, μένουν οι προηγούμενες τιμές στα byte της Χ.
Είμαι στην εργασία μου, ένα γρήγορο hack, βάλε κάτω από την label L2:

Κώδικας: Επιλογή όλων

L2:
mov byte [X], 30h
mov byte [X+1], 30h
mov byte [X+2], 30h
;...
;...
Kάτι καλύτερο το βραδάκι.

xdanaskos
Δημοσιεύσεις: 4
Εγγραφή: 13 Δεκ 2011 16:30

Πρόβλημα στην εμφάνιση αποτελέσματος πολλαπλασιασμού.

Δημοσίευση από xdanaskos » 14 Δεκ 2011 14:47

Σε λατρεύω...... Θα το δοκιμάσω στο σπιτι και θα σου απαντήσω....... :D

Απάντηση

Επιστροφή στο “Assembly”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες