. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  可不可以探讨一下实验10的第一小部分?  [待解决] 回复[ 2次 ]   点击[ 534次 ]  
li4096255
[帖 主]   [ 发表时间:2008-10-30 12:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-17 09:53
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: 
     push dx 
     push bx 
     push cx 
     mov ax,0b800h 
     mov es,ax 
     mov ah,0 
     mov al,0a0h 
     mul dh 
     mov bx,0 
     mov bl,dl 
     add bx,ax 

     do: 
     mov cl,[si] 
     mov ch,0 
     jcxz ok 
     mov es:[bx],cl 
     pop cx 
     inc bx 
     mov es:[bx],cl 
     push cx 
     inc bx 
     inc si 
     jmp short do  

      
     ok: 
     pop cx 
     pop bx 
     pop dx 
     ret 


code ends 
end start 
结果显示如下: 
-u 
0C89:0☻☻☻☻☻☻☻☻☻☻☻☻☻☻☻☻  MOV     DH,08 

哪错了呢? 
code  segment   
 start:mov dh,8  
       mov dl,3  
       mov cl,2  
是这里,因为bx=(0a0*dh+dl)是个奇数,而此时es:[bx]是字符的颜色属性,不是它的ascii码。 
当更改为:mov dl,4后 
运行如下: 
LINK : warning L4021: no stack segment 

C:\DOCUME~1\ADMINI~1>debug 177.exe 
-u 
0CWelcome to masm!  ///这里呢^^    MOV     DH,08 
0C89:0002 B204          MOV     DL,04 
0C89:0004 B102          MOV     CL,02 
0C89:0006 B8870C        MOV     AX,0C87
mess
[第1楼]   [ 回复时间:2008-10-30 17:46 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
当更改为:mov dl,4后
------
看上面的结果显示正常了,不过也可以看到显示字符串的位置是从第三个字符位置开始的(也就是以0编号的2号位置),和原来设定的第4列不一致,变成了第二列。

在屏幕显示的时候,计算机需要两个字节来显示一个字符。楼主在想一下,只要稍微变动一下;)
li4096255
[第2楼]   [ 回复时间:2008-10-30 21:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-17 09:53
哦,也就是说dl 中存的列是以字为单位 的,是我理解错了,明白了。
show_str:  
     push dx  
     push bx  
     push cx  
     mov ax,0b800h  
     mov es,ax  
     mov ah,0  
     mov al,0a0h  
     mul dh  
     mov bx,0  
     mov bl,dl   //这里还要有一个add bl,bl 也就是说dl 要翻倍
     add bx,ax  

也即:es:[0a0*dh+2*dl]为显示的字符初始位置。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved