10.12寄存器的冲突问题
设计一个子程序,功能:将一个全是字母,以0结尾的字符串,转换成大写。注意:我们的目的依然是向想将所有的字母进行大小写的转换,但是不在以字符串的长度作为参数了,我们以是否最后检测到结尾0来作为是否结束字母带小写转换的依据。我们可以用jcxz来检测0。
复习jcxz:jcxz是有条件转移指令,所有由条件的转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都是:-128~127.
指令格式:jcxz标号(如果cx=0,转移到标号处执行。)操作:当(cx)=0时,(IP)=(IP+8)位位移;从jcxz中的功能可以看出,“jcxz 标号”的功能相当于:
if((cx)==0) jmp short 标号
程序:
assume cs:code,ds:data
data segment
db 'word',0
db 'unix',0
db 'wind',0
db 'good',0
data ends
code segment
start :
mov ax,data ;将data的地址转移给ax
mov ds,ax ;将ax转移给ds
mov si,0 ;将0转移给si,指向data的开端地址
mov cx,4 ;将循环的次数定为4
s:
call capital ;push ip 跳转到标识符capital
inc si ;si++
loop s ;循环s,cx--
MOV AX,4C00H
INT 21H
capital:
mov cl,[si] ;将si中的内容传给cx中的低位寄存器cl
mov ch,0 ;将0传给cx中的高位寄存器ch
jcxz ok ;如果cx等于0,就跳转到ok
and byte ptr [si],11011111B ;字母的大小写的转换
inc si ;si++
jmp short capitital ;跳转到capital
ok: ret
CODE ENDS
END start
注意此程序是有一个错误存在的,cx在capital中被修改成了。所以在执行这个程序的时候需要将cx放在栈中保存起来

浙公网安备 33010602011771号