文字是人类传递信息的主要媒介,而计算机作为人类目前发明的最强大的信息设备,也拥有极其强大的文本处理能力。如今,像Word这样的软件已经将文本处理的操作简单化了,你只需要滑动几下鼠标、点击几下按键,就可以获得你想要的文本。而这些图形界面操作其实是一组已经封装好了的函数。那么在没有Word软件之前或者说在C语言都没有发明之前,计算机要如何进行文本的处理呢?接下来就让我们用汇编语言来实现C语言中的strcmp()函数,体会早期的计算机如何进行文本处理。
首先,我们来了解一下strcmp()函数的功能。
对于两个字符串str1、str2,strcmp()函数会首先比较它们的长度,如果str1的长度大于str2,那么strcmp(str1,str2)会返回1,反之,strcmp(str1,str2)会返回-1;如果str1的长度等于str2,那么就会逐个比较str1和str2中的每个字符。
也就是说只有str1和str2的长度相等时,才会进行以下比较:
逐个比较str1和str2中相同位置上的字符,如果相同,则继续比较下一位置的字符。当对应位置的字符不同时,如果str1对应位置上的字符的ASCII码大于str2对应位置上的字符的ASCII码,strcmp(str1,str2)就会返回1,反之,strcmp(str1,str2)就会返回-1。而如果直到最后一个位置,str1和str2对应位置上的字符都相同,就说明这两个字符串完全相同。此时,strcmp(str1,str2)就会返回0。
具体可见以下图片:
实现代码如下:
data segment
string1 db 18 dup(?) ;定义第一个字符串
string2 db 18 dup(?) ;定义第二个字符串
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data ;初始化段寄存器
mov ds,ax
mov es,ax
mov dx,offset string1 ;获取要写入字符串的偏移地址
mov [string1],15 ;定义string1最大保存字符数
mov ah,0AH ;调用0AH号系统功能实现从键盘输入一个字符串
int 21H
mov bl,string1+1 ;获取输入字符串的实际长度
mov bh,0 ;这一步不可省略
mov string1[bx],'$' ;字符串结束标志
mov dl,0AH ;输出一个换行符
mov ah,2
int 21H
mov dx,offset string2 ;与对string1进行的操作相同
mov [string2],15
mov ah,0AH
int 21H
mov bl,string2+1 ;同上
mov bh,0
mov string2[bx],'$'
lea si,es:[string1+1] ;设置si
lea di,es:[string2+1] ;设置di
mov ax,0 ;这一步不可省略
cld ;设置字符串比较方向
next:
cmpsb
ja above ;当string1相同位置的字符的ASCII码大于string2相同位置的字符的ASCII码时跳转到above代码段,执行对应操作
jb below ;当string1相同位置的字符的ASCII码小于string2相同位置的字符的ASCII码时跳转到below代码段,执行对应操作
inc ax ;每比较一次,si、di自增,次数加一
cmp ax,16 ;将ax与最大比较次数进行比较
jz equal ;如果达到最大比较次数,就跳转到equal代码段,执行对应操作
loop next ;在不跳转的情况下回循环执行next代码段
equal:
mov dl,0AH ;输出一个换行符
mov ah,2
int 21H
mov dl,'0' ;输出0
mov ah,2
int 21H
jmp done
above:
mov dl,0AH ;输出一个换行符
mov ah,2
int 21H
mov dl,'1' ;输出1
mov ah,2
int 21H
jmp done
below:
mov dl,0AH ;输出一个换行符
mov ah,2
int 21H
mov dl,'-' ;输出负号
mov ah,2
int 21H
mov dl,'1' ;输出1
mov ah,2
int 21H
jmp done
done:
mov ah,4CH ;结束标志
int 21H
code ends
end start
运行结果如下:
成功实现。