汇编基础案例

计算两位以内的a+b数。

;---------------------------
ASSUME CS:CC, DS:QW
;---------------------------
QW SEGMENT
    ;数据段
    ;DB一字节,DW两字节,DD四字节
    M1 DB 'Please input n1 : $'
    M2 DB 13, 10, 'Please input n2 : $'
    M3 DB 13, 10, 'SUM = $'
    M4 DB 13, 10, 'Press any key to continue ... $'
    N1 DB ?
    N2 DB ?
    S  DB ?
QW ENDS
;---------------------------
CC SEGMENT
    ;代码段
    START:
    ;引入QW段
    MOV  AX, QW
    MOV  DS, AX
    ;显示M1
    LEA  DX, M1
    MOV  AH, 9 ;DX=串地址,$结束字符串
    INT  21H;中断号

    ;段标志
    IN_N1:
    ;输入
    MOV  AH, 1
    INT  21H

    ;判断是否在0-9之间
    CMP  AL, '0'
    JB  IN_N1  ;比0小转移
    CMP  AL, '9'
    JA  IN_N1  ;比9大转移

    AND  AL, 0FH ;与
    MOV  N1, AL
    ;输出
    LEA  DX, M2
    MOV  AH, 9
    INT  21H

    IN_N2:
    MOV  AH, 1
    INT  21H
    CMP  AL, '0'
    JB  IN_N2
    CMP  AL, '9'
    JA  IN_N2
    AND  AL, 0FH
    MOV  N2, AL
    ;操作N1+N2
    ADD  AL, N1
    MOV  S, AL

    DISP:
    ;输出提示字符串
    LEA  DX, M3
    MOV  AH, 9
    INT  21H
    ;进位操作
    MOV  AL, S
    MOV  AH, 0
    MOV  BL, 10
    DIV  BL ;结果AL保存商,AH保存余数,
    PUSH AX ;压入栈,临时保存
    ADD  AL, '0' ;低八位与操作
    MOV  DL, AL ;DL输出字符
    MOV  AH, 2
    INT  21H
    POP  AX 
    ADD  AH, '0' ;高八位与操作
    MOV  DL, AH ;DL输出字符
    MOV  AH, 2
    INT  21H

    EXIT:
    LEA  DX, M4
    MOV  AH, 9
    INT  21H
    MOV  AH, 7;AH功能输出不回显
    INT  21H
    MOV  AH, 4CH;结束本程序
    INT  21H

   ;返回DOS;---------------------------
CC ENDS
END START

计算字符串的长度,数字个数,字母个数。如果有兴趣可以自己改计算大写字母个数,计算小写字母个数。

;Step1:利用0AH号功能调用接受一个字符串;
;Step2:分别统计其中数字字符、英文字母的个数;
;Step3:用十进制数的形式显示它们。
;数据定义
MLENGTH =128            ;缓冲区长度
DSEG   SEGMENT          ;数据段
  BUFF   DB  MLENGTH    ;符合0AH号功能调用所需的缓冲区
         DB  ?          ;实际键入的字符数
         DB  MLENGTH DUP(?)
  MESS0  DB  "Please input:$"
  MESS1  DB  "Length = $"
  MESS2  DB  "number = $"
  MESS3  DB  "word = $"
DSEG   ENDS

CSEG  SEGMENT                   ;代码段
   ASSUME   CS:CSEG, DS:DSEG

START:
        MOV   AX,DSEG           ;将数据时段首址DSEG送入DS寄存器
        MOV   DS,AX             ;设置DS
        MOV   DX,OFFSET  MESS0
        CALL  DISPMESS          ;显示提示
        MOV   DX,OFFSET  BUFF
        MOV   AH,10           ;接受一个字符串
        INT   21H
        CALL  NEWLINE         ;回车换行
        MOV   BH,0            ;清数字字符计数器
        MOV   BL,0            ;清字母符计数器
        MOV   CL,BUFF+1       ;取字符串长度
        MOV   CH,0
        ;若CX=0, JCXZ COK: 跳转到标号COK处
        JCXZ  COK                  ;若字符串长度等于0,不统计
        MOV   SI,OFFSET  BUFF+2    ;指向字符串首

AGAIN:
        MOV   AL,[SI]      ;取一个字符
        INC   SI           ;调整数据指针,指向下一个数据
        CMP   AL, '0'      ;判断是否是数字字符
        JB    NEXT         ;小于‘0’,不属于统计字符,
        CMP   AL, '9'      ;大于‘9’,不是数字字符,
        JA    NODEC        ;转向字母字符判断
        INC   BH           ;‘0’~‘9’,数字符计数加1
        JMP   SHORT  NEXT  ;转向取一个字符, NEXT->AGAIN (LOOP)

NODEC:
        OR    AL,20H        ;大写转小写经典语句
        CMP   AL, 'a'       ;判断是否是字母符
        JB    NEXT
        CMP   AL, 'z'
        JA    NEXT
        INC   BL            ;字母符计数加1

NEXT:
        LOOP  AGAIN         ;下一个

COK:
        MOV  DX,OFFSET  MESS1
        CALL DISPMESS       ;显示提示
        MOV  AL,BUFF+1      ;取字符串长度
        XOR  AH,AH          ;AH 取0
        CALL DISPAL         ;显示字符串长度(变成十进制显示)
        CALL NEWLINE        ;回车换行
        MOV  DX,OFFSET  MESS2
        CALL DISPMESS       ;显示提示
        MOV  AL,BH
        XOR  AH,AH
        CALL DISPAL         ;显示数字符个数(变成十进制显示)
        CALL NEWLINE        ;回车换行
        MOV    DX,OFFSET  MESS3
        CALL   DISPMESS
        MOV    AL,BL
        XOR    AH,AH
        CALL   DISPAL       ;显示字母符个数
        CALL   NEWLINE
        MOV    AX,4C00H     ;程序正常结束
        INT    21H

DISPAL  PROC  NEAR    ;子程序,二进制数以十进制形式显示
        MOV   CX,3    ;8位二进制数最多转换成3位十进制数
        MOV   DL,10
  DISP1:
        DIV   DL      ;AL商, AH余数
        XCHG  AH,AL   ;使AL=余数,AH=商
        ADD   AL, '0' ;得ASCII码
        PUSH  AX      ;压入堆栈
        XCHG  AH,AL
        MOV   AH,0
        LOOP  DISP1   ;继续

        MOV   CX,3    ;循环计数器重置
  DISP2:
        POP   DX      ;弹出一位
        CALL  ECHOCH  ;显示一个字符
        LOOP  DISP2   ;继续
        RET

DISPAL  ENDP

DISPMESS  PROC   NEAR ;子程序,显示提示信息
         MOV   AH,9
         INT   21H
         RET
DISPMESS  ENDP

ECHOCH  PROC   NEAR  ;子程序,显示一个字符
         MOV   AH,2
         INT   21H
         RET
ECHOCH  ENDP

NEWLINE  PROC   NEAR     ;子程序,形成回车和换行
         PUSH    AX
         PUSH    DX
         MOV     DL,0DH   ;回车符的ASCII码是0DH
         MOV     AH,2     ;显示回车符
         INT     21H
         MOV     DL,0AH   ;换行符的ASCII码是0AH
         MOV     AH,2     ;显示换行符
         INT     21H
         POP     DX
         POP     AX
         RET
NEWLINE  ENDP
CSEG  ENDS
    END START
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值