Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [ASM] uscire al dos da un .exe

    premessa:
    sto facendo un compilatore
    che mi genera file .asm per NASM poi assemblati in .com siccome
    tale formato non puo' eccedere i 64k ho deciso di passare al .exe

    ho modificato il sorgente e sembra che tutti i programmi vadano
    finche non raggiungono l'int 21h per uscire al dos

    da notare che in .com non notavo questo errore..
    forse sbaglio la struttura del programma??

    per completezza vi dico che linko il file con microsoft
    link 5.5

    il sorgente del compilatore (in pascal ) si trova all' url

    SORGENTE

    inoltre ho un secondo problema:
    in assembly per gestire una stringa io posso fare
    codice:
    pippo db "w la gina$"
    se voglio posso modificarla carattere per carattere..

    ma se volessi completamente riassegnarla??
    esempio se volessi cambiarla in "ma anche la pina non si butta$"

    esiste un comando tipo UNDEF variabile??
    o REASSIGN variabile??

    altrimenti il mio compilatore dovrebbe cambiarla carattere per carattere...
    generando tonnellate di codice....



    HELP ME!
    P.s."mi serve per la tesina d'esame.."

  2. #2
    dimenticavo..
    ho provato anche ad usare TLINK
    (dopo che mi da' errore ho usato TLINK /3)
    e mi fa la stessa cosa..
    (Ma come fa' a trovarmi poi codice a 32 bit quando non lo uso non lo so...)

  3. #3
    forse il problema deriva dal codice generato?
    io metto lo stack in fondo al programma e riservo 64k
    per questo segmento..
    se metto lo stack in testa e' meglio??

  4. #4
    il primo problema l'ho risolto ovvero l' errore consisteva
    che a differenza di un file .com che ha un solo segmento
    un file .exe ha piu' segmenti;
    all'inizio di un .com ds punta gia' a data
    mentre in un exe non e' detto..
    infatti per far andare il codice basta aggiungere dopo al
    ..start:

    codice:
    mov ax,data
    mov ds,ax
    ora mi rimane il problema delle stringhe.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    166
    Ciao. Beh, il problema della stringhe credo di non averlo ben compreso: anzitutto una var in Assembly ha sempre una lunghezza definita.
    Se vuoi ingrandire una var (tipo da "pippo" a "megaschifezza"...) devi riservare spazio sufficiente....

    In secondo luogo: non esistono funzioni di rerassignamento nell'assembly.
    Forse il dos mette a disposizione roba simile (o Windows)....


    Ma credo di aver capito male la domanda.
    Cerca di farmi capire.
    Grazie.
    Ciao
    Ennio

  6. #6
    Originariamente inviato da Rebirth_85
    Ciao. Beh, il problema della stringhe credo di non averlo ben compreso: anzitutto una var in Assembly ha sempre una lunghezza definita.
    Se vuoi ingrandire una var (tipo da "pippo" a "megaschifezza"...) devi riservare spazio sufficiente....

    In secondo luogo: non esistono funzioni di rerassignamento nell'assembly.
    Forse il dos mette a disposizione roba simile (o Windows)....


    Ma credo di aver capito male la domanda.
    Cerca di farmi capire.
    Grazie.
    Ciao
    allora io mettiamo che voglio definire una stringa di 255 caratteri
    faccio
    codice:
    pippo times 255 db " "
    db "$"
    cosi ho descritto una stringa di 255 spazi.
    se ad un certo punto io volessi fare
    in pseudolinguaggio pippo="ciao"
    in assembly dovrei fare qualcosa del
    tipo
    codice:
    mov ax,pippo
    mov [ax],'c'
    inc ax
    mov [ax],'i'
    inc ax
    mov [ax],'a'
    inc ax
    mov [ax],'o'
    inc ax
    mov [ax],'$'
    volevo sapere se esiste un modo per non generare tutto quel codice ogni volta..
    cioe' una maniera piu' semplice..
    tipo NASM permette l'uso di label locali mettendo un . davanti allora
    si potrebbe fare
    .pippo db "ciao$"
    ed usare una stosb per riversare la stringa..
    pero' non so se in questa maniera funziona..

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    166
    beh, un metodo più pratico.... se crei una seconda var:
    var2 db "Ciao$"

    e la copi sulla prima...
    supponendo che la prima sia

    var1 db 512 dup (?)

    basta fare:

    mov di,offset var1
    mov si,offset var2
    Ciclo:
    mov al,[si]
    cmp al,"$"
    je End
    mov byte ptr [di],al --> byte ptr FORSe non è necessario
    inc si
    inc di
    jmp Ciclo

    End:
    ...


    Così stai prima.



    Ciclo:
    Ennio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.