首先,你的代码有几个问题:
一、数据段中每行不是16个字节
二、内循环的时候,你给CX的值为4,但是里面最长长度的字符串有7个,所以要设置为7
三、在修改大小写结束后,你直接写成:mov [bx],al ,偏移的值就被你丢掉了,所以一直修改的ds:[bx]
四、没有返回,mov ax,4c00h int 21h
下面是修改后的代码,请仔细检查assume cs:codesg, ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db'1. display '
db'2. brows '
db'3. replace '
db'4. modify '
datasg ends
codesg segment
start: mov ax,stacksg
mov ss,ax ;定义栈段
mov ax,datasg
mov ds,ax ;定义数据段
mov bx,0 ;定义基址
mov cx,4 ;定义循环行数,外循环
bigs: push cx ;将循环行数保存起来
mov si,3 ;设置偏移值为3
mov cx,7 ;最长字符串为7,所以将循环次数设为7
s: mov al,[bx+si] ;将内存中的数据付给al
and al,11011111B;通过位操作,进行大小写转换
mov [bx+si],al ;将转换后的字符传递到原地址
inc si ;增加偏移值
loop s ;循环内循环
pop cx ;将外循环的值放入cx
add bx,16 ;基址增加16,到下一行
loop bigs ;外循环
mov ax,4c00h
int 21h
codesg ends
end start
|