milorguan 发表于 2011-7-10 19:38:29

问题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

旭日东升 发表于 2011-7-10 23:15:26

首先,你的代码有几个问题:
一、数据段中每行不是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

fishc13708 发表于 2011-7-12 02:59:43

还有sp没设定,还应该在mov ss,ax 后面加上mov sp,10h.
页: [1]
查看完整版本: 问题7.9的疑问