我在装配课上遇到某些家庭作业问题。我看过的那本书和教程并没有帮我搞清楚,所以我以为我会来这里。这是作业。
“编写一个搜索的内联汇编语言程序子程序 字符串中的字符并返回第一次出现的字符 字符串中的字符。
子程序必须被称为搜索,并且字符串在中传递 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寄存器?我以为那个是专门针对内存位置的。这是我必须编写的第一个涉及字符串操作的代码,它只是飞过我的脑海。任何和所有的帮助将不胜感激
答案 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