![]() | 第5章 子程序和串处理 | -111- | |||||||||||||||||||
return: move_str insert_str insert_loop: quit: insert_s code |
push inc call pop mov mov pop pop ret endp proc push cmp jz mov mov inc inc jmp pop ret endp ends end |
bx bx move_str bx al,byte ptr [bx] byte ptr [bx+8],al ax si near ax byte ptr [bx],0 quit al,byte ptr [bx] byte ptr [di],al bx di insert_loop ax main |
;BX寄存器压入堆栈 ;BX寄存器加1 ;递归调用自身 ;取回BX寄存器 ;取得BX寄存器指向的字符 ;将此字符后移8个字节 ;恢复AX寄存器 ;恢复SI寄存器 ;返回主过程 ;INSERT_STR子过程 ;保存AX寄存器 ;BX寄存器指向子串末尾了吗? ;若BX指向子串末尾则返回主程序 ;取得BX寄存器指向的字符 ;存入DI寄存器指向的位置 ;BX寄存器指向子串中下一个字符 ;DI寄存器指向源串中下一个位置 ;插入下一个字符 ;恢复AX寄存器 ;返回主过程 |
||||||||||||||||||
解决这个问题的一般思路是这样的:首先将插入点后面的字符串向后移动8字节距离,为"SUNSHINE"空出位置,然后将"SUNSHINE"分8个字节移入插入点。程序中的"MOVE_STR"子过程就是用于移动插入点后面的字符串的,在这个子过程中我们特别采用了"递归"算法,图5-4给出的部分堆栈的情况。INSERT_STR子过程用于将子串移动到插入点位置,从而完成了最终的插入工作。 | |||||||||||||||||||||
![]() 图5-4 部分堆栈的情况 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |