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与待查找字符不想等,则与终止符比较