汇编实验(3.1):统计大写字母和小写字母

实验内容

内存source中存放着一个以0为结束标识的字符串,找出其中的大写字母和小写字母,统计他们的个数,结果放到num1和num2中,并显示出来。

统计功能

DATAS SEGMENT
    ;此处输入数据段代码 
    source db 'SSSSaaa234235',0
    ;source 为需要统计的代码段
    num1 db 0;保存大写字母的数量
   	num2 db 0 ;保存小写字母的数量
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov ax,offset source
    mov si,ax
    MOV AX,0;初始化ax,al统计大写字母,ah统计小写字母
count:mov bl,[si]
    cmp bl,0
    je L3 ;遇到ascii为0的跳出循环
	cmp bl,'A'
	jb 	L1 ;小于‘A'则直接进入下次循环
	cmp BL,'Z'
	JBE L2;为大写字母
	CMP BL,'a'
	JB L1;不为大写字母,也不为小写字母ascii A<a
	CMP BL,'z'
	JA L1;大于z,不为小写字母
	INC AH
	JMP L1
L2	:INC AL
L1	:inc si;si往后移一位
	jmp count 
L3: int 3
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

有符号十进制数显示程序

算法步骤:
1)先判断数据是零、正数或负数,是零显示“0”退出
2)是负数,显示负号“-”,求数据的绝对值
3)接着数据除以10,余数为十进制数码,加30H转换为ASCII码保存
4)重复第(3)步,直到商为0结束
5)依次从高位开始显示各位数字

DATAS SEGMENT
    ;此处输入数据段代码 
    array dw 6789,-1234,0,1
DATAS ENDS


STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    mov cx,lengthof array
    xor bx,bx
again:mov ax,array[bx];
     call dispsiw;调用子程序显示一个数据
     add bx,type array
     call dispcrlf;换行以便显示下一个数据
     loop again
     jmp ex
dispsiw proc near
    push ax
    push bx
    push dx
    test ax,ax;判断是零、正数或负数
    jnz dsiw1;不是零,跳转
    mov dl,'0'
    mov ah,2
    int 21h
    jmp dsiw5;转向显示
dsiw1:jns dsiw2;是正数,跳转
    mov bx,ax
    mov dl,'-';是负数,显示负号
    mov ah,2
    int 21h
    mov ax,bx
    neg ax;数据求补(绝对值)
dsiw2:mov bx,10
    push bx;10压入堆栈,作为退出标志
dsiw3:cmp ax,0  ;数据(商)为零,转向保存
    jz dsiw4
    xor dx,dx   ;扩展被除数为DX.AX
    div bx  ;数据除以10:DX.AX÷10
    add dl,30h  ;余数(09)转换为ASCII
    push dx ;数据先低位后高位压入堆栈
    jmp dsiw3
dsiw4:pop dx
    cmp dl,10
    je dsiw5
    mov ah,2;
    int 21h
    jmp dsiw4
dsiw5:pop dx
    pop bx
    pop ax
    ret
dispsiw endp
dispcrlf proc near 
    push ax
    push dx
    mov dl,0dh  ;输出回车字符
    mov ah,2
    int 21h
    mov dl, 0ah  ;输出换行字符
    int 21h
    pop dx
    pop ax
    ret
dispcrlf endp
ex: mov ah,4ch
	int 21h
CODES ENDS 
    END START

综合

DATAS SEGMENT
   ;此处输入数据段代码 
   source db 'SSSSaaa234235',0
   ;source 为需要统计的代码段
   num1 db 0;保存大写字母的数量
  	num2 db 0 ;保存小写字母的数量
  	output1 db 'num1: $'
  	output2 db 'num2: $'
DATAS ENDS

STACKS SEGMENT
   ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
   ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
   MOV AX,DATAS
   MOV DS,AX
   ;此处输入代码段代码
   mov ax,offset source
   mov si,ax
   mov AX,0;初始化ax,al统计大写字母,ah统计小写字母
count:mov bl,[si]
   cmp bl,0
   je L3 ;遇到ascii为0的跳出循环
   cmp bl,'A'
   jb 	L1 ;小于‘A'则直接进入下次循环
   cmp BL,'Z'
   JBE L2;为大写字母
   CMP BL,'a'
   JB L1;不为大写字母,也不为小写字母ascii A<a
   CMP BL,'z'
   JA L1;大于z,不为小写字母
   INC AH
   JMP L1
L2	:INC AL
L1	:inc si;si往后移一位
   jmp count
   mov num1,al
   mov num2,ah ;保存数据 
L3: int 3; debug 断点测试
   mov bx,ax
   mov dx,offset output1
   mov ah,9
   int 21h
   mov al,bl
   mov ah,0
   call dispsiw
   call dispcrlf
   mov dx,offset output2
   mov ah, 9
   int 21h
   mov ah,bh
   mov al,0
   xchg ah,al
   call dispsiw
   call dispcrlf
   jmp ex
dispsiw proc near
   push ax
   push bx
   push dx
   test ax,ax;判断是零、正数或负数
   jnz dsiw1;不是零,跳转
   mov dl,'0'
   mov ah,2
   int 21h
   jmp dsiw5;转向显示
dsiw1:jns dsiw2;是正数,跳转
   mov bx,ax
   mov dl,'-';是负数,显示负号
   mov ah,2
   int 21h
   mov ax,bx
   neg ax;数据求补(绝对值)
dsiw2:mov bx,10
   push bx;10压入堆栈,作为退出标志
dsiw3:cmp ax,0  ;数据(商)为零,转向保存
   jz dsiw4
   xor dx,dx   ;扩展被除数为DX.AX
   div bx  ;数据除以10:DX.AX÷10
   add dl,30h  ;余数(09)转换为ASCII
   push dx ;数据先低位后高位压入堆栈
   jmp dsiw3
dsiw4:pop dx
   cmp dl,10
   je dsiw5
   mov ah,2;
   int 21h
   jmp dsiw4
dsiw5:pop dx
   pop bx
   pop ax
   ret
dispsiw endp
dispcrlf proc near 
   push ax
   push dx
   mov dl,0dh  ;输出回车字符
   mov ah,2
   int 21h
   mov dl, 0ah  ;输出换行字符
   int 21h
   pop dx
   pop ax
   ret
dispcrlf endp
ex: MOV AH,4CH
   INT 21H
CODES ENDS
   END START

过程

环境:ml 位于d:\app\ml615
实验文件命名为2.asm 位于d:\app\ml615下
下载:汇编工具、dos及案例代码.zip
步骤:
1) 编写汇编代码
2)cltr+r 打开cmd 切换目录
在这里插入图片描述
3) 打开dosbox 切换目录 运行2.exe文件
在这里插入图片描述

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值