Esercitazione

Stato
Discussione chiusa ad ulteriori risposte.

Ale10

Utente Silver
16 Maggio 2008
0
0
0
57
Dunque, ho un problema in un esercizio che richiedere il calcolo di un'equazione di primo grado del tipo Y=AX+B. Conoscendo, in entrata, i valori di A,X e B, calcolare quindi Y. Palese quindi che dovrò usare le istruzioni ADD e MUL. E penso che l'errore sia proprio in quest'ultima, dato che non riesco a spostare il contenuto di AX, dove va a finire il prodotto.
Comunque, ecco il codice che ho scritto fino ad ora.
Codice:
;programma che, dati in ingresso A, B e X (a 1 Byte), risolva l'equazione di primo grado Y = A*X+B (Y a 2 Byte).

Dati 	SEGMENT        ; definizione dati usati nel programma
X 	DB 'inserire la x: ','$'
A 	DB 'inserire il coefficiente della x: ','$'
B 	DB 'inserire il termine noto: ','$'
msg DB 'Il risultato e: ','$'
Primo 	DB		?
Secondo	DB		?
Terzo 	DB		?
Ris		DB		?
Dati ENDS

Sistema SEGMENT STACK      ; definiamo uno stack di 100 bytes
    DW 100 DUP (?)
    Top LABEL WORD
Sistema ENDS

Codice SEGMENT
    ; Definizione dei segmenti
    ; ASSUME serve a definire a quale puntatore potrà ssere assegnato la struttura
        ASSUME CS: Codice, SS:Sistema, DS:Dati, ES:Dati
		
    ORG 0100H
    ;Inizializzazione dei registri di segmento
Inizio: MOV     AX,sistema
        MOV     SS,AX
        LEA     AX,Top
        MOV     SP,AX
        MOV     AX,Dati
        MOV     DS,AX
        MOV     ES,AX
		
		LEA		DX,X			;visualizzazione della frase
		MOV		AX,0900H 
		INT		21H
		MOV 	AH,01H		;lettura numero
		INT 	21H
		SUB		AL,48
		MOV		Primo,AL
		MOV 	DL,10		;riga successiva
		MOV 	AH,02H		
		INT 	21H			
		MOV 	DL,13		;inizio riga
		MOV 	AH,02H		
		INT 	21H
		
		LEA		DX,A			;visualizzazione della frase
		MOV		AX,0900H 
		INT		21H
		MOV 	AH,01H		;lettura numero
		INT 	21H
		SUB		AL,48
		MOV		Secondo,AL
		MOV 	DL,10		;riga successiva
		MOV 	AH,02H		
		INT 	21H			
		MOV 	DL,13		;inizio riga
		MOV 	AH,02H		
		INT 	21H
		
		LEA		DX,B			;visualizzazione della frase
		MOV		AX,0900H 
		INT		21H
		MOV 	AH,01H		;lettura numero
		INT 	21H
		SUB		AL,48
		MOV		Terzo,AL
		MOV 	DL,10		;riga successiva
		MOV 	AH,02H		
		INT 	21H			
		MOV 	DL,13		;inizio riga
		MOV 	AH,02H		
		INT 	21H
		
		MOV		AL,Primo
		MOV		BL,Secondo
		MUL		BL      ; AX = AL * BL
		MOV		Ris,AX
		MOV		AL,Terzo
		ADD		Ris,AL
		MOV		AL,Ris
		MOV		DL,AL
		
		LEA		DX,msg			;visualizzazione della frase
		MOV		AX,0900H 
		INT		21H
		MOV		AH,02H		;scrittura risultato
		INT		21h
		MOV		AH,01H		;attesa lettura carattere
		INT 	21H
		
		
		
    ; ritorno al sistema operativo
        MOV     AL,00H
        MOV     AH,4CH
        INT     21H

Codice  ENDS       ; ENDS fine segmento

END     inizio
Usando TASM, viene restituito l'errore relativo alla riga 79, ovvero "MOV Ris,AX", "Operand types do not match".
Non riesco a capire perchè non me lo faccia fare, dato che ho praticamente seguito il codice di un programma fatto dal mio prof, in cui moltiplicava due numeri già specificati nel programma.
Che ne pensate?

PS:scusate la pessima formattazione del codice (copiato pari pari da Notepad++).
 
mmh non puoi fare MOV in Ris, non è un registro (ora non ho letto tutto il codice, mi tira XD) cmq

prova con MOV Offset Ris,AX


edit: riletto, forse non ci va OFFSET, visto che nelle precedenti istruzioni l'hai dato senza errori.
allora mi sa tanto che devi spostarlo in un altro registro. (pazzo perchè non usate i registri a 32bit =_=??)

Io farei:

MOV ES, Offset ris
mov es,ax
 
BlackCode ha detto:
mmh non puoi fare MOV in Ris, non è un registro
Come ho scritto prima, in un esercizio su sola moltiplicazione, con numeri già assegnati, MOV Ris,AX funzionava.
Magari provo a scriverti il codice di questo programma?

BlackCode ha detto:
MOV ES, Offset ris
mov es,ax
Se ho ben capito, devo sostituire queste due istruzioni alla riga sbagliata.
Facendo ciò. TASM dà errore su MOV ES,OFFSET Ris con "Illegal use of segment register".
 
che palle stupido tasm, stupidi registri win32.
ma siete obbligati ad usare tasm? é_é
 
Stato
Discussione chiusa ad ulteriori risposte.