上次写到可输入的两位数相加,这次,为了让运算更加灵活,可以进行加减运算。思路就是读取数字,当数字中断时判断符号为加号还是减号。再继续读取,然后运算时与两位数相加通过原理。减时用SUB一下即可。
DATAS SEGMENT
OP1 DW 0
OP2 DW 0
OPERATOR DB ?
RESULT DB 10 DUP (?)
BUFSIZE DB 25
ACTCHAR DB ?
CHARTEXT DB 26 DUP ('$')
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET BUFSIZE
MOV AH,0AH
INT 21H
MOV SI,OFFSET CHARTEXT
SS1:MOV CL,[SI]
CMP CL,30H
JB GETCODE ;跳转到ss6,此步为运算符号
CMP CL,39H
JA GETCODE
SUB CL,30H
CBW
MOV AX,OP1
MOV BX,10
MUL BX
ADD AX,CX
MOV OP1,AX
INC SI
JMP SS1
GETCODE:MOV BL,[SI] ;把运算符号赋给BL
MOV OPERATOR,BL
JMP SS2
SS2:
INC SI
MOV CL,[SI]
CMP CL,30H
JB SS6
CMP CL,39H
JA SS6 ;跳转到ss6,读取接下来的数字
SUB CL,30H
CBW
MOV AX,OP2
MOV BX,10
MUL BX
ADD AX,CX
MOV OP2,AX
JMP SS2
SS6:
CMP OPERATOR,2DH
JZ OPENJIAN ;若为减号,跳转到jian
JNZ OPENJIA ;若为加号,跳转到jia
OPENJIAN: CALL JIAN
JMP SS11 ;正常退出
OPENJIA: CALL JIA
JMP SS11 ;正常退出
JIA PROC
SS3:
MOV DL,10
MOV AH,2
INT 21H
MOV AX,OP1
ADD AX,OP2
MOV BX,0
MOV CL,10
SS4:DIV CL
ADD AH,30H
MOV SI, OFFSET RESULT
MOV [SI+BX],AH
INC BX
CBW
CMP AL,0
JNZ SS4
SS5:DEC BX
MOV DL,[SI+BX]
MOV AH,2
INT 21H
CMP BX,0
JNZ SS5
RET
JIA ENDP
JIAN PROC
SS7:
MOV DL,10
MOV AH,2
INT 21H
MOV AX,OP1
SUB AX,OP2
MOV BX,0
MOV CL,10
SS8:DIV CL
ADD AH,30H
MOV SI, OFFSET RESULT
MOV [SI+BX],AH
INC BX
CBW
CMP AL,0
JNZ SS8
SS9:DEC BX
MOV DL,[SI+BX]
MOV AH,2
INT 21H
CMP BX,0
JNZ SS9
RET
JIAN ENDP
SS11: MOV AH,4CH
INT 21H
CODES ENDS
END START
其实入门就入到这里而已,接下来的是与硬件结合的东西,个人不是太有兴趣,还是专心学自己的东西,不过,这门东西还是有用,至少让你知道很原始的东西,所以刚开始感觉很难写。因为底层,所以黑客和大牛们都是用这个,这个可以有。