鱼C论坛

 找回密码
 立即注册
查看: 2983|回复: 2

问题7.9的疑问

[复制链接]
回帖奖励 4 鱼币 回复本帖可获得 2 鱼币奖励! 每人限 1 次(中奖概率 50%)
发表于 2011-7-10 19:38:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
   对于问题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, [bx+si]
           and al,11011111B
           mov [bx],al
           inc si
     loop s
   
       pop cx
       add bx,16
  loop bigs
codesg ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 02:59:43 | 显示全部楼层

回帖奖励 +2 鱼币

还有sp没设定,还应该在mov ss,ax 后面加上mov sp,10h.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表