PDA

Visualizza la versione completa : [ASM] Assembler e utilizzo registri a 32 bit


faster589
26-06-2007, 17:34
Salve a tutti...vi posto il mio problema con la speranza che qualcuno di voi sappia aiutarmi. Stò realizzando un programma assembler con un architettura 8086. Mi sovviene all'improvviso la necessità di dover utilizzare dei registri a 32 bit e quindi i registri eax edx... per fare ciò pongo all'inizio del codice l'estensione .386 vado poi acompilare l'operazione di tasm va bene ma qnd vado a linkare mi dà qst errore: Fatal:32 bit record encountered in module nome_file.asm...qualcuno saprebbe aiutarmi?!premetto ke sn nuovo del linguaggio...grazie 1000 in anticipo

oregon
26-06-2007, 17:48
EDIT: hai provato con la direttiva

.486

?

P.S. Attenzione al titolo e al regolamento ...

faster589
26-06-2007, 17:52
uso il tasm...
P.S
vado a dare un okkiata al regolamento...

oregon
26-06-2007, 17:56
Originariamente inviato da faster589
uso il tasm...

Tasm 5.0 ?

Hai provato con la direttiva

.486

?

faster589
26-06-2007, 18:00
si è loa versione 5.0...ho provato ad inserire .486 ma il risultato non cambia...

faster589
26-06-2007, 20:58
:dhò: ragazzi datemi una mano stò impazzendo... :confused: :confused:

oregon
26-06-2007, 21:41
Puoi mostrare il codice?

faster589
26-06-2007, 21:53
In realtà nn posso altrimenti sfato tutto quello fatto sino ad ora...se puoi connetterti a mirc oppure su msn così te lo passo e ci dai un occhiata...sei poi proprio devo lo posto...

oregon
26-06-2007, 21:58
Posta soltanto la parte iniziale e quella che ti da' l'errore ... non postarlo tutto ...

E dimmi anche come compili (la linea di comando con i parametri che usi ... e poi stai usando Tasm.exe o Tasm32.exe ?)

faster589
26-06-2007, 22:04
.386
;Definizione costanti

PAGINA EQU 00h
HT EQU 09h
LF EQU 0Ah
CR EQU 0Dh

BIOS_VIDEO EQU 10H
SET_VIDEO_MODE EQU 00h;in AH
MODE_TESTO EQU 03H;in AL

SET_CURSOR EQU 02h;in AH
W_CHR_TTY EQU 0Eh;in AH
DOS EQU 21H
R_KEY_CHR EQU 01H
PRINT_STRING EQU 09H
R_KEY_CHR_NE EQU 07h
PRE_LEN EQU 10

DSEG SEGMENT PARA PUBLIC 'DATA'

SEGNO DB ?
NUM DW 0
NUM_A2 DW 0
NUM_QUADR1 DW 0
NUM_QUADR2 DW 0
DIVD DW ?
ERR_MESS DB CR,LF,LF,CR,'Valore non ammesso.Inserire un nuovo numero compreso tra -999 e 999:',0DH,0AH,'$'

TITOLO DB 'CORSO di CALCOLATORI ELETTRONICI$'
ISTRUZIONI DB CR,LF,LF,CR,'Inserire un numero compreso tra -999 e 999:$'
BIN_MESS DB CR,LF,HT,HT,'Rappresentazione Binaria:$'
A2_MESS DB CR,LF,HT,HT,'Rappresentazione Binaria in complemento A2:$'

DEC_MESS DB CR,LF,HT,HT,'Rappresentazione Decimale del quadrato del numero:$'
TERMINE DB CR,LF,LF,HT,'Un altra iterazione? [S/N]$'
CODICE_TASTO DB ?
DSEG ENDS



STACKM SEGMENT PARA STACK 'STACK' ; Viene allocata una zona di
DB 64 DUP('12345678') ; memoria per lo stack: in
STACKM ENDS ; tutto 64*8 bytes.


ASSUME CS:CSEG,DS:DSEG,SS:STACKM
CSEG SEGMENT PARA PUBLIC 'CODE'


;----------------------------------------------------------------------------------;
; Corpo principale del programma ;
;----------------------------------------------------------------------------------;

MAIN PROC FAR
PUSH DS ;Istruzioni da lasciare sempre
MOV AX,00h ; al principio dei programmi!
PUSH AX ;
CALL INIZIALIZZAZIONE
CICLO_PRINCIPALE: CALL PROMPT
CALL LETTURA_DATI


CALL STAMPA_BIN
CALL COMP_A2
CALL STAMPA_A2
CALL QUADR
CALL STAMPA_DEC
CALL TEST_FINALE
JNZ CICLO_PRINCIPALE
RET ;Ritorno al Sistema Operativo
MAIN ENDP


;----------------------------------------------------------------------------------;
; Procedura di inizializzazione ;
; ;
; REGISTRI UTILIZZATI: AX,DX,SX ;
;----------------------------------------------------------------------------------;

INIZIALIZZAZIONE PROC NEAR
MOV AX,DSEG ;Inizializzazione segmento dati
MOV DS,AX ; tramite il registro AX.

MOV AH,SET_VIDEO_MODE ;Servizio BIOS 'Set Video Mode':
MOV AL,MODE_TESTO ;modo testo 80 x 25,colori
INT BIOS_VIDEO ;

MOV DX,0315h ;Imposta riga (DH) e colonna (DL)
CALL SPOSTA_CURSORE ;Muove il cursore nel pos scelta

MOV EDX,OFFSET TITOLO ;Sceglie la stringa (DS:DX)
CALL STAMPA_STRINGA ;e la stampa.

MOV DX,0400h ;Imposta riga(DH) e colonna (DL)
CALL SPOSTA_CURSORE ;Muove il cursore nella pos scelta
RET ;Ritorno alla procedura chiamante
INIZIALIZZAZIONE ENDP


;-----------------------------------------------------------------------------------;
; Procedura per stampare il messaggio iniziale ;
; ;
; REGISTRI UTILIZZATI: DX, AH ;
;-----------------------------------------------------------------------------------;

PROMPT PROC NEAR
MOV EDX,OFFSET ISTRUZIONI ;Sceglie la stringa (DS:DX)
CALL STAMPA_STRINGA ; e la stampa.
RET ;Ritorna alla procedura chiamante
PROMPT ENDP



l'errore nn mi è dato ad una riga particolare poichè come dicevo quando vado a compilare (tasm base.asm) nn mi da nessun errore, l'errore mi appare quando faccio tlink base.asm...l'unica cosa strana che ho notato quando ho aggiunto l'estensione .386 è che su operazioni del tipo MOV DX,OFFSET TITOLO ; mi dava errore ed ho dovuto modificarle in MOV EDX,OFFSET TITOLO ; nn sò quanto sia rilevante però preferisco dirtelo...

Loading