汇编语言第二次作业---菜单程序设计(附笔记)

程序目的: 包含开始菜单,开始菜单里提供三个选项
输入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命令则转移到标号位

你可能感兴趣的:(萌新笔记)