bahaya 发表于 2014-4-11 12:45:39

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

实验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: 为要显示的初始位置
               
kscopy:mov ch,               ;将字符数据赋值给CH       ,CL 为字体颜色没有改变
         push cx                   ;将CX   字符数据,和字体颜色 压入栈
          mov cl,0               ;将 CL 赋值为0,CX的数据没有变化 为字符数据

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

青玄 发表于 2014-4-11 12:45:40






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

bahaya 发表于 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: 为要显示的初始位置
               
kscopy:mov ch,               ;将字符数据赋值给CH ,CL 为字体颜色没有改变
         push cx                   ;将CX   字符数据,和字体颜色 压入栈
          mov cl,0               ;将 CL 赋值为0,CX的数据没有变化 为字符数据
         
                  jcxz ok             ; 如果 CX的值为0跳出子程序
                  pop cx            ; CX的值不为0恢复CX原先的数据
                  
                  mov es:,ch          ;将 CH的字符数据 赋值给显示的初始位置ES: 低位字节
                  mov es:,cl      ;将 CL的字体颜色数据赋值给 ES: 高位字节存放的是字符属性
                  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      

bahaya 发表于 2014-4-11 13:51:31

本帖最后由 bahaya 于 2014-4-11 13:55 编辑

问题解决了....MASM版本也是有一个问题.然后代码本身也是有问题.漏了一个POP指令.修改过后能正常显示了...谢谢师兄的指引:big

青玄 发表于 2014-4-11 17:22:53

bahaya 发表于 2014-4-11 13:51 static/image/common/back.gif
问题解决了....MASM版本也是有一个问题.然后代码本身也是有问题.漏了一个POP指令.修改过后能正常显示了...谢 ...

呵呵!互相学习嘛!

乐子 发表于 2014-4-12 10:00:43

“请教,学习”,公开,望指导
页: [1]
查看完整版本: 实验10.1 显示字符串子程序 错误查找