繁体   English   中英

字符串搜索,x86 汇编

[英]String Search, x86 Assembly

我在组装课上遇到了某个作业问题。 我看过的书和教程并没有帮助我弄清楚,所以我想我会来这里的。 这是任务。

“编写一个内联汇编语言程序子例程,它在字符串中搜索一个字符并返回该字符在字符串中的第一次出现。

子例程必须调用 search 并且字符串在 ESI 寄存器中传递。 要搜索的字符应该放在 AL 寄存器中,字符串的长度在 ECX 寄存器中。

子程序应返回字符在 EBX 寄存器中的位置,其中第一个字符为 1,如果未找到,则返回 0。

例如,给定 mystring = 'EXCELLENTE' 中的 10 个字符的字符串,定位第一个 'X' 字符。

 lea ESI,mystring mov al,'X' mov ecx,10 call search ------returns with EBX =2 lea ESI,mystring mov al,'Y' mov ecx,10 call search ------returns EBX = 0

该程序必须适用于任何大小的字符串或字符组合”

我对子程序的理解很好,最近学习了 repne scasb 函数。 我相信我可能不得不使用它,但我完全不确定。 另外为什么我的教授在他的例子中使用了 ESI 寄存器? 我认为一个是专门用于内存位置的。 这是我必须编写的第一个涉及字符串操作的代码,它刚刚飞过我的头。 任何和所有的帮助将不胜感激

这是我的 SEARCH 例程实现:

@Search:Push   EDI     ; Save EDI register

        Mov    EDI,ESI ; ScaS uses the EDI register
        Mov    EBX,ECX ; Save ECX register into output register

        ClD            ; Clear string direction flag

        Cmp    ECX,1   ; Prevent ECX=0 case
        RepNE  ScaSB   ; Search AL for ECX Byte in [EDI]
        CMovNE ECX,EBX ; If not found AL, set ECX to his old value
        Sub    EBX,ECX ; Process AL position; EBX=0 if AL not found

        Pop    EDI     ; Restore EDI register

        Ret            ; Return from subroutine

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM