程序目的: 包含开始菜单,开始菜单里提供三个选项
输入1: 输入一个x,计算y=5*x-18的值并输出y;
输入2: 输出一串字符,统计其中的大写字母、小写字母、数字的个数,分别输出
输入3: 结束程序
DATAS SEGMENT
MESS0 DB 0AH,0AH,'1.Y=5X-18'
DB 0AH,0AH,'2.DISTINGUISH'
DB 0AH,0AH,'3.EXIT'
DB 0AH,0AH,'INPUT:$'
MESS2 DB 0AH,0AH,'OUTPUT:$'
XIAOXIE DB 0AH,0AH,'XIAOXIESHU:$'
DAXIE DB 0AH,0AH,'DAXIESHU:$'
SHUZI DB 0AH,0AH,'SHUZISHU:$'
CC DB 0AH,0AH,'Y=$'
X DB ?
Y DW ?
NUMB DB 10 DUP(?)
CAPI DB 10 DUP(?)
LETT DB 10 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 MESS0
MOV AH,9
INT 21H
LET0:
MOV AH,1
INT 21H
CMP AL,'1';这里1是字符,al是1则跳至1
JZ PROG1
CMP AL,'2';是2则跳至2;
JZ PROG2
JMP PROG3
PROG1:
MOV AH,1;输入x,计算y=5x-18;
INT 21H
MOV AH,0;ah清零
SUB AL,30H;al减30h化为二进制数
MOV BL,5
IMUL BL ;al*bl存入al
;MOV BX,AX
SUB AX,18;要用ax算,小心进位
JNS l00 ;如果为正,则转至let0
NEG AX ;取绝对值
l00:
MOV Y,AX ;将ax中的结果存入y
MOV CX,0
MOV BX,10;开始将y转化为十进制数
l11:
MOV DX,0
INC CX ;c加一,计算有多少个数被入栈
IDIV BX ;al除以bx(bx是10),商在ax,余数在dx
PUSH DX ;dx入栈
CMP AX,0 ;
JNZ l11 ;判断ax是否为0,不为零则转至let1;
MOV DX,OFFSET CC ;dx中存入 y= 并输出
MOV AH,9 ;
INT 21H ;输出dx
L22:
POP AX ;ax出栈
ADD AX,0030H ;转化
MOV DL,AL ;存入dl
MOV AH,2 ;输出
INT 21H
DEC CX ;c减一,有多少个数入栈了就循环多少次
CMP CX,0 ;
JNZ L22 ;c不为零就转至l22继续循环
JMP LET0 ;结束,重新回到菜单
PROG2:
L0:
MOV AH,1
INT 21H
CMP AL,0DH;回车键
JZ ENDD;跳至end
TEST AL,40H ;0100 0000;判断是字母还是数字
JZ L1; 是数字!!调到l1去吧
TEST AL,20H ;是字母!!再看看是大写还是小写的
JZ L2;是大写的!去l2
;CMP AL,7AH ;是小写!
;JA ENDD
MOV LETT[BX],AL;小写字母存入lett
INC BX ;bx加一,统计个数
JMP L0;回到lo,再来一次
L2:
;CMP AL,5AH
;JA ENDD
MOV CAPI[SI],AL
INC SI;统计大写字母个数
JMP L0
L1:
;CMP AL,'0' ;低于0或高于9则结束,不瞎输入的话可以不用这步
;JB ENDD
;CMP AL,'9'
;JA ENDD
MOV NUMB[DI],AL
INC DI;统计数字个数
JMP L0
ENDD: ;结束了,该输出了(仅限于2情况!只有在prog2内才可能跳到endd)
MOV DX,OFFSET XIAOXIE ;输出一串字符
MOV AH,9
INT 21H
ADD BX,30H ;输出小写字母个数(程序有限,最大为9!想要更大可以把上面的情况1拷贝下来)
MOV DX,BX
MOV AH,2
INT 21H
MOV DX,OFFSET DAXIE ;输出一串字符
MOV AH,9
INT 21H
ADD SI,30H
MOV DX,SI
MOV AH,2;输出大写字母个数
INT 21H
MOV DX,OFFSET SHUZI ;输出一串字符
MOV AH,9
INT 21H
ADD DI,30H
MOV DX,DI
MOV AH,2;输出数字个数
INT 21H
JMP LET0 ;回去,重来!!
PROG3: ;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
;所以text是将二进制的每个位置依次做与运算,0与1为0,如果全都是0的话sf=0,zf=1
易错点:
有关text伪指令的用法:
如 TEXT OPR1,OPR2
是将二进制的两操作数相与,且只改变标志位,结果不回送
即将两个数的每一位的数字相与
0与1为0 , 0与0为0 , 1与1为1;
若最终每一位都为零,则判断其为0,
此时用JZ命令则转移到标号位