汇编网首页登录博客注册
rsice的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2008-04-01 23:20] 王爽汇编语言第10章实验10子程序1:显示字符串

图片载入中
;王爽实验10,编写显示字符串子程序
;(dh)=行号,取值范围0~24
;(dl)=列号,取值范围0~79
;(cl)=颜色,ds:si指向字符串的首地址
; 例子:在屏幕第8行,3列,用绿色显示data段中的字符串
assume cs:code,ds:data,ss:stack
data segment
   db 'Welcome to masm!',0
data ends

stack segment
   db 16 dup (0)
stack ends

code segment
start: mov ax,data
     mov ds,ax
     mov ax,stack
     mov ss,ax
     mov sp,16
     mov dh,8
     mov dl,3
     mov cl,2
     mov si,0
     mov ch,0
     push cx
     call show_str
     mov ax,4c00h
     int 21h

show_str:  push bp
           mov bp,sp
           mov ax,0           
           mov al,dh
           mov bl,0ah
           mul bl
           mov bx,0b800h          
           add bx,ax
           mov es,bx              ;定位字符串起始行的位置

             mov ax,0
           mov al,dl
           mov bh,0
           mov bl,2
           mul bl
           mov di,ax        ;定位字串起始列的位置
     
             mov ax,[bp+4]    ;ax放颜色参数
s:    mov cl,ds:[si]   ;以si作为字符串首地址,送入cl
      jcxz over        ;处理完毕就结束子程序,否则处理
       mov es:[di],cl        ;送入目标位置
       mov es:[di+1],al      ;把颜色参数送入
       inc si
      add di,2
      jmp short s
     
over:   pop bp          
        ret 2

code ends
end start

特别要请教大家的是:这个程序可以我用td调试了,如果在call时用不进入子程序,步过,程序没有问题,运行终止,但是如果进入子程序,那么执行到-mov es:[di],cl这一句是,程序终止,真是奇怪,我想在看看内存b850:0006处的内容,说没找到,由此我想可能是td无法读写b850:0006处的内容,请大家帮我!
评论次数(4)  |  浏览次数(684)  |  类型(汇编作业) |  收藏此文  | 

[  xiaochong   发表于  2008-04-02 09:45  ]

不知道博主所说的“td”指的什么?

博主的程序,我已在debug下进行了单步跟踪,没有博主所说的问题。

b850:0006 是显存地址,是可以读写的,在此处还是不明白博主所说的“td无法读写b850:0006处的内容”指的什么意思,请继续说明。

还有一点,博主在写子程序时,应该把除传参数用到的寄存之外的在子程序中使用的寄存器,应该用PUSH保护起来...

[  rsice   发表于  2008-04-02 11:55  ]

谢谢xiaochong的指点!保护寄存器我以后会注意的
td是borland公司出的调试器,turbo debugger,功能比debug强的多。我说“无法读写b850:0006处的内容”是我猜的,因为我在td下无法查看内存b850:0006的内容。我发了文章后,又用debug调试了下,奇怪的是debug倒是可以查看b850:0006的内容,不过好像也不能“善终”而且运行到mov al,dl 这一句就挂了。真是奇怪!

[  rsice   发表于  2008-04-02 12:10  ]

我刚才在另一台电脑上用td调试了一下,完全正常!
我基本上明白原来了:我是用tasm编译的程序,用td调试就没有问题,我原来是用masm编译的程序,用td调试就有问题,毕竟不是一家人啊!

[  crazyman   发表于  2008-04-04 11:08  ]

还有这么一说呢?
期待天下大同,省的这么麻烦了。呵呵

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码