目录 上一页 下一页 下一章

-108- PC机汇编语言实战精解


main
code

int
endp
ends
end
21h


main
  这个程序首先在给定字符串中寻找子串的第一个字符,找到后将后面的字符与子串进行比较,若后面的字符均相同则输出首字符的偏移量;否则继续在剩余的字符中寻找。找到第一个子串后程序并未结束,而是继续在源字符串中搜索,直至整个字符串全部搜索完毕。不难看出这个程序的结构不很理想,我们用了许多的转移指令,使程序的流程显得比较混乱。那么用串处理指令能否使程序得以简化呢?请看下面的程序:
SCHSTR1.ASM
data

string
substrg
ascii
data

code

main




next_char:










out_di:



outloop:






segment
assume
db'The sa
db'sunshi
db'012345
ends

segment
assume
proc
mov
mov
mov
mov

cmp
jz
push
mov
mov
repz
pop
jcxz
inc
jmp
mov
sub
mov
mov
rol
rol
rol
rol
push
and
xlat

ds:data
me sunshine is presente
ne'
6789ABCDEF'



cs:code
far
ax,data
ds,ax
es,ax
di,offset string

byte ptr [di],0
exit
di
si,offset substrg
cx,8
cmpsb
di
out_di
di
next_char
ax,di
ax,offset string
bx,offset ascii
cx,4
ax,1
ax,1
ax,1
ax,1
ax
ax,000fh



d to all those who love sunshine',0







;初始化DS、ES寄存器指向数据段


;DI寄存器指向源字符串

;DI寄存器指向源字符串末尾了吗?
;若DI寄存器已指向末尾则结束程序
;暂存DI寄存器
;SI寄存器指向待查字符串
;比较8个字符
;将待查字符串与DI指向的8个字符相比
;恢复DI寄存器
;若8个字符均相同则输出DI寄存器的指针
;DI寄存器指向下一个字符
;转NEXT_CHAR继续比较
;DI寄存器中的指针送入AX寄存器
;计算待查字符串在源串中的偏移位置
;BX寄存器指向ASCII表
;输出4个数位
;AL寄存器循环左移4位
;暂存AX寄存器



;保留AX寄存器的低4位
;取得对应的ASCII码

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章