注册 登录
编程论坛 汇编论坛

一道百思不得其解的问题

hjy88168 发布于 2013-03-02 22:58, 500 次点击
来源 王爽汇编语言第二版 实验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

我感觉没错,调试好几个晚上了,实在不知道为什么达不到效果~~求大神讲解~
3 回复
#2
wp2319572013-03-03 08:30
没有纯dos环境了  没法调试了
#3
神龙赖了2013-03-03 10:18
程序代码:
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

;记得将所有用到的寄存器入栈,不然以后用到这个子程序时你就会成为下一个杯具的.....
#4
笨蛋编程2013-03-05 08:39
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 我感觉没用外
1