Testo:
Si scriva un programma in linguaggio Assembler 8086 che realizzi una semplice
calcolatrice per numeri interi positivi. Il programma deve visualizzare il menù:
risultato = operando1 <+|-|*|/> operando2
Menù:
* inserisci operando1 [1]
* inserisci operando2 [2]
* inserisci simbolo operazione [3]
* visualizza risultato [4]
Effettua la tua scelta:
Soluzione:
MAX EQU 10
TEN EQU 10
.model small
.stack
.data
op1 db 10,0,10 DUP (0)
op2 db 10,0,10 DUP (0)
simbolo db ?
risultato db 10 DUP ("$")
menu db 0DH, 0AH, "Menu':", 0DH, 0AH
db 009, "* inserisci operando1", 009, 009, 009,"[1]", 0DH, 0AH
db 009, "* inserisci operando2", 009, 009, 009,"[2]", 0DH, 0AH
db 009, "* inserisci simbolo operazione", 009, 009,"[3]", 0DH, 0AH
db 009, "* visualizza il risultato", 009, "[4]", 0DH, 0AH, 0AH
db "Effettua la tua scelta: $"
frase1 db 0DH, 0AH, "Inserisci operando1: $"
frase3 db 0DH, 0AH, "Inserisci simbolo: $"
frase4 db 0DH, 0AH, "Tieni risultato: $"
frase2 db 0DH, 0AH, "Inserisci operando2: $"
.code
bin2str PROC
PUSH BP
MOV BP, SP
PUSH AX
PUSH BX
PUSH DX
PUSH DI
PUSH CX
XOR CX, CX
MOV DI, [BP+4]
MOV AX, [BP+6]
MOV BL, TEN
ciclo:
MOV DX, 0
DIV BX ;resto su dx
ADD DL, '0'
MOV [DI], DL
INC DI
INC CX
CMP AX, 0
JNE ciclo
DEC DI
MOV SI, [BP+4]
SHR CX, 1
CMP CX, 0
JE avanti:
convert:
MOV AH, [SI]
MOV AL, [DI]
MOV [SI], AL
MOV [DI], AH
INC SI
DEC DI
LOOP convert
avanti:
POP CX
POP DI
POP DX
POP BX
POP AX
POP BP
RET 4
ENDP
str2bin PROC
PUSH BP
MOV BP, SP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV DI, [BP+4]
MOV CL, [DI+1]
MOV CH, 0
CMP CL, 5
JG errore
MOV DX, 0 ;azzerro DX
XOR AX, AX
INC DI
INC DI
abin:
MOV BX, TEN
MUL BX
MOV BL, [DI]
CMP BL, '9'
JG errore
CMP BL, '0'
JL errore
SUB BL,'0'
XOR BH, BH
ADD AX, BX
INC DI
LOOP abin
MOV [BP+6], AX
POP DI
POP DX
POP CX
POP BX
POP AX
POP BP
RET 2
errore:
POP DX
POP CX
POP BX
POP AX
POP BP
STC
RET 2
ENDP
.startup
MOV CX, 4
prog:
LEA DX, menu
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, '1'
JE oper1
CMP AL, '2'
JE oper2
CMP AL, '3'
JE simb
CMP AL, '4'
JE res
JMP ciclo
oper1:
LEA DX, frase1
MOV AH, 09H
INT 21H
LEA DX, op1
MOV AH, 0AH
INT 21H
SUB SP, 2
PUSH DX
CALL str2bin
JC prog:
JMP fine:
oper2:
LEA DX, frase2
MOV AH, 09H
INT 21H
LEA DX, op2
MOV AH, 0AH
INT 21H
SUB SP, 2
PUSH DX
CALL str2bin
JC prog:
JMP fine:
simb:
LEA DX, frase3
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
MOV simbolo, AL
JMP fine:
res:
LEA DX, frase4
MOV AH, 09H
INT 21H
POP BX
POP AX
MOV DL, simbolo
CMP DL, "+"
JE sum
CMP DL, "-"
JE diff
CMP DL, "*"
JE mult
CMP DL, "%"
JE divis
sum:
ADD AX, BX
JMP stampa
diff:
SUB AX, BX
JMP stampa
mult:
MOV DX, 0
MUL BX
JMP stampa
divis:
MOV DX, 0
DIV BX
JMP stampa
stampa:
PUSH AX
LEA DX, risultato
PUSH DX
CALL bin2str
MOV AH, 09H
INT 21H
JMP fine:
fine:
LOOP prog
.exit
end
| < Prec. | Succ. > |
|---|





