用汇编语言实现C语言中strcmp()函数的功能

文字是人类传递信息的主要媒介,而计算机作为人类目前发明的最强大的信息设备,也拥有极其强大的文本处理能力。如今,像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

 运行结果如下:

成功实现。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值