目录 上一页 下一页 下一章

第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

目录 上一页 下一页 下一章