问题7.9的疑问
对于问题7.9,我写了以下代码,但是运行后好像不成功,请帮我看看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
mov cx,4
s:mov al,
and al,11011111B
mov ,al
inc si
loop s
pop cx
add bx,16
loop bigs
codesg ends
end start
首先,你的代码有几个问题:
一、数据段中每行不是16个字节
二、内循环的时候,你给CX的值为4,但是里面最长长度的字符串有7个,所以要设置为7
三、在修改大小写结束后,你直接写成:mov ,al ,偏移的值就被你丢掉了,所以一直修改的ds:
四、没有返回,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,;将内存中的数据付给al
and al,11011111B;通过位操作,进行大小写转换
mov ,al;将转换后的字符传递到原地址
inc si ;增加偏移值
loop s ;循环内循环
pop cx ;将外循环的值放入cx
add bx,16 ;基址增加16,到下一行
loop bigs ;外循环
mov ax,4c00h
int 21h
codesg ends
end start 还有sp没设定,还应该在mov ss,ax 后面加上mov sp,10h.
页:
[1]