Bootstrap

x86汇编语言实现简单的C函数功能

问题介绍

需要实现的四个基本函数

函数程序设计逻辑分析

1.strlen函数

程序要求
计算给定字符串的长度。

程序变量及寄存器注解:
sztext <----> 给定的字符串基址
EDI <----> 存放字符串基址
EAX <----> 用于长度计数

程序实现逻辑:
字符串结束时(即遇到终止符’\0’)停止计数。
每一次从字符串中取出一个字符并利用CMP指令与’\0’比较,将标志寄存器(包含ZF位)状态入栈。
给计数器EAX和索引地址EDI加一。
ZF出栈,LOOPNZ指令根据ZF位判断是否继续循环。
最后跳出循环时,给计数器EAX减一(以上逻辑将’\0’也计数的缘故)。
打印计数值。

关键语句含义讲解:

MOV EAX,0 ;计数
 count:            ;此过程体用于计量字符数目
    CMP BYTE PTR [EDI],0 ;将每一个字符与字符串结束符'\0'比较
	PUSHFD               ;将状态标志位入栈
	ADD EDI,1            ;增加字符串索引
	INC EAX              ;不管三七二十一,先给计数值+1
	POPFD                ;将状态标志位出栈
 LOOPNZ count            ;若此字符不等于'\0',则跳转回count继续计数
    DEC EAX              ;由于最后将字符='\0'的情况也计数了,所以需要给计数值-1
	INVOKE crt_printf,addr format,EAX  ;这里调用过程把计数值打印出来,perfecct!

2.strchr函数

程序要求
返回给定字符串中特定字符的第一个索引下标值(从一计数)。

程序变量及寄存器注解:
sztext <----> 给定的字符串基址
chr <---->特定字符
EDI <----> 存放字符串基址
AH <----> 存储数组下标,从一开始
AL <---->存放字符串中字符副本的容器。

程序实现逻辑:
在字符串中逐一进行字符匹配,第一次匹配到特定字符,立即跳出循环返回索引下标值。若是直至最后匹配到终止符,则跳转到“未发现”模块,将AH置为零以表示未找到。

关键语句含义讲解:

;1.题目要求返回位置指针,但是打印指针对于判断准确性并不直观。我选用数组下标代替
;2.由于要求在未找到时返回零,故而这里数组下标的初始值是一
	MOV AH,1 ;AH用于存储数组下标,从一开始
stringLocate:  ;字符串定位过程
    MOV AL,[EDI]  ;将字符串的字符值送入AL寄存器
	CMP AL,chr    ;把AL与待查找字符比较
	JE print      ;如果相等,找到了,跳转到打印过程
	CMP AL,0      ;AL与待查找字符不想等,则与终止符比较
;