BASM函数求注释

notebook800 2009-07-09 10:18:40
下面的这个函数作用是比较两个字符串,在VCL中有源码。
测试方法 Compare := CompareStr('ABCDEFGH', 'AACDEFGH');

有几出不理解。

1、or eax,eax je @@1 不理解,看似没什么作用
2、mov eax,[eax-4] 为何要将[eax-4]的内容($00000008)放入eax
3、看不出来第一个字符是如何比较的。A与A 比较
4、REPE CMPSB 到底重复什么操作
5、CMP ECX,ECX  这样比较有什么作用


function UXCompareStr(const S1, S2: string): Integer; assembler;
asm
PUSH ESI
PUSH EDI
MOV ESI,EAX
MOV EDI,EDX
OR EAX,EAX   
JE @@1
MOV EAX,[EAX-4]
@@1: OR EDX,EDX
JE @@2
MOV EDX,[EDX-4]
@@2: MOV ECX,EAX
CMP ECX,EDX
JBE @@3
MOV ECX,EDX
@@3: CMP ECX,ECX
REPE CMPSB
JE @@4
MOVZX EAX,BYTE PTR [ESI-1]
MOVZX EDX,BYTE PTR [EDI-1]
@@4: SUB EAX,EDX
POP EDI
POP ESI
end;
...全文
37 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwjchina 2009-07-09
  • 打赏
  • 举报
回复
前二问,理解正确了。

最后一问:
CMP ECX ECX 比较ECX,会影响标志位。即0标志被置位,也就是为CMPSB 设置初始条件。
notebook800 2009-07-09
  • 打赏
  • 举报
回复
谢谢楼上的解答,

MOV EAX,[EAX-4]

[EAX-4] 中存放的是不是S1的长度?

@@2: MOV ECX,EAX
CMP ECX,EDX
是不是比较两个字符串长度是否一致?

楼上的比较ECX ECX 是什么意思?没看懂。
zwjchina 2009-07-09
  • 打赏
  • 举报
回复
1. 如果S1为空则 执行@@1
2. EAX <- S1串长
@@1 3. 如果S2为空则 执行@@2
4. EDX <- S2串长
@@2 5. 比较S1串长 >= S2串长则 执行@@3
6. S2串长放入ECX
@@3 7. 比较ECX ECX
8. ECX>0 且零标志被设置时 重复CMPSB(即串未结束,且前面的比较都相等时重复比较)
9. (REPE重复前缀执行完毕,即ECX = 0 或者0标志未被设置,即有字符不相等) 如果是0标志被设置,即相等,则 执行@@4
10. 将最后比较的S1中的字符放入EAX S2中最后比较的字符放入EDX (设字符各是 S1_char S2_char)
@@4 11. EAX := S1_char - S2_char;
12. 恢复栈

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧