. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我的实验10-1,请指正  [已解决] 回复[ 3次 ]   点击[ 400次 ]  
yo_007
[帖 主]   [ 发表时间:2009-11-02 13:10 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2009-10-29 10:41
assume cs:code
data segment
     db 'welcome to masm!',0
data ends
code segment
     start: mov dh,11;显示的内容所在行
              mov dl,39;显示的内容所在列
              mov cl,24;显示的内容的格式
              mov ax,data 
              mov ds,ax
              mov si,0
              call show_str;调用现实内容的子程序

              mov ax,4c00h
              int 21h
      show_str: push dx;把dx,si,cx存入栈中
                       push si
                       push cx

                       mov di,0
                       mov ah,0
                       mov al,0ah;把行之间的长度赋予al
                       mul dh;计算行的偏移位移
                       add ax,0b800h;计算行的实际段地址
                       mov es,ax
                       mov ah,0
                       mov al,2h;把列之间的长度赋予al
                       mul dl;计算列的实际偏移地址
                       mov di,ax
                       mov ah,cl;把cl的值赋予ah,cl的值表示字符的格式
                       show: mov ch,0
                                 mov cl,[si];判断要显示的内容是否结束
                                 jcxz ok;结束则不再执行下列代码
                                 mov al,[si]
                                 mov es:[di],ax;在显存缓冲区写入要显示的字符
                                 inc si
                                 add di,2h
                                 jmp short show
          ok: pop cx
                pop si
                pop dx
                ret

code ends

end start
mess
[第1楼]   [ 回复时间:2009-11-04 11:25 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
经测试0行0列,25行1列,1行79列程序显示正常。


                       mov di,0 
-----------------------------------
下面最近一次使用di是mov di,ax,所以这句可以省略。

                       mov ah,0 
--------------------------------
这句也是一养,下面用的是8位乘法,结果存在ax中,这句也可以省略。

                       mov al,0ah;把行之间的长度赋予al 
                       mul dh;计算行的偏移位移 
                       add ax,0b800h;计算行的实际段地址 
                       mov es,ax 
---------------------
这样也算比较巧妙,把160转换成十六进制a0H,把aH加到段地址上面。猛一看“把行之间的长度赋予al”我还觉得慢糊涂的呢 呵呵
yo_007
[第2楼]   [ 回复时间:2009-11-04 13:45 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2009-10-29 10:41
谢谢mess的评论
yo_007
[第3楼]   [ 回复时间:2009-11-09 10:48 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2009-10-29 10:41
此贴由 贴主 于 [ 2009-11-09 10:48 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved