写这篇博客的目的呢,是因为某汇编老师要求的实验报告;汇编代码写统计字符串各字符个数的例子代码网上很多,但我们要求的用debug下的-A命令编写,这就有点坑爹了~
因为是用debug命令编写,所以变量,代码段什么的都没有,所以规定:
用段寄存器存储各字符个数:
ds[100] 存储字符串
ds[200] 存储小写字母个数
ds[210] 存储大写字母个数
ds[220] 存储数字
ds[230] 存储其他字符
注:可以自己规定地址存储;
第一步:
使用-e命令向ds[100]中存入字符串,可以使用-d命令查看存入情况:(右边是字符串,左边是对应字符的16位ASCII码)
第二步:
先看看代码逻辑:
mov cx,15 ;循环15次(loop指令所需)
mov si,100 ;存储字符串首地址
lop:
mov al,[si] ;将ds[si]字符的ASCII码给al(即字符串第一个字符)
cmp al,61 ;与'a'比较(这里需用字符对应ASCII码)
jb b1 ;如果小于’a’跳转到b1
cmp al,7A
ja b1 ;如果大于’z’跳转b1
inc ds[200] ;不跳转(即在a-z之间)小写字母+1
jmp b4
b1:
cmp al,41
jb b2 ;如果小于’A’跳转b2
cmp al,5A
ja b2 ;如果大于’Z’跳转b2
inc ds[210] ;大写字母+1
jmp b4
b2:
cmp al,30
jb b3 ;如果小于’0’跳转b3
cmp al,39
ja b3 ;如果大于’9’跳转b3
inc ds[220] ;数字+1
jmp b4
b3:
inc ds[230] ;其它字符+1
b4:
inc si ;取下一个字符
loop lop ;循环
注:整体逻辑:取出一个字符依次与小写字母,大写字母,数字比较;在这之间的就对应字符++,并跳出去,不在就继续往下,最后剩的是其他字符。(代码逻辑并非最优,个人能力有限)
当然,在debug下略微有点差别:
注:因为debug下没有lop,b1,b2…代码段标志,所以只能jmp到对应代码段地址。代码起始地址为0100,如果不同jmp地址则需对应改变。
第三步:
通过-g=0100 0139运行代码,
-d ds:200看看运行结果(懒得再编一次了,就不做演示)。
个人原创,能力有限,如有错误,欢迎指正~