记第一次通宵写代码【汇编】

这周四晚上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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值