RT
可以运行的是:
datasegment
bufdb00h,00h,00h,01h,01h,02h,03h,03h,00h,00h;定义内存的内容
;contequ$-buf
contdw10
;有能力的同学可以用buf1试试
buf1db00h,00h,00h,01h,01h,02h,03h,03h,00h,01h,02h,03h,01h,00h,02h;定义内存的内容
cont1equ$-buf1
dataends
stacksegmentstack'stack'
sapdb100dup(0)
topequlengthsap
stackends
maincodesegment
assumecs:maincode,ds:data,ss:stack
start:movax,data
movds,ax
movax,stack
movss,ax
movsp,100
movax,offsetbuf;buf的偏移量进栈
pushax
movax,cont;buf的个数进栈
pushax
movah,0
moval,00h;在调试时,把xx改为buf中的某个数
pushax;要查找的字符进栈
callsubproc;调用你写的子程序,显示xx在buf中的位置,有几个显示几次。
;例如查找00h时,应显示0、1和2,查找01h时,应显示3和4。
movah,4ch
int21h
subprocproc;子程序
;请填入代码
;popcx
;popdi
;popsi
movcl,03h
movsi,offsetbuf
movbp,0
movdi,offsetcont
for:
movdl,[si+bx]
cmpdl,cl
jnznext
movdx,bx
cmpdl,10
jbnum
adddl,7h
num:adddl,30h
movah,2
int21h
next:
incbx
cmpbx,[di]
jzexit
jmpfor
exit:
ret
subprocendp
maincodeends
endstart
但是,将subproc中注释掉的三个pop语句任意取消注释,就会因为堆栈错误使程序从头运行。。。。。
甚至。。。。
只要在subproc中写上
movax,stack
movss,ax
,就算还是把三个pop注释掉,只有这两个赋值操作都会有同样的问题。
呃。不知道我表达清楚了么,求各位解答,谢谢啦
分 -->
|