. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验十(1)显示字符串  [待解决] 回复[ 7次 ]   点击[ 521次 ]  
tksfbz
[帖 主]   [ 发表时间:2011-05-01 16:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-25 00:20
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 ax,0b800h
         mov es,ax
         mov bl,cl               ;颜色值存到bl寄存器
         mov al,160
         mul dh                  ;定位行
         add dl,dl               ;列
         add al,dl               ;ax=行(ax)+列(dl)
         mov di,ax
      s:mov cl,[si]             ;读入数据段字符
         mov ch,0
         jcxz ok                  ;字符是0就返回   
         mov es:[di],cl        ;写入显示缓冲区
         and es:[di+1],bl    ;设置字符颜色
         inc si
         add di,2
         jmp s
    ok:ret
code ends
end start
gjh123
[第1楼]   [ 回复时间:2011-05-03 15:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-21 15:07
上面那位兄弟   建议你改成s:mov cl,[si]             ;读入数据段字符 
         mov ch,0 
         jcxz ok                  ;字符是0就返回    
         mov es:[di],cl        ;写入显示缓冲区 
         mov es:[di+1],bl    ;设置字符颜色 (这行最好改成这样,只有mov指令才能够显示真正的颜色,可以去试试)
         inc si 
         add di,2 
         jmp s
gjh123
[第2楼]   [ 回复时间:2011-05-03 15:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-21 15:07
add dl,dl               ;列 
         add al,dl               ;ax=行(ax)+列(dl) 
         mov di,ax 
 这个地方不是很懂 请教一下  前面说到是第三列  为什么还有 add dl,dl
shicong
[第3楼]   [ 回复时间:2011-05-12 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-04-09 19:34
错了很多。
我也想问一下这个问题。下面是我的代码,我就不知道为什么不能显示。
assume cs:code

data segment

        db 'Welcome to masm!',0

data ends

code segment
        
        main:        
                mov dh,1                        ;dh装行号(范围:1-25)

                mov dl,1                        ;dl装列号(范围:1-80)[注:每超过80等于行号自动加1]

                mov cl,41h                        ;cl装颜色属性(41h为红底蓝色属性)
                
                mov ax,data

                mov ds,ax

                mov si,0                        ;si装数据段的偏移地址                        

                call show_str

                mov ax,4c00h
                        
                int 21h                                ;程序返回
                
                
        show_str:                                ;打印字符串
                ;计算出要写入的显存初始地址
                mov bx,0b800h

                mov es,bx

                dec dh                                ;行号在显存中是从0开始,所以减1                

                mov al,160                        ;al装乘数

                mul dh                                
                
                mov bx,ax                        ;bx用来存放显存偏移地址

                dec dl                                ;列号在显存中是从0开始,所以减1

                mov al,2
                
                mul dl
                
                sub ax,2                        ;列号在显存中是以下标0开始的,又因为是偶地址存放字符,基地址存放颜色属性,所以减2

                add bx,ax        
                
                mov al,cl                        ;al装颜色属性

                ;将数据段中的字符串输出到显存中 
            for:        
                mov ch,0                        

                mov cl,[si]                

                jcxz return                        ;判断数据段中的数据是否为0,是0则进行跳转

                mov es:[bx],cl                        ;偶地址存放字符

                inc si

                mov es:[bx+1],al                ;基地址存放颜色属性

                add bx,2
                
                jmp short for

         return: 
                ret

code ends

end main
shicong
[第4楼]   [ 回复时间:2011-05-12 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-04-09 19:34
可以加个qq讨论下。
13697471313
[第5楼]   [ 回复时间:2011-05-20 16:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-24 22:44
回复:[第3楼]
------------------
你把行号改成7以上试试
lcfengyun
[第6楼]   [ 回复时间:2011-05-26 09:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-26 08:59
为什么 一定要add dl,dl 这句啊
betterpursuel
[第7楼]   [ 回复时间:2011-05-27 09:56 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2010-11-07 17:01
为什么 一定要add dl,dl 这句啊
答:每个字符占有2列,一个存字符,另一个存颜色值,所以必须加上这句
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved