鱼C论坛

 找回密码
 立即注册
查看: 3394|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-7-10 23:15:26 | 显示全部楼层

回帖奖励 +2 鱼币

首先,你的代码有几个问题:
一、数据段中每行不是16个字节
二、内循环的时候,你给CX的值为4,但是里面最长长度的字符串有7个,所以要设置为7
三、在修改大小写结束后,你直接写成:mov [bx],al ,偏移的值就被你丢掉了,所以一直修改的ds:[bx]
四、没有返回,mov ax,4c00h int 21h

下面是修改后的代码,请仔细检查
  1. assume cs:codesg, ss:stacksg,ds:datasg

  2. stacksg segment
  3.                 dw 0,0,0,0,0,0,0,0
  4. stacksg ends

  5. datasg segment
  6.                 db'1. display      '
  7.                 db'2. brows        '
  8.                 db'3. replace      '
  9.                 db'4. modify       '
  10. datasg ends
  11.   
  12. codesg segment
  13. start:         mov ax,stacksg   
  14.                 mov ss,ax            ;定义栈段
  15.                 mov ax,datasg
  16.                 mov ds,ax             ;定义数据段
  17.                 mov bx,0              ;定义基址
  18.                 mov cx,4                ;定义循环行数,外循环
  19. bigs:        push cx                        ;将循环行数保存起来
  20.                 mov si,3                ;设置偏移值为3
  21.                 mov cx,7                ;最长字符串为7,所以将循环次数设为7
  22. s:          mov al,[bx+si]  ;将内存中的数据付给al
  23.         and al,11011111B;通过位操作,进行大小写转换
  24.                 mov [bx+si],al  ;将转换后的字符传递到原地址
  25.         inc si          ;增加偏移值
  26.                 loop s          ;循环内循环
  27.        
  28.                 pop cx          ;将外循环的值放入cx
  29.                 add bx,16       ;基址增加16,到下一行
  30.                 loop bigs       ;外循环
  31.                
  32.                 mov ax,4c00h
  33.                 int 21h
  34.   
  35. codesg ends
  36. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-7-12 02:59:43 | 显示全部楼层

回帖奖励 +2 鱼币

还有sp没设定,还应该在mov ss,ax 后面加上mov sp,10h.
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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