| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 500 人关注过本帖
标题:一道百思不得其解的问题
只看楼主 加入收藏
hjy88168
Rank: 2
等 级:禁止访问
帖 子:37
专家分:13
注 册:2011-10-13
结帖率:53.85%
收藏
已结贴  问题点数:10 回复次数:3 
一道百思不得其解的问题
来源 王爽汇编语言第二版 实验10的第一个程序
就是利用模块化的思想,将一句话打印到屏幕制定的位置,其中行和列以及颜色都通过调用者传递
其中cl 放颜色 dh放行号 dl放列号



我的代码如下:
assume cs:code,ds:data

data segment

        db 'welcome to masm!',0

data ends

code segment
start: mov dh,8
       mov dl,3
       mov cl,71h
       mov ax,data
       mov ds,ax
       mov si,0
       call show_str

       mov ax,4c00h
       int 21h

show_str:

       push cx

       mov cx,16
       mov ax,0b800h
       mov es,ax

       mov ax,0
       mov al,80
       mul dh
       mov dh,0
       add ax,dx
       mov di,ax
       mov si,0

   s:  mov al,[si]

       mov  ax,cx
       pop cx
       mov ah,cl
       push cx
       mov cx,ax

       mov es:[di],ax

       inc si
       add di,2
       loop s

       pop cx
       ret
code ends

end start

我感觉没错,调试好几个晚上了,实在不知道为什么达不到效果~~求大神讲解~
搜索更多相关主题的帖子: welcome 
2013-03-02 22:58
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
没有纯dos环境了  没法调试了

DO IT YOURSELF !
2013-03-03 08:30
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:5 
程序代码:
assume cs:code,ds:data

data segment

        db 'welcome to masm!',0

data ends

code segment

 start: mov dh,8
        mov dl,3
        mov cl,71h
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str

       mov ax,4c00h
        int 21h

show_str:

       push cx

        mov cx,16
        mov ax,0b800h
        mov es,ax

        mov ax,0
        mov al,80
        mul dh
        mov bx,ax      ;ax需要继续作为因数,故用bx保存
        mov al,2       ;因为0b800中一个字符需要1个字单元(字符值和属性值),所有应乘2才能调到相应的列数
                       ;如果dl为奇数又没有经过以上处理,则对应的是属性地址而不是字符地址,结果可想而知
      
        mov dh,0
      
        mul dl
        add ax,bx
        mov di,ax
        mov si,0
      
        pop cx
        mov ah,cl       ;ah存放属性值,al存放字符值
        push cx
        mov ch,0
      
   s:   mov al,[si]
        mov cl,al
        jcxz ok
        mov es:[di],ax
    
        inc si
        add di,2
        jmp short s
  
   ok:  pop cx
        ret

 code ends

end start

;记得将所有用到的寄存器入栈,不然以后用到这个子程序时你就会成为下一个杯具的.....

I have not failed completely
2013-03-03 10:18
笨蛋编程
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:65
专家分:131
注 册:2011-8-11
收藏
得分:5 
mov al,[si]

        mov  ax,cx    ;cx覆盖了ax cx=16 不知道你覆盖它干什么
        pop cx        ;pop cx=0071h
        mov ah,cl     ;ax=0016 上边覆盖的, ah=cl=71h ax=7116h
        push cx       ;
        mov cx,ax     ;cx=7116h

        mov es:[di],ax es=0b800h di=80*8+3 ax=7116h

最后 去掉mov ax,cx
mov cx,ax 改成 mov cl,al 因为 ah有颜色值 所以mov ax,cx 不可能为零
接着 loop 上边 加个inc cx 因为 loop是先减一 再判断 如果直接cx=0 就死了 cx=1 才跳出循环
cx=16 也不要了 因为没啥用啊 他遇到0 就结束了 不然要0 和mov cx,ax 没用
楼上对了 你地址还少乘个2

楼上 正解 除了 那个 cx=16 我感觉没用外
2013-03-05 08:39
快速回复:一道百思不得其解的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025897 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved