;程序名:T6-14.asm
;功能:截取字符串某子串
;入口参数:(1)es:di指向字符串首地址
; (2)ah为截取子串的开始相对地址,al为子串长度
;出口参数:子串存放开始地址为es:di
;说明:(1)如果子串截取开始地址超过原字符串则出错,不执行
; (2)字符串以0结束,子串也以此结束
dbcut proc near
jmp dbcut_begin
dbcut_stor db 256 dup (?) ;出口参数存放缓冲区
dbcut_begin:
push ds
push si
push bx
push cx
push ax
push di
xor al,al
mov cx,0ffffh
repnz scasb
pop di
not cx ;测字符串长度(包括结束符0)
dec cx
mov bx,cx ;保存字符串长度
pop ax
push ax
mov al,ah
xor ah,ah
cmp ax,cx
jae dbcut_end ;检测截取开始地址是否超过字符串长度
add di,ax
pop ax
push ax
xor ah,ah
cmp ax,bx
jae dbcut_do ;检测截取长度是否超过原字符串剩余长度
mov cx,ax
pop ax
jmp dbcut_do2
dbcut_do:
pop ax
mov al,ah
xor ah,ah
sub bx,ax
mov cx,bx
dbcut_do2:
mov ax,es
mov ds,ax
mov si,di ;ds:si指向字符串截取开始地址
mov ax,seg dbcut_stor
mov es,ax
mov di,offset dbcut_stor
push di
rep movsb
mov byte ptr es:[di],0 ;结束符补上
pop di
jmp dbcut_end1
dbcut_end:
pop ax
dbcut_end1:
pop cx
pop bx
pop si
pop ds
ret
dbcut endp
- [e56004474] mark 07/25 14:36
- [heliang6291] 其他寄存器关注了,就是没关注堆栈.....吸取教训了 07/04 17:40
- [chinatree] 你debug不看寄存器吗?自己写的程序,运行到哪一步,每个寄存器的值都应该在心中有数。 07/04 17:32
- [heliang6291] 上述问题自己解决了,是push 和 pop 没有及时对应导致的,也印证 chinatree的观点是很 07/04 17:02
- [heliang6291] 可能是与栈段有关,我这次设置了1000个字节的栈段空间,居然创建成功100个文件了. 可是,我这里 07/04 16:50
- [heliang6291] 我设置了100个字节的栈段,也出现了这个错误,郁闷,不知道问题出在哪里了,chinatree帮我想想 07/04 16:43
- [heliang6291] 那我是否需要设置一个栈段来解决这个问题呢? 07/04 16:39
- [chinatree] 实验了下,如果创建的目录没有C:\这3个字符就会成功。有的话Ax=5。 虽然提示写入失败,不过估计 07/04 14:42
- [游客] 晚上嘛,现在没法试的。 07/03 14:41
- [heliang6291] 没人知道吗? 07/03 13:20
- [heliang6291] 是啊,我看看要用软驱,我没软驱,所以就不做了。。。。 而且对于学习杨季文的没影响了 王爽的那些, 06/20 14:17
- [fpamc] 咦?这位同学的实验17和课设2呢??怎么没有做?就杨季文啦? 06/19 09:46