代码摘自delphi的Pos函数。。。总的来说,若我理解无误的话,该函数才用的搜索机制并不是非常高明。。。只是简单的使用了一个倒序搜索,仅此而已。。。但其速度优于BM,应该是由于其对CPU的优化。。。
首先先介绍一下register调用约定: 从左到右,优先使用寄存器(EAX,EDX,ECX),然后使用堆栈!这个调用约定和C++里面的__fastcall有些类似,不同的是__fastcall优先使用的只有ECX和EDX。这两种调用约定应该说是最快速的调用约定。。
再贴一部分比较重要的源码,,源码都注释过,,也没什么解释的。。
开始为准备做工作:
push ebx;保护ebxesp-4
push esi;保护esiesp-4
add esp, -16;esp-16 char* i,j,b,p;
test edx, edx;测试被搜索字符串
jz @NotFound
test eax, eax;测试要搜索的子串
jz @NotFound
mov esi, [ebp+8];esi = strLen
mov ebx, ecx ;ebx = substrLen
cmp esi, ebx;strLen < substrLen 则跳出
jl @NotFound
test ebx, ebx;substrLen == 0 则跳出
jle @NotFound
dec ebx;substrLen--
add esi, edx;
add edx, ebx;指向开始比较的位置。str偏移为strlen(substr)的位置,比较关键,后期字符串搜索和这个指针有密切的关系
mov [esp+8], esi;j指向被搜索字符串的尾部
add eax, ebx
mov [esp+4], edx;i指向要搜索子串的尾部位置
neg ebx;ebx,substrLen长度减一的补码
movzx ecx, byte ptr [eax];ecx = substrLen[0]
mov [esp], ebx;[esp] = ecxc
jnz @FindString
开始具体的搜索:
@FindString:
sub esi, 2;
mov [esp+12], esi;p = strLen-2,指向被搜索字符串后输2的位置
@FindString2:
cmp cl, [edx];
jz @Test0;
@AfterTest0:
cmp cl, [edx+1]
jz @Test1
@AfterTest1:
add edx, 2;str = str + 2;
cmp edx, [esp+12];
jb @FindString4;从后向前比较如果在从后数两位以上则执行每四位比较一次的操作
cmp edx, [esp+8];
jb @FindString2;如果后面只剩了两位,则只能进行最后两位的操作。
xor eax, eax
jmp @Exit1
(Test0 , Test1 , Test2 , Test3操作相同,只是调整了一下指针的位置,只是调整了一下指针的位置)
其它的感觉也没什么好注释的,在上面可以看到,这个算法其实思路非常简单,个人感觉,如果用这种优化方式来实现sunday算法的话,还可以让速度再次增加。。。
分享到:
相关推荐
pos算法,微粒群优化算法解决函数优化问题,程序就是解决函数优化问题。
数组函数 Pos() CloseChannel() PrintSetFont() lowerBound() Replace() ExeclRemote() PrintSetSpacing() UpperBound() Right() GetDataDDEOrigin() PrintSetup() RightTrim() GetRemote() PrintText() ...
POSDLL 动态库的出口函数是用来直接控制 POS 打印机工作的,分为四个部分:通用函数、标准模式打印函数、页模式打印函数、调试等函数。 1.通用函数 这一部分函数同时支持打印机的三种打印模式(标准模式,页模式,...
POSDLL 动态库的出口函数是用来直接控制 POS 打印机工作的,分为如下三个部分: 1.通用函数 2.只支持标准打印模式(行模式)下的打印函数 3. 只支持页打印模式(P)或标签打印模式(L)下的打印函数
POS小票打印机函数库 支持COM/LPT/USB转LPT线等3种打印接口
标准粒子群算法程序,并举例优化函数拟合,对初学者有用
基于pos优化BP网络的项目权重预测实例
基于嵌入式Linux的POS系统架构研究.pdf
1.版本:matlab2021a,包含仿真...测试目标函数为15个标准适应度函数,运行后依次输出15个函数的目标优化值和收敛曲线。 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
EXTFCTP E6AXIS INVERSE(E6POS TOOLPOS :IN,E6AXIS START_AXIS :IN,INT STATUS :OUT) 38.通过轴位置获取笛卡尔位置: EXTFCTP E6POS FORWARD(E6AXIS AXVAL :IN,INT STATUS :OUT) 39.获取相反的矢量位置:
powerbuilder常用到的函数大全,并且作了详细介绍
用于基于pos算法解决光伏系统优化分析;请大家指正其中的问题和不足。
下边是POS_OPEN函数原型 HANDLE POS_Open(LPCTSTR lpName, int nComBaudrate, int nComDataBits, int nComStopBits, int nComParity, int nParam) 描述 打开端口。 参数 lpName [in] 指向以 null 结尾的打印机...
POS算法POS算法POS算法POS算法POS算法
直接控制 POS 打印机,VB/VC/DELPHI DEMO+HELP 分为四个部分:通用函数、标准模式打印函数、页模式打印函数、调试等函数。
POS热敏打印机驱动POS58 POS80通用,
POS设置POS设置POS设置POS设置POS设置POS设置
利用POSDLL.dll动态库,对通用的POS打印机进行串口,并口,网口的控制。在windowXP下利用VC6开发,带测试程序。并且带POSDLL.dll动态库的函数说明.rar
使用POS打印机打印。并支持zxing二维码生成 添加logo。s