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

    [Assembly] Possibile bug di MASM

    Nel programma seguente, quando assemblo con MASM esce la scritta > Executing: C:\Arch-Lab\_Editor\ConTEXT\ConExec.exe "C:\Arch-Lab\Bin\Sys\AsmConText.bat" xxxx

    Assembling: xxxx.asm

    xxxx.asm(41) : error A2005: symbol redefinition : post_intro

    pr_str(5): Macro Called From
    xxxx.asm(41): Main Line Code

    xxxx.asm(41) : error A2005: symbol redefinition : print

    pr_str(9): Macro Called From
    xxxx.asm(41): Main Line Code

    xxxx.asm(41) : error A2005: symbol redefinition : continua

    pr_str(13): Macro Called From
    xxxx.asm(41): Main Line Code

    Rilevati ERRORI di Compilazione: Correggi e riprova con F9 > Execution finished. Ho visto che su alcune versioni di Masm è presente questo bug http://support.microsoft.com/kb/120064/it: è questa la causa dell'errore o ho sbagliato qualcosa io? In ogni caso, come posso aggirarlo?
    codice:
    ;INTESTAZIONE
    PAGE 66,132
    ;MACRO UTILIZZATE DAL PROGRAMMA
              include  libreria.mac
    ;DEFINIZIONE DEL SEGMENTO DEL CODICE
    _prog     SEGMENT ;BYTE PUBLIC 'CODE'
              ASSUME CS:_prog, DS:_prog
              ORG    100H
    ;AREA DESTINATA AI DATI DEL PROGRAMMA
              testo    db   'Scrivi due numeri (separati da "INVIO")','$'
              Nan      db   'Ho detto di scrivere un numero!','$'
              num1     db   0,'$'
    ;----------------------------------------------------------------------------
    Main:
              pr_str   num1
    intro:
              mov      ah,00H         ;chiede con funzioni BIOS un carattere
              int      16H
              cmp      al,27        ;se il tasto non è ESC...
              je       Fine           ;...passa alla fase di controllo
     
    Control:
     
              sub      al,30h         ;sottraendo 30h(=48) al codice ASCII di un numero si ottiene il numero stesso
              cmp      al,9           ;se il risultato dellla sottrazione è maggiore di 9 significa che il codice ASCII del tasto era maggiore di 39h o anche minore di 30h, dato che 'ja' si usa per gli unsigned
              ja       isNaN          ;e considera come positivi i numeri negativi, per cui un numero come FFFF FFFF FFFF FFFF, che se considerato negativo sarebbe =-1, risulta comunque maggiore di 9.
              add      al,30h         ;riporta AL al valore originario
              mov      ah,0EH         ;stampa il carattere (solo se è un numero)
              int      10H
              mov      bx,seg num1
              mov      es,bx
              mov      di,offset num1
              mov      es:[di],al
              inc      di
              pr_str num1
              jmp      intro
    Fine:
              mov ah,4ch
              int 16h
     
    isNaN:
              jmp main
     
    _prog     ENDS
              END   Main
    Libreria.mac:
    codice:
    ;                           pr_char
    ;STAMPA UN CARATTERE POSTO IN AL
    pr_char  MACRO
             mov    ah,0EH                ;si limita ad eseguire l'interrupt 0EH di 21H
             int    10H
             ENDM   pr_char
    ;----------------------------------------------------------------------------------
    ;                           pr_str
    ;STAMPA UNA STRINGA TERMINANTE CON ",0"
    pr_str   MACRO  string
             pushad
             mov    ax,seg string
             mov    es,ax
             mov    di, offset string
    post_intro:
             mov    al,es:[di]           ;se si esegue l'istruzione "cmp es:[di],0"
             cmp    al,0                 ;il computer cerca di stampare tutto es (?)
             je     continua             ;while al!=0 ripete il ciclo
    print:
             pr_char
             inc    di
             jmp    post_intro
    continua:
             popad
             ENDM   pr_str
    P.S.: la cosa più strana (almeno credo...) è che se a pr_str sostituisco il codice seguente non mi dà nessun messaggio di errore.
    codice:
    ;                           pr_str_dos
    ;STAMPA UNA STRINGA PASSATA COME PARAMETRO USANDO FUNZIONI DOS
    ;N.B.: LA STRINGA DA STAMPARE DEVE TERMINARE CON IL CARATTERE '$' (Da aggiustare)
    pr_str_dos MACRO  testo
              mov   ax, SEG testo         ;sposta in ax l'indirizzo del segmento dati...
              mov   ds, ax                ;...per poi spostarlo in ds
              lea   dx, testo             ;sposta in dx l'offset di 'testo'
              mov   ah,09H                ;chiama la funzione 09H
              int   21H                   ;di 21H
              ENDM pr_str_dos

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Sn le labels della macro che vengono aggiunte + volte.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non è un bug, ma un cattivo uso delle macro.

    Nelle macro devi usare delle label di tipo local.

    Leggi questo

    http://webster.cs.ucr.edu/Page_TechD...de/Chap_09.htm
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Grazie, me lo sto studiando; non ho capito però con esattezza l'utilizzo di "textequ".

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.