张狂的暑假学习之 汇编入门学习笔记 (六)—— si、di,两层循环
参阅: 《汇编语言》 王爽 第7章
1. and和or指令,与[bx+idata]
and和or,就不多说了。
[bx+idata] 这样写是能够的,某些状况下,比较便利。
[bx+idata] 也能够写成 idata[bx]
直接见比如: 把’ABcde‘ 跟 ‘fGHig’ 都改成大写(ASCII中大写字母与小写字母二进制中,只要第五位不同,大写字母是0,小写字母是1)
- assumecs:code,ds:data
- datasegment
- dbABcde
- dbfGHIg
- dataends
- codesegment
- start:movax,data
- movds,ax
- movbx,0
- movcx,4
- moval,00100000b
- s:or[bx],al
- or[5+bx],al;[5+bx]也能够写成5[bx]
- incbx
- loops
- movax,4c00H
- int21H
- codeends
- endstart
2. si,di,与[bx+si],[bx+di],[bx+si+idata],[bx+di+idata]
si与di,除了不能像bx相同分红bh,bl,其他与bx相同。如 mov ax,[si] 等等
[bx+si],[bx+di],[bx+si+idata],[bx+idata]
这些都是能够的,某些状况下,比较便利。
其间[bx+si]与[bx+di] 能够写成 [bx][si],[bx][di]
[bx+si+idata],[bx+di+idata]能够写成idata[bx][si],idata[bx][di]
比如:仿制Welcome!
- assumecs:code,ds:data
- datasegment
- dbWelcome!
- dataends
- codesegment
- start:movax,data
- movds,ax
- movsi,0
- movcx,4
- s:movax,[si]
- mov8[si],ax
- addsi,2
- loops
- movax,4c00H
- int21H
- codeends
- endstart
比如:将data中的单词的首字母改成大写
- assumecs:code,ds:data
- datasegment
- db1.file
- db2.edit
- db3.search
- db4.view
- dataends
- codesegment
- start:movax,data
- movds,ax
- movbx,0
- movcx,4
- moval,11011111b
- s:and[bx+2],al
- addbx,8
- loops
- movax,4c00H
- int21H
- codeends
- endstart
3. 两层循环
比如:data中单词改成大写的
- assumecs:code,ds:data
- datasegment
- dbibm
- dbdec
- dbdos
- dbvax
- dataends
- codesegment
- start:movax,data
- movds,ax
- movbx,0
- moval,11011111b
- movcx,4
- s:movcx,3
- movsi,0
- s0:and[bx+si],al
- incsi
- loops0
- addbx,8
- loops
- movax,4c00H
- int21H
- codeends
- endstart
上面 的代码,是过错的会出现是死循环。由于cx不断的被赋予3,导致外层循环死循环。
- assumecs:code,ds:data
- datasegment
- dbibm
- dbdec
- dbdos
- dbvax
- dataends
- codesegment
- start:movax,data
- movds,ax
- movbx,0
- moval,11011111b
- movcx,4
- s:movdx,cx;dx用来暂时寄存外层的cx的值
- movcx,3
- movsi,0
- s0:and[bx+si],al
- incsi
- loops0
- movcx,dx;用来回复外层循环的cx
- addbx,8
- loops
- movax,4c00H
- int21H
- codeends
- endstart
上面的代码,虽然能处理上面问题,能正常运转。可是寄存器的数量有限,有时,或许没有其他的寄存器能够用。
处理方法,保存在内存中。比如:
- assumecs:code,ds:data
- datasegment
- dbibm
- dbdec
- dbdos
- dbvax
- dw0;界说一个字,用来保存cx
- dataends
- codesegment
- start:movax,data
- movds,ax
- movbx,0
- moval,11011111b
- movcx,4
- s:movds:[20H],cx
- movcx,3
- movsi,0
- s0:and[bx+si],al
- incsi
- loops0
- movcx,ds:[20H]
- addbx,8
- loops
- movax,4c00H
- int21H
- codeends
- endstart
上面的代码,处理了寄存器不行的状况。可是,仍是比较复杂,如果有许多循环,就会弄不清楚。
处理方法,运用栈来保存康复cx。比如1:
- assumecs:code,ds:data,ss:stack
- datasegment
- dbibm
- dbdec
- dbdos
- dbvax
- dataends
- stacksegment
- dw0,0,0,0,0,0,0,0
- stackends
- codesegment
- start:movax,data
- movds,ax
- movax,stack
- movss,ax
- movsp,16
- movbx,0
- moval,11011111b
- movcx,4
- s:pushcx
- movcx,3
- movsi,0
- s0:and[bx+si],al
- incsi
- loops0
- popcx
- addbx,8
- loops
- movax,4c00H
- int21H
- codeends
- endstart
比如2:把data中的单词,前3个字母改成大写
- assumecs:code,ds:data,ss:stack
- datasegment
- db1.display…….
- db2.brows………
- db3.replace…….
- db4.modify……..
- dataends
- stacksegment
- dw0,0,0,0,0,0,0,0
- stackends
- codesegment
- start:movax,data
- movds,ax
- movax,stack
- movss,ax
- movsp,16
- movbx,0
- moval,11011111b
- movcx,4
- s:pushcx
- movsi,0
- movcx,3
- s0:and[bx+si+2],al
- incsi
- loops0
- popcx
- addbx,10H
- loops
- movax,4c00H
- int21H
- codeends
- endstart