News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

Help , i can't find error

Started by Mark Eisenberg, December 07, 2015, 10:58:24 AM

Previous topic - Next topic

Mark Eisenberg

hello , i creat this code for a home work , table of 20 COLUMN and look for the max


CDS SEGMENT PARA   STACK   'PILE'
DB 256 DUP (0)
CDS ENDS
LDS SEGMENT
;_____________________________________________________________________________________________________

TAB db         20 DUP(?) ; tableau de 20 elements
M1 db 'max de tab = $' ;message pour le max
M2 db 'remplire le vecteur :    $' ;message pour demander d'entre les valeurs
max dw ? ;variable pour garder le max dans
s dw ?
nbr db 10
i db 0
;_____________________________________________________________________________________________________
LDS ENDS
LPS SEGMENT
        PHRASE                   PROC                             FAR
ASSUME          CS :  LPS         ;  Affectation des
ASSUME          DS : LDS          ;   registres, obligatoires
ASSUME          SS : CDS          ;   dans un programme
mov AX , LDS         ;   on ne peut pas charger 
mov DS , AX            ;  un registre segment   

;____________________________________________________________________________________________________

lea dx,M2 ;pour affiche le message 'remplire le vecteur'
int 21h
mov ax,0 ;ax=0
lea di,TAB ;
mov di,0 ;di=0

;_____________________________________________________________________________________________________

FILL :
cmp di,20 ;di<38  38 de tableau principale                 
jg END_FILL ; fin de remplire
mov s,0 ;s=0
WHILE :
mov ah,1 ;lire un caractére
int 21h ;

cmp al,48 ;comparer 48<al<57
jl ELSE0 ;
cmp al,57 ;
jg ELSE0 ;

sub al,48 ;al=al-48
mov i,al    ;garder le numero dans i
mov ax,s    ;pour mult par 10
mul nbr ;al*nbr(10)
add ax,i ;l'instriction suivante :
mov s,ax  ; s=s*10+i
jmp WHILE
ElSE0:
mov ax,s ;ax=s : en cas nombre <48 --> ax=0 sinon ax= s (nombre)
mov TAB[di],ax ;TAB[i]=s
add di,2 ;di++
jmp FILL ;pour remplire la suivante case
;___________________________________________________________________________________________________
END_FILL:
mov ax,0 ;ax=0
lea di,TAB ;di=@TAB
mov di,ax ;di=ax
mov ax,TAB[di] ;ax=max
mov max,ax ;ax=TAB[di]
FILL1:
cmp di,38 ;di<10
jg SHOW
cmp TAB[di],ax ;TAB[di]>ax alors :
jl END_LP ;
mov ax,TAB[di] ;ax=TAB[di]
mov max,ax ;max=ax
END_LP :
add di,2 ;di=di+2
jmp FILL1
SHOW :
mov di,0 ;di=0
;___________________________________________________________________________________________________
FOR :
cmp al,0 ;cotion !=0
je END0 ;
mov ax,max ;ax=max
        mov ah,0 ;ah=0
div nbr ;ax/10
mov max,ax ;max=ax
mov TAB[di],ah ;TAB[di] = reste de div
inc di ;di++
jmp FOR ;
END0 :
lea dx,M1 ;pour affiche le message suivante :
mov ah,9 ;max de TAB =
int 21h
;____________________________________________________________________________________________________
LP : ;LOOP
cmp di,1 ;pour affiche le nombre max dans un petite tableau
jl  END1 ;jump to the END
dec di ;di--
mov dl,TAB[di] ;dl=TAB[di]
add dl,48 ;affiche(dl)
mov ah,2 ;dl=le nombre max
int 21h ;affiche le max
jmp LP
END1 :
MOV    AH,4CH        ;Retour au  DOS
        INT    21H

;_____________________________________________________________________________________________________
LPS     ENDS
        END


and the compiler tell me thaht there is 5 error



help ::!

dedndave

most of those are easy ones

if you define a byte, or an array of bytes
then try to load a word-sized register, the assembler barks
2 ways to overcome this
1) define the array as words
2) use a size override:
    mov     ax,word ptr TAB
    mov word ptr TAB+2,21


the last one is because PROC's are opened and closed
        PHRASE                   PROC                             FAR
ASSUME          CS :  LPS         ;  Affectation des
ASSUME          DS : LDS          ;   registres, obligatoires
ASSUME          SS : CDS          ;   dans un programme
mov AX , LDS         ;   on ne peut pas charger 
mov DS , AX            ;  un registre segment 


should look something like...
PHRASE PROC FAR

    ;some code

    ret    ;or, perhaps, terminate program

PHRASE ENDP


each PROC should have a matching ENDP

Mark Eisenberg

thank you , but i don't find where must i pute your code , can you give me the hole code ? plz

dedndave

well - that code wasn't intended to be specific
but, here is one example

    .data

M2 db 'remplire le vecteur :    $'


    .code

lea dx,M2 ;pour affiche le message 'remplire le vecteur'
int 21h


there are a couple things, here
1) INT 21h requires that a function number is in AH (i think you want AH = 9)
2) LEA is not required - use MOV with OFFSET
    mov     dx,offset M2


here's another

    .data

TAB db         20 DUP(?)


    .code

    mov TAB[di],ax ;TAB[i]=s


TAB is defined as BYTE type (db)
AX is a word-sized register

    mov word ptr TAB[di],ax  ;works because size override was used