字符串搜索,x86汇编

时间:2016-10-31 02:25:41

标签: string assembly x86

我在装配课上遇到某些家庭作业问题。我看过的那本书和教程并没有帮我搞清楚,所以我以为我会来这里。这是作业。

  

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

     

子程序必须被称为搜索,并且字符串在中传递   ESI注册。要搜索的字符应放在AL中   寄存器和字符串的长度在ECX寄存器中。

     

子程序应该返回EBX中字符的位置   register,第一个字符为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寄存器?我以为那个是专门针对内存位置的。这是我必须编写的第一个涉及字符串操作的代码,它只是飞过我的脑海。任何和所有的帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

这是我的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