
按回车结束运算数为(乱空0~255)
DATAS SEGMENT
x db 20 dup(?)
y db 'chu cuo le','$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
JMP A
KAISHI:
回车换行
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
INT 21H
LEA SI,X
SUB AX,AX
SUB BX,BX
SUB CX,CX
SUB DX,DX
输入数字
A: MOV AH,01H
INT 21H
CMP AL,0DH
JZ L
CMP AL,30H
JB B
CMP AL,3AH
JNB F
SUB AL,30H
MOV CH,AL
MOV AL,BL
MOV BL,0AH
MUL BL
ADD AL,CH
MOV BL,AL
JMP A
判陵租断+-*/=
B: CMP AL,2BH
JNZ K
MOV X[SI],BL
INC SI
MOV CL,0H
AND BL,0
JMP A
K: CMP AL,2DH
JNZ D
MOV X[SI],BL
INC SI
MOV CL,01H
AND BL,0
JMP A
D: CMP AL,2AH
JNZ E
MOV X[SI],BL
INC SI
MOV CL,02H
AND BL,0
JMP A
E: CMP AL,2FH
JNZ T
MOV X[SI],BL
INC SI
MOV CL,03H
AND BL,0
JMP A
计算
F: MOV [SI],BL
CMP AL,3DH
JNZ T
LEA SI,X
MOV AL,X[SI]
INC SI
MOV BL,X[SI]
CMP CL,0
JNZ G
ADD AL,BL
JMP J
G: CMP CL,01H
JNZ H
SUB AL,BL
JMP J
H: CMP CL,02H
JNZ I
AND AH,0
MUL BL
JMP J
I: AND AH,0
CMP CL,03H
DIV BL
输出
J: AND AH,0
CMP AL,100
JB ER
MOV BL,100
DIV BL
MOV CL,AH
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,CL
ER: CMP AL,10
JB YI
MOV BL,10
AND AH,0
DIV BL
ADD AL,30H
MOV DL,AL
MOV CL,AH
MOV AH,02H
INT 21H
MOV AL,CL
YI: ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
JMP KAISHI
T: LEA DX,Y
MOV AH,09H
INT 21H
JMP KAISHI
L: MOV AH,4CH
INT 21H
CODES ENDS
END START
经验证,下式结果正确S=86H*34H-22H=1B38H-22H=1B16H
code segment
assume cs:code,ds:code
org 100h COM格式
start:
push cs
pop ds
mov ax,0e53h 显示'S'
int 10h
mov al,'='显示'='
int 10h
call @IN
mov dl,al
mov bl,2ah"*"
call show 显示'H*'
call @IN
mov dh,al
mov bl,2dh "-"
call show 显示'H-'
call @IN
mov ah,0
mov bp,ax
mov bl,3dh "="
call show 显示'H='
mov ah,0
mov al,dl AL←86H
mov bl,dh BL←34H
mul bl 86H*34H
未考虑不够减的情况
sub ax,bp AX←AX-22H
mov cx,4
mov dx,ax
next:
push cx
mov cl,4
rol dx,cl
mov ax,dx
and al,0fh 取出一位
or al,30h 二进制转换为Ascii
cmp al,'9'比9小直接显示
jb T2
add al,7 是A`F的,加7校正
T2:
mov ah,0eh 显示Ascii
int 10h
pop cx
loop next 下一位
mov ax,0e48h 'H'
int 10h
mov ah,0
int 16h 暂停
mov ah,4ch
int 21h 结则肢束
@IN:可输入两位十六进制数
xor bx,bx BX←0
mov cx,4
@1:call input
mov bl,al
shl bl,cl BL←BL*10H
call input
add al,bl AL←两位十六进制数
ret
input: 仅允许输入并显示0-9和A-F
mov ah,0
int 16h 无回显键盘输入
cmp al,'0'十六进制数 0-F
jb input 为拆铅有效输入旅盯好
cmp al,'9'
jbe Q1
and al,0dfh 大小写,同转为大写
cmp al,'A'"A(a)"
jb input
cmp al,'F'"F(f)"
ja input
Q1:mov ah,0eh
int 10h 显示有效输入
sub al,30h 0-9之间,Ascii转换为二进制
cmp al,9
jbe Q3
sub al,7
Q3:ret
show:
mov ax,0e48h "H"
int 10h
mov al,bl
int 10h
ret
code ends
end start
楼主,你用是什么的汇编啊。是8088/8086,还是单片机的,是什么公司的升察产品,什么型号的,它们都是有一些差异的。我在这就说一下思路吧。用汇编做加减法比较容易,带进位不带进位的都可以,做乘除是隐液比较难的,一般是不用它做的,必须时灶笑物也最好转换成加减,这样在实现的时候才会方便。
我再说点MC51的汇编语言,也许你能用上。(都是一些语法)
带进位加法:addc a,#data (a)+#data+(c)-->(a)
addc a,data (a)+(data)+(c)-->(a)
addc a,@r(a)+((r))+(c)-->(a)
带进位的减法:subb a,#data
subb a,data
subb a,@r1
乘法:mul a b(a)*(b)
除法:div a b(a)/(b)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)