-
-
[原创][成果2.5]查询字符串中与某个字符首个匹配位置&连接字符串&比较两个字符串
-
发表于: 2008-1-23 00:28 9470
-
;============================== ;filename:top2o5a.asm ;date:2008/1/21 ;============================== assume cs:code,ds:data,ss:stack stack segment dw 64 dup(0) stack ends data segment str db 'I Love Masm!',0 m db 'M',0 i db 6 dup('0') data ends code segment start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,128 ;查找在字符串str中的首个与CH字符匹配的位置 lea si,str ;(SI)=str mov ch,ds:[m] ;(CH)=DS:[m] call string_char ;将位置值转换为一个字符串,方便输出 lea si,i ;(SI)=i call dtoc ;在第5行、第1列以白色输出父串 lea si,str mov dh,5 mov dl,1 mov cl,1010b call show_str ;在第6行、第1列以白色输出要匹配的字符 lea si,m mov dh,6 mov dl,1 mov cl,1010b call show_str ;输出结果 lea si,i mov dh,7 mov dl,1 mov cl,1010b call show_str mov ax,4c00h int 21h ;================================================== ;名称:string_char ;功能:在一个串中查找给定字符的第一个匹配的位置 ;参数:(ch)=字符 ; ds:si指向字符串的首地址 ;返回:(ax)=匹配的位置 ; (ax)=0表示未找到匹配位置 ;================================================== string_char proc near push si push di mov di,si ;(DI)=(SI) s2: push cx mov cl,0 ;如果已搜索到字符串末尾,求找到,退出循环 mov ch,ds:[di] jcxz outl pop cx cmp byte ptr ds:[di],ch ;判断当前字符是否为等于要匹配的字符 jz ok2 ;DS:[DI]=(CH),搜索到匹配的字符,退出循环 inc di ;(DI)=(DI)+1指向下一个字符 jmp short s2 outl: mov ax,0 ;(AX)=0未找到,直接返回 pop di pop si ret ok2: sub di,si ;首个匹配的位置值为(DI)=(DI)-(SI)+1 inc di mov ax,di pop di pop si ret string_char endp ;================================================================= ;名称:dtoc ;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符 ;参数:(ax)=word型数据 ; ds:si指向字符串的首地址 ;返回:无 ;================================================================= dtoc proc near push ax push bx push cx push si push di mov di,si mov bx,10 mov cx,0 s: push cx mov cx,ax jcxz enddtoc pop cx mov dx,0 div bx mov ds:[di],dl add byte ptr ds:[di],30h inc di inc cx jmp short s enddtoc: pop cx mov byte ptr ds:[di],0 ;在字符串末尾补0 dec di ;(DI)=(DI)-1指向字符串最后一个字符 mov ax,cx ;(cx)=字符串的长度 mov bl,2 div bl mov cl,al ;(CL)=(AL)=(CX)/2 jcxz r ;如果(CX)=0时,会执行循环一次,然后(CX)=(CX)-1=0-1=FFFFH,发生溢出错误 ;故添加代码(cx)=0时不执行循环跳转指令jcxz r s1: mov al,ds:[di] ;求得余数之后,要将字符串逆序,把余数摆正 mov bl,ds:[si] mov ds:[di],bl mov ds:[si],al inc si ;(SI)=(SI)+1 dec di ;(DI)=(DI)-1 loop s1 r: pop di pop si pop cx pop bx pop ax ret dtoc endp ;=========================================================== ;名称:show_str ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串 ;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79), ; (cl)=颜色,ds:si指向字符串的首地址 ;返回:无 ;=========================================================== show_str proc near push dx push si push di push cx push ax mov ax,0b800h mov es,ax mov ax,160 mul dh mov dh,0 add ax,dx add ax,dx sub ax,2 mov di,ax mov ah,cl output: mov ch,ds:[si] mov cl,0 jcxz ok mov byte ptr es:[di],ch mov byte ptr es:[di+1],ah inc si inc di inc di jmp short output ok: pop ax pop cx pop di pop si pop dx ret show_str endp code ends end start
;============================== ;filename:top2o5b.asm ;date:2008/1/22 ;============================== assume cs:code,ds:data,ss:stack stack segment dw 64 dup(0) stack ends data segment str1 db 'I Love Win32 Assembly Language!',100 dup(0) str2 db 'I Love 80X86 Assembly Language!',0 data ends code segment start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,128 ;将目的串str2连接到源串str1 lea di,str1 ;(DI)=str1 取目的串的偏移地址 lea si,str2 ;(SI)=str2 取源串的偏移地址 call string_cat ;在第10行、第10列输出连接后的字符串 lea si,str1 ;(SI)=str1 字符串首地址 mov dh,10 ;(DH)=10 第10行 mov dl,10 ;(DL)=10 第10列 mov cl,00001010b ;(CL)=10001010B 字符串属性为高亮、绿色 call show_str mov ax,4c00h int 21h ;==================================== ;名称:string_cat ;功能:将源字符串拼接到目的字符串 ;参数:ds:si指向源字符串的首地址 ; ds:di指向目的字符串的首地址 ;返回:无 ;==================================== string_cat proc near ;保护现场 push ax push si push di ;将DI指向目的数组的末尾0 s1: cmp byte ptr ds:[di],0 ;DS:[DI]==0时表示已到字符串末尾 jz s2 inc di ;(DI)=(DI)+1 DI指向下一个字符 jmp short s1 ;将源数组SI连接到目的数组,循环终止条件为SI指向数组末尾0 s2: cmp byte ptr ds:[si],0 ;DS:[SI]==0时表示已将源串的每一个字符连接到目的串 jz ok1 mov al,ds:[si] ;DS:[DI]=DS:[SI] mov ds:[di],al inc si ;(SI)=(SI)+1 SI指向下一个待连接的字符 inc di ;(DI)=(DI)+1 DI指向下一个单元 jmp short s2 ok1: mov byte ptr ds:[di],0 ;在目的串添加终止符0,因为不能保证每次连接字符串后目的串的末尾字符为0 ;恢复现场 pop di pop si pop ax ret string_cat endp ;=========================================================== ;名称:show_str ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串 ;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79), ; (cl)=颜色,ds:si指向字符串的首地址 ;返回:无 ;=========================================================== show_str proc near push dx push si push di push cx push ax mov ax,0b800h mov es,ax mov ax,160 mul dh mov dh,0 add ax,dx add ax,dx sub ax,2 mov di,ax mov ah,cl output: mov ch,ds:[si] mov cl,0 jcxz ok mov byte ptr es:[di],ch mov byte ptr es:[di+1],ah inc si inc di inc di jmp short output ok: pop ax pop cx pop di pop si pop dx ret show_str endp code ends end start
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-1-3 00:24
伟叔叔
为你点赞~
2023-10-6 01:35
一笑人间万事
为你点赞~
2023-7-14 00:30
QinBeast
为你点赞~
2023-7-11 01:15
shinratensei
为你点赞~
2023-6-20 00:43
心游尘世外
为你点赞~
2023-6-10 01:50
飘零丶
为你点赞~
2023-5-31 01:00
赞赏
他的文章
谁下载
bstzxy
kanxue
thk
小虾
Aming
Phoenix
ylp1332
shiny
jfaumt
laomms
Xacs
ysoni
yousihai
metalqiang
yezhichengsqlr
4st0ne
vofcrlfopt
xzchina
145
sdt
baby2008
执着我一生
ww990
yechq
北极星2003
Xfreeboy
零下
whydbg
amdey
qqeleven
沈阳晚枫
ggosgg
qffhq
Intelfan
yjr
lingyu
jxtgzh
xoei
swqswq
Yuzi
renetspy
cirouter
wan
fizly
herrzou
zhangmh
ansi
ninja
cnsworder
Crem
wqrsksk
happyhjl
taomedia
luyiqiang
xicao
Bughoho
info
呵呵哈哈
wping
星辰
小子贼野
sudami
aliwy
cxbxy
ainwx
marscrazy
阳小子
卡秋莎
basherone
WisdomZh
BaseTree
aethercat
gurj
iawen
pengmo
szfile
垃圾一个
cokecat
jokersky
Nukou
紫色的魚
cesuomao
薛凌云xly
combojiang
lovefasm
aben笨
yzengr
独孤剑圣
xingchao
xiejienet
tianxiaw
blueskyes
xutuan
jeckbjy
yAngtAi
黑小杰
webycn
triones
easystone
谁下载
bstzxy
kanxue
thk
小虾
Aming
Phoenix
ylp1332
shiny
jfaumt
laomms
Xacs
ysoni
yousihai
metalqiang
yezhichengsqlr
4st0ne
vofcrlfopt
xzchina
145
sdt
baby2008
执着我一生
ww990
yechq
北极星2003
Xfreeboy
零下
whydbg
amdey
qqeleven
沈阳晚枫
ggosgg
qffhq
Intelfan
yjr
lingyu
jxtgzh
xoei
swqswq
Yuzi
renetspy
cirouter
wan
fizly
herrzou
zhangmh
ansi
ninja
cnsworder
Crem
wqrsksk
happyhjl
taomedia
luyiqiang
xicao
Bughoho
info
呵呵哈哈
wping
星辰
小子贼野
sudami
许胜
aliwy
cxbxy
ainwx
marscrazy
阳小子
卡秋莎
basherone
WisdomZh
BaseTree
aethercat
gurj
iawen
xianboabcd
pengmo
szfile
垃圾一个
cokecat
jokersky
Nukou
紫色的魚
cesuomao
薛凌云xly
combojiang
lovefasm
aben笨
yzengr
独孤剑圣
xingchao
xiejienet
tianxiaw
blueskyes
xutuan
jeckbjy
yAngtAi
黑小杰
webycn
谁下载
bstzxy
kanxue
thk
小虾
Aming
Phoenix
ylp1332
shiny
jfaumt
laomms
Xacs
ysoni
yousihai
metalqiang
yezhichengsqlr
4st0ne
xzchina
145
sdt
baby2008
执着我一生
ww990
yechq
北极星2003
Xfreeboy
零下
whydbg
amdey
qqeleven
沈阳晚枫
ggosgg
qffhq
Intelfan
yjr
lingyu
jxtgzh
xoei
swqswq
Yuzi
renetspy
cirouter
wan
fizly
herrzou
zhangmh
ansi
ninja
cnsworder
Crem
wqrsksk
happyhjl
taomedia
luyiqiang
xicao
Bughoho
info
呵呵哈哈
wping
星辰
小子贼野
sudami
许胜
aliwy
cxbxy
ainwx
marscrazy
阳小子
卡秋莎
basherone
WisdomZh
BaseTree
aethercat
gurj
iawen
xianboabcd
pengmo
szfile
垃圾一个
cokecat
jokersky
Nukou
紫色的魚
cesuomao
薛凌云xly
combojiang
lovefasm
aben笨
yzengr
独孤剑圣
xingchao
xiejienet
tianxiaw
blueskyes
xutuan
jeckbjy
yAngtAi
黑小杰
webycn
triones
看原图
赞赏
雪币:
留言: