鱼C论坛

 找回密码
 立即注册
查看: 2503|回复: 5

实验10.1 显示字符串子程序 错误查找

[复制链接]
发表于 2014-4-11 12:45:39 | 显示全部楼层 |阅读模式
5鱼币
实验10.1 显示字符串子程序     自己写的答案   找了好几遍没找出错误.找不出错误在哪里.不能正常显示.请师兄们帮忙看下哪个环节出错.有注释

assume cs:code
data segment
  db 'welcome to masm!',0
data ends

code segment

start: mov dh,8
       mov dl,3
       mov cl,2                       ;字体颜色
           mov ax,data
           mov ds,ax
           mov si,0                   ;字符串索引
           call show_str
          
           mov ax,4c00h
           int 21H
          
show_str:mov al,160                 ;每一行 160个字节
         mul dh                     ;*8行 计算出行数位置  储存在AX中
                 mov bx,ax                   ;将 行数位置 赋值给 BX
                 mov al,2                   ;第一列 占2个字节
                 mul dl                     ;计算出  首列的位置
                 add bx,ax                ;首行位置加上 首列位置.........计算出首字符的显示位置偏移
                 mov ax,0b800h            ;B800 为显存初始位置
                 mov es,ax                ;显存地址段开始位置        ES:[BX] 为要显示的初始位置
                 
kscopy:  mov ch,[si]               ;  将字符数据赋值给  CH       ,CL 为字体颜色没有改变
         push cx                   ;将CX   字符数据,和字体颜色 压入栈
          mov cl,0                 ;将 CL 赋值为0,CX的数据没有变化 为字符数据

                  jcxz ok             ; 如果 CX的值为0  跳出子程序
                  pop cx              ; CX的值不为0  恢复CX原先的数据  
                  
                  mov es:[bx],ch          ;将 CH的字符数据 赋值给  显示的初始位置  ES:[BX] 低位字节
                  mov es:[bx+1],cl        ;将 CL的字体颜色数据赋值给 ES:[BX+1] 高位字节存放的是字符属性
                  inc si                   ;字符串索引 自增1   字节为1
                  add di,2                 ;显示位置  自增2
                  
                  jmp short kscopy
          
        ok:   ret            
       
code ends
end start         

最佳答案

查看完整内容

我编译没问题啊!不知道你用的是哪个班版本的编译器,我用的是MASM5.0的,之后程序可以运行,但显示不出字符串,我debug之后,单步调试的时候,显示出来了,只不过是单步显示,我想这可能和dos版本或者系统有问题吧!因为我用的是win7系统,你完了之后,用XP系统试一下,或者用dosbox试一下,这都是可以的,以前我在做的时候,就是在XP下的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-11 12:45:40 | 显示全部楼层
QQ截图20140411130942.jpg
QQ截图20140411131622.jpg



我编译没问题啊!不知道你用的是哪个班版本的编译器,我用的是MASM5.0的,之后程序可以运行,但显示不出字符串,我debug之后,单步调试的时候,显示出来了,只不过是单步显示,我想这可能和dos版本或者系统有问题吧!因为我用的是win7系统,你完了之后,用XP系统试一下,或者用dosbox试一下,这都是可以的,以前我在做的时候,就是在XP下的!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-11 13:50:11 | 显示全部楼层
assume cs:code
data segment
  db 'welcome to masm!',0
data ends

code segment

start: mov dh,8
       mov dl,3
       mov cl,2                       ;字体颜色
           mov ax,data
           mov ds,ax
           mov si,0                   ;字符串索引
           call show_str
          
           mov ax,4c00h
           int 21H
          
show_str:mov al,160                 ;每一行 160个字节
         mul dh                     ;*8行 计算出行数位置  储存在AX中
                 mov bx,ax                   ;将 行数位置 赋值给 BX
                 mov al,2                   ;第一列 占2个字节
                 mul dl                     ;计算出  首列的位置
                 add bx,ax                ;首行位置加上 首列位置.........计算出首字符的显示位置偏移
                 mov ax,0b800h            ;B800 为显存初始位置
                 mov es,ax                ;显存地址段开始位置        ES:[BX] 为要显示的初始位置
                 
kscopy:  mov ch,[si]               ;  将字符数据赋值给  CH ,CL 为字体颜色没有改变
         push cx                   ;将CX   字符数据,和字体颜色 压入栈
          mov cl,0                 ;将 CL 赋值为0,CX的数据没有变化 为字符数据
           
                  jcxz ok             ; 如果 CX的值为0  跳出子程序
                  pop cx              ; CX的值不为0  恢复CX原先的数据  
                  
                  mov es:[bx],ch          ;将 CH的字符数据 赋值给  显示的初始位置  ES:[BX] 低位字节
                  mov es:[bx+1],cl        ;将 CL的字体颜色数据赋值给 ES:[BX+1] 高位字节存放的是字符属性
                  inc si                   ;字符串索引 自增1   字节为1
                  add bx,2                 ;显示位置  自增2//原先这里也写错了写成 DI
                  
                  jmp short kscopy
          
        ok:   pop cx                ;当CX 为0时 直接跳转 并没有执行  POP 指令, 此时 栈顶指针指向的是 前面PUSH进去的 CX值,上面没有POP 出来.  造成 RET 返回的数据错误..
                ret               
       
code ends
end start      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-11 13:51:31 | 显示全部楼层
本帖最后由 bahaya 于 2014-4-11 13:55 编辑

问题解决了....MASM版本也是有一个问题.然后代码本身也是有问题.漏了一个POP指令.修改过后能正常显示了...谢谢师兄的指引:big 2.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-11 17:22:53 | 显示全部楼层

呵呵!互相学习嘛!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-12 10:00:43 | 显示全部楼层
“请教,学习”,公开,望指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-30 22:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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