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放在栈中保存起来
posted @ 2022-08-01 11:19  1337haoker  阅读(101)  评论(0)    收藏  举报