这周四晚上7点到周五早上6点,进入计算机专业一年来,第一次真正通宵写代码。没想到初夜献给了汇编啊。。
写代码的时候还没完整看过书,现在考完试了再看,好像其中有些框架有点问题,子程序调用也不太规范。。
DATAS SEGMENT
MSG1 DB 'Input: $ ' ;输出input
MSG2 DB 13,10, 'Numbers: $'
MSG3 DB 13,10, 'Characters: $'
MSG5 DB 13,10, 'Others: $'
MSG4 DB 13,10, 'Summery: $'
MSG6 DB 13,10, 'Bubble order: $'
MSG7 DB 13,10, 'Input letter: $'
MSG8 DB 13,10, 'The first : $'
MSG9 DB 13,10, 'The last : $'
EX2 DB 13,10,'-----EX2----$'
EX3 DB 13,10,'----EX3----$'
ENT DB 13,10,'$'
MAXLEN DB 52 ;最大字符串长度
ACTLEN DB ;输入字符串长度
STRING DB 52 DUP ;定义空间
CHAR DB ; 字母计数
NUM DB ;数字计数
OTH DB
A1 DW ;add number
A2 DW ;add number
SUM DW ;add answer
DATAS ENDS
EXTRA SEGMENT
ACTLEN2 DB ?
STRING2 DB 52 DUP('$')
CHAR2 DB ?
EXTRA ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:EXTRA
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
MOV AH,7
MOV AL,0
MOV BH,80H
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,39
INT 10H
MOV AH,7
MOV AL,0
MOV BH,34H
MOV CH,0
MOV CL,40
MOV DH,24
MOV DL,79
INT 10H
MOV BH,0
MOV DH,0
MOV DL,40
MOV AH,2
INT 10H
CALL COMP
CALL ADDD
CALL OUTPUTT
CALL EXER2
;---------------------------------------------------
;222222222222222222222222222222222222222222222222222
;count numbers and characters
COMP PROC NEAR
MOV AH,9 ;输出input
LEA DX,MSG1
INT 21H
MOV AH,10 ;输入字符串
LEA DX,MAXLEN
INT 21H
LEA BX,STRING ;定义bx指针
MOV CH,ACTLEN ;循环变量ch
XOR DH,DH ;number of letters
XOR DL,DL ;number of numbers
L2:
MOV AH,[BX] ;取第一个字符
CMP AH,'A' ;判断和a的大小
JL L3 ;比a小,number
CMP AH,'Z' ;跟z比
JG L4 ;比z大,lower letter
INC DH ;否则dh计数器加一 letter
JMP L1
L3:
CMP AH,'0'
JL L1
CMP AH,'9'
JG L1
INC DL
JMP L1
L4:
CMP AH,'a'
JL L1
CMP AH,'z'
JG L1
INC DH
JMP L1
L1:
INC BX ;bx指针下移
DEC CH ;循环变量减一
JNZ L2 ;循环变量不为0,跳L2
MOV CHAR,DH ;计数结果
MOV NUM,DL
MOV AL,ACTLEN
SUB AL,CHAR
SUB AL,NUM
MOV OTH,AL
MOV AX,WORD PTR NUM
MOV A1,AX
MOV AX,WORD PTR CHAR
MOV A2,AX
COMP ENDP
;----------------------------------------------------
;1111111111111111111111111111111111111111111111111111
;add
ADDD PROC NEAR
MOV AX,A1 ;数据转移指令,直接寻址
XOR BX,BX ;异或指令,BX置0
LEA BX,A2 ;地址转移指令,将被加数地址给BX
ADD AX,[BX] ;加法,寄存器间接寻
MOV SUM,AX ;数据转移指令
ADDD ENDP
;----------------------------------------------------
;output
OUTPUTT PROC NEAR
MOV AH,9
LEA DX,EX2
INT 21H
MOV AH,9
LEA DX,MSG2
INT 21H
MOV AL,NUM
CALL DISP
MOV AH,9
LEA DX,MSG3
INT 21H
MOV AL,CHAR
CALL DISP
MOV AH,9
LEA DX,MSG5
INT 21H
MOV AL,OTH
CALL DISP
MOV AH,9
LEA DX,MSG4
INT 21H
MOV AL,BYTE PTR SUM
CALL DISP
OUTPUTT ENDP
;----------------------------------------------------
;333333333333333333333333333333333333333333333333333
;bubble order
EXER2 PROC NEAR
MOV AH,9
LEA DX,EX3
INT 21H
MOV AH,9
LEA DX,MSG6
INT 21H
CALL BUBBLE
MOV AH,9
LEA DX,ENT
INT 21H
MOV AH,9
LEA DX,STRING
INT 21H
;copy
LEA SI,STRING
LEA DI,STRING2
MOV CX,50
CLD
REP MOVSB
MOV AH,9
LEA DX,ENT
INT 21H
;search
MOV AH,9
LEA DX,MSG7
INT 21H
MOV AH,1 ;INPUT THE LETTER TO AL
INT 21H
LEA SI,STRING2
MOV A1,0
MOV A2,0
MOV SUM,0
MOV BX,1
MOV CX,WORD PTR ACTLEN
MOV CH,0
SL2:
CMP AL,STRING2[BX]
JNE SL1
MOV A1,BX
ADD BX,1
JMP SOUTLOOP
SL1:
ADD BX,1
CMP BX,CX
JBE SL2
JMP OUTPUT
SOUTLOOP:
CMP AL,STRING2[BX]
JNE SOUTL1
MOV A2,BX
SOUTL1:
ADD BX,1
CMP BX,CX
JBE SOUTLOOP
JMP OUTPUT
OUTPUT:
MOV AX,A1 ;数据转移指令,直接寻址
ADD AX,A2
MOV SUM,AX
MOV AH,9
LEA DX,MSG8
INT 21H
MOV AL,BYTE PTR A1
CALL DISP
MOV AH,9
LEA DX,MSG9
INT 21H
MOV AL,BYTE PTR A2
CALL DISP
MOV AH,9
LEA DX,MSG4
INT 21H
MOV AL,BYTE PTR SUM
CALL DISP
MOV AH,4CH
INT 21H
EXER2 ENDP
;----------------------------------------------
;output numbers
DISP PROC NEAR
XOR BX,BX
XOR AH, AH
MOV BL, 10
DIV BL
MOV BH,AH
MOV AH,2
ADD AL,30H
MOV DL,AL
INT 21H
ADD BH, 30H
MOV DL, BH
MOV AH, 2
INT 21H
RET
DISP ENDP
;----------------------------------------------
;bubble order
BUBBLE PROC NEAR
MOV AX,0
MOV CL,ACTLEN
LEA SI,STRING
BL1:
PUSH CX
MOV DI,SI
INC DI
BL2:
MOV AL,[SI]
CMP AL,[DI]
JB CONTINUE
XCHG AL,[DI]
MOV [SI],AL
CONTINUE:
INC DI
LOOP BL2
INC SI
POP CX
LOOP BL1
RET
BUBBLE ENDP
CODES ENDS
END START