in
La comunitĂ  italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

problemi con l'asm...help me!

Ultimo messaggio ricevuto il 04-04-2004 13.36 da gianpixel. 5 risposta(e).
Pagina 1 di 1 (7 elemento/i)
Ordina messaggi: Precedente Successivo
  • 04-04-2004 13.36

    problemi con l'asm...help me!

    hola!sono un nuovo utente,ho urgente bisogno di aiuto su un programma assembler,magari x voi è una caxxata quello che sto x kiedervi,ma...ecco...domani ho l'esame e sto un po' infognato.dunque vi posto il listato e se potreste darmi una mano a capire xke' nn gira...ve ne sarei grato:)

    .model small
    .stack
    .data

    max_len equ 5
    msg1 db 10,13,"Inserisci un numero",10,13,'$'
    msg2 db 10,13,"I numeri pari sono",10,13,'$'
    msg3 db 10,13,"I numeri dispari sono",10,13,'$'
    msg4 db 10,13,"Errore,inserisci un numero",10,13,'$'
    pari db max_len dup(?)
    dispari db max_len dup(?)

    .code

    start:
    mov cx,max_len
    leggi:
    xor bx,bx
    xor dx,dx ;azzero dx e visualizzo il primo msg
    mov ax,seg msg1
    mov ds,ax
    mov dx,offset msg1

    xor ax,ax
    mov ah,09h
    int 21h

    mov ah,01h ;leggo i caratteri da tastiera
    int 21h

    xor si,si
    sub al,30h

    mov dl,al
    mov dh,0
    push dx

    loop leggi

    call paridispari
    add sp,10
    jmp fine

    paridispari proc near

    push bp ;zavorra!
    mov bp,sp

    xor cx,cx
    push cx
    mov cx,[BP+4] ;inizializzo il contatore a 5

    xor si,si
    push si

    altro_elem:
    xor ax,ax
    xor bx,bx

    mov al,[BP+10] ;metto il primo valore salvato in al
    add si,2 ;incremento si
    mov bl,2
    div bl

    dec cx

    cmp ah,0
    jz vispari
    jnz visdispari

    visdispari:
    mov dispari[di],al ;metto il valore nel vettore pari e incremento l'indice
    inc di

    cmp cx,0 ;controllo se ho letto 5 caratteri
    je dollaro2
    jne altro_elem

    vispari:
    mov pari[si],al ;metto il valore nel vettore pari e incremento l'indice
    inc si

    cmp cx,0 ;controllo se ho letto 5 caratteri
    je dollaro1
    jne altro_elem


    dollaro1:
    xor dx,dx
    mov al,'$'
    mov pari[si],al ;nell'ultima postazione metto il carattere $

    mov dx,offset msg2 ;stampa la stringa msg2
    mov ah,09h
    int 21h

    xor dx,dx

    mov ah,09h
    lea dx,pari ;stampa il vett pari come stringa
    int 21h

    dollaro2:
    xor dx,dx
    mov al,'$'
    mov dispari[di],al

    mov dx,offset msg3
    mov ah,09h
    int 21h

    xor dx,dx

    mov ah,09h
    lea dx,dispari
    int 21h

    fineproc: pop bp
    ret
    paridispari endp

    fine:
    mov ah,4ch
    int 21h

    end start
    • No log
  • 04-04-2004 17.08 In risposta a

    • Deep_Core
    • Utente Top 10
    • Registrato il 05-01-2004
    • Italy - Trieste
    • Messaggi 319

    Re: problemi con l'asm...help me!


    Ciao, gianpixel!

    Dalle informazioni assolutamente inadeguate che tu fornisci (in pratica, dall'esame del puro codice: non hai detto neanche quale assembler usi! :-$ ) mi sembra che i tuoi problemi risiedano nella procedura <b>paridispari</b>, nella fattispecie nei blocchi di codice relativi alle <i>labels</i>:

    1. <b>visdispari</b>
    all'istruzione:<code>mov <b>dispari[di]</b>,al ;metto il valore nel vettore pari e incremento l'indice</code>2. <b>vispari</b>
    all'istruzione:<code>mov <b>pari[si]</b>,al ;metto il valore nel vettore pari e incremento l'indice</code>3. <b>dollaro1</b>
    all'istruzione:<code>mov <b>pari[si]</b>,al ;nell'ultima postazione metto il carattere $</code>4. <b>dollaro2</b>
    all'istruzione:<code>mov <b>dispari[di]</b>,al</code>L'errore sta nel fatto che il <i>destination operand</i> delle istruzioni riportate (evidenziato in <b>grassetto</b>) <b>non specifica il segmento al quale la label da te indirizzata si riferisce</b> (è obbligatorio, con il <i>memory model</i> small, nel quale i segmenti <i>DATA</i> e <i>CODE</i> non sono combinati!).

    Il codice corretto dovrebbe essere il seguente:<code> ...
    ...
    visdispari:
    mov <b>ds:</b>dispari[di],al ;metto il valore nel vettore pari e incremento l'indice
    ...
    ...
    vispari:
    mov <b>ds:</b>pari[si],al ;metto il valore nel vettore pari e incremento l'indice
    ...
    ...
    dollaro1:
    ...
    ...
    mov <b>ds:</b>pari[si],al ;nell'ultima postazione metto il carattere $
    ...
    ...
    dollaro2:
    ...
    ...
    mov <b>ds:</b>dispari[di],al
    ...
    ...</code>Comunque, per la prossima volta (oltre ad essere un po' più largo di manica con i dettagli sul problema per cui chiedi aiuto), se puoi, evita di postare richieste urgenti di Domenica =:O : rischi di non ricevere alcuna risposta (specialmente se il tempo è bello! 8-) ).

    Ciao e... <i>see you next!</i> ;-)

    • No log
  • 04-04-2004 17.56 In risposta a

    Re: problemi con l'asm...help me!

    he he...hai ragione...ma i miei prof sn stati un po str...e la l'assembler hanno pensato bene di insegnarcelo in 2 lezioni...cm faccio a capire che assembler uso?ho provato come dici tu ma...niente,mi visualizza lo stesso dei simboli strani dopo le stringhe finali,come mai?cmq grazie x aver risposto(anche di domenica) :)
    • No log
  • 04-04-2004 19.43 In risposta a

    • Deep_Core
    • Utente Top 10
    • Registrato il 05-01-2004
    • Italy - Trieste
    • Messaggi 319

    Re: problemi con l'asm...help me!


    Allora...

    Credo che, con il mio suggerimento, un piccolo passo avanti tu l'abbia fatto, mi pare: prima, per quanto mi risulta, il tuo sorgente non veniva neanche assemblato, mentre ora riesci "addirittura" ad eseguire il programma... Definire questo un "niente", come dici tu, mi sembra riduttivo... Mi confermi quanto ho appena detto?
    Perchè, per il momento, io me lo posso solo immaginare...

    Comunque, poichè, <b>in via generale</b>, le mie risposte alle vostre domande, qui nel forum, non le do' basandomi sull'interpretazione dei fondi del caffè che mi bevo la mattina, ma su conoscenze e dati ottenuti in maniera un po più scientifica, ti prego di rispondere, cortesemente, alle seguenti domande:

    a) <b>che assembler usi?</b>

    Credo che i tuoi insegnanti, ad un certo momento, te l'avranno probabilmente detto, sennò come facevi ad installartelo sulla tua macchina?
    Prova a dare un'occhiata alle prime righe che compaiono a console quando lanci il processo di assembly: dovrebbero (ma non sempre, è un tentativo!) contenere le informazioni di copyright (il nome, il numero di versione, il produttore e l'anno di riferimento) dell'assembler che stai usando.
    Niente da fare? Bene, dimmi almeno il nome dell'eseguibile ([NOMEASSEMBLER].EXE) che lanci per assemblare il sorgente: quello lo saprai [trovare], no?

    b) <b>qual'è l'output completo dell'esecuzione del tuo programma?</b>

    Cioè: cosa intendi con "... simboli strani dopo le stringhe finali..."?

    Non ti ho chiesto troppo, vero?

    • No log
  • 04-04-2004 20.42 In risposta a

    Re: problemi con l'asm...help me!

    il programma lo lanciava anche prima,il problema è che escono sti simboli.

    allora dunque,l'eseguibile è il tasm (della borland)

    i simboli strani sarebbero delle facce,o simboli tipo cuori,quadri,tipo quelli dei semi delle carte da poker....
    • No log
  • 04-04-2004 20.45 In risposta a

    Re: problemi con l'asm...help me!

    il programma visualizza

    "inserisci un numero" per 5 volte
    poi le due stringhe
    "i numeri pari sono" e "i numeri dispari sono" seguite(in teoria) dai numeri pari e dispari che ho inserito da console,ma al posto di questi escono simboli(nn ne sono sicuro,ma credo probabilmente la codifica ascii dei numeri)
    • No log
  • 05-04-2004 16.26 In risposta a

    • Deep_Core
    • Utente Top 10
    • Registrato il 05-01-2004
    • Italy - Trieste
    • Messaggi 319

    Re: problemi con l'asm...help me!


    Ciao, gianpixel.

    Scusa il ritardo, ma appena adesso ho avuto un po'di tempo da dedicare ad un'analisi del tuo codice nel dettaglio, poiché ieri sono uscito a cena. Magari a te non serve più, ciononostante posto comunque la risposta in quanto potrebbe essere interessante anche per altri utenti del Forum.

    Ecco i risultati (le istruzioni <b>inutili</b> sono contrassegnate con il simbolo <b>(?)</b>, le mie osservazioni sono riportate in <b>grassetto</b>):<code>.model small

    .stack

    .data
    max_len equ 5
    msg1 db 10,13,"Inserisci un numero",10,13,'$'
    msg2 db 10,13,"I numeri pari sono",10,13,'$'
    msg3 db 10,13,"I numeri dispari sono",10,13,'$'
    msg4 db 10,13,"Errore,inserisci un numero",10,13,'$'
    pari db max_len dup(?)
    dispari db max_len dup(?)

    .code
    start:
    mov cx,max_len

    leggi:
    xor bx,bx
    xor dx,dx ; azzero dx e visualizzo il primo msg
    mov ax,seg msg1
    mov ds,ax
    mov dx,offset msg1

    xor ax,ax
    mov ah,09h
    int 21h

    mov ah,01h ; leggo i caratteri da tastiera
    int 21h

    xor si,si ; <b>(?)</b>
    sub al,30h

    mov dl,al
    mov dh,0
    push dx

    loop leggi

    call paridispari

    add sp,10
    jmp fine

    paridispari proc near

    push bp ; zavorra! <b>(perchè "zavorra"? questa è la</b>
    mov bp,sp ; <b><i>standard entry sequence</i> della procedura!)</b>

    xor cx,cx ; <b>(?) queste due istruzioni acquistano un senso solo</b>
    push cx ; <b>(?) se le scambi di posizione!</b>
    mov cx,[bp+4] ; inizializzo il contatore a 5 <b>(ERRORE: qui tu</b>
    ; <b>inizializzi cx con il valore dell'ultimo numero</b>
    ; <b>accettato in input dal programma chiamante!)</b>

    xor si,si ; <b>(?) queste due istruzioni acquistano un senso solo</b>
    push si ; <b>(?) se le scambi di posizione!</b>

    altro_elem:
    xor ax,ax
    xor bx,bx

    mov al,[bp+10] ; metto il primo valore salvato in al <b>(qui il valore</b>
    ; <b>di scostamento dovrebbe essere 12; inoltre, per</b>
    ; <b>recuperare il valore corretto dallo stack dovresti</b>
    ; <b>usare ax al posto di al, in quanto lo stack procede</b>
    ; <b>di 16 in 16 bits!)</b>
    add si,2 ; incremento si
    mov bl,2
    div bl

    dec cx ; <b>in conseguenza del valore assegnato precedentemente</b>
    ; <b>a cx, quest'istruzione non sortisce l'effetto voluto!</b>

    cmp ah,0
    jz vispari
    jnz visdispari ; <b>(?)</b>

    visdispari: ; <b>(?)</b>
    mov dispari[di],al ; metto il valore nel vettore pari e incremento l'indice
    inc di ; <b>(ERRORE: di non è mai stato appropriatamente inizializzato!)</b>

    cmp cx,0 ; <b>in conseguenza del valore assegnato precedentemente</b>
    ; <b>a cx, quest'istruzione non sortisce l'effetto voluto!</b>
    je dollaro2
    jne altro_elem ; <b>qui è sufficiente un semplice jmp</b>

    vispari:
    mov pari[si],al ; metto il valore nel vettore pari e incremento l'indice
    inc si

    cmp cx,0 ; <b>in conseguenza del valore assegnato precedentemente</b>
    ; <b>a cx, quest'istruzione non sortisce l'effetto voluto!</b>
    je dollaro1
    jne altro_elem ; <b>qui è sufficiente un semplice jmp</b>


    dollaro1:
    xor dx,dx
    mov al,'$'
    mov pari[si],al ; nell'ultima postazione metto il carattere $

    mov dx,offset msg2 ; stampa la stringa msg2
    mov ah,09h
    int 21h

    xor dx,dx

    mov ah,09h
    lea dx,pari ; stampa il vett pari come stringa
    int 21h

    dollaro2:
    xor dx,dx
    mov al,'$'
    mov dispari[di],al

    mov dx,offset msg3
    mov ah,09h
    int 21h

    xor dx,dx

    mov ah,09h
    lea dx,dispari
    int 21h

    fineproc:
    <b>pop si</b> ; <b>quest'istruzione è necessaria per riequilibrare lo stack</b>
    ; <b>ma nel tuo codice manca!</b>
    <b>pop cx</b> ; <b>quest'istruzione è necessaria per riequilibrare lo stack</b>
    ; <b>ma nel tuo codice manca!</b>
    pop bp

    ret

    paridispari endp

    fine:
    mov ah,4ch
    int 21h

    end start</code>Gli errori logici in cui sei incorso dovrebbero esserti, ora, piuttosto chiari.
    Inoltre, poiché usi TASM come assembler, quanto ti ho detto ieri sulle aggiunte (<b>ds:</b>) da fare ai <i>memory operands</i> che ti ho indicato non è più vincolante.

    Ciao e buono studio!

    • No log
Pagina 1 di 1 (7 elemento/i)
Prelevato da http://www.devspy.com/forums/p/897/900.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"