|
发表于 2011-7-10 23:15:26
|
显示全部楼层
回帖奖励 +2 鱼币
首先,你的代码有几个问题:
一、数据段中每行不是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
复制代码 |
|