. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验九   这个程序怎么优化  [已解决] 回复[ 10次 ]   点击[ 487次 ]  
12345678911
[帖 主]   [ 发表时间:2012-07-16 16:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-26 20:17
assume cs:code,ds:data,ss:stack    
data segment           
db 'welcome to masm!'  ;定义要显示的字符串(共16字节)          
db 02h,24h,71h         ;定义三种颜色属性  
 data ends      
stack segment           
dw 8 dup(0)   
stack ends    
code segment   
start:   mov ax,data          
         mov ds,ax         
         mov ax,stack          
         mov ss,ax          
         mov sp,10h           
         xor bx,bx           ;bx清零,用来索引颜色          
         mov ax,0b872h       ;算出屏幕第12行中间的显存的段起始位置放入ax中                   
         mov cx,3            ;S3循环控制行数,外循环为3次,因为要显示三个字符串  
 s3:     push cx             ;三个进栈操作为外循环s3保存相关寄存器的值          
         push ax             ;以防止它们的值在内循环中被破坏         
         push bx                    
         mov es,ax           ;此时es为屏幕第12行中间的显存的段起始位置                    
         mov si,0            ;si用来索引代码列的字符         
         mov di,0            ;di用来定位目标列           
         mov cx,10h          ;S1循环控制存放的字符,内循环为10h次,因为一个字符串中含10h个字节  
 s1:     mov al,ds:[si]         
         mov es:[di],al          
         inc si         
         add di,2          
         loop s1                 ;此循环实现偶地址中存放字符                    
         mov di,1                ;di的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备         
         pop bx                            
         mov al,ds:10h[bx]       ;取颜色属性          
         inc bx                              
         mov cx,10h              ;第二个内循环也为10h次  
 s2:     mov es:[di],al          
         add di,2          
         loop s2                 ;此循环实现奇地址中存放字符的颜色属性                    
;以下4句为下一趟外循环做准备          
        pop ax          
       add ax,0ah              ;将显存的段起始地址设为当前行的下一行                                  
                               ;[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]          
       pop cx         
       loop s3                     
       mov ax,4c00h         
       int 21h   
code ends  
 end start
fpamc
[第1楼]   [ 回复时间:2012-07-17 08:11 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
assume cs:code,ds:data,ss:stack     

data segment            
db 'welcome to masm!'  ;定义要显示的字符串(共16字节)           
db 02h,24h,71h         ;定义三种颜色属性   
 data ends       

stack segment            
dw 8 dup(0)    
stack ends     

code segment    

start :mov si,data
          mov ds,si
          xor si,si
 
          mov di,0b800h
          mov es,di
          mov di,720h

          mov sp,stack
          mov ss,sp
          mov sp,16

          mov bx,16
          mov cx,3

ok1   :push cx
          mov cx,16
          mov ah,[bx]

ok2   :mov al,[si]
          mov es:[di],ax
          inc si
          add di,2
          loop ok2

          inc bx
          xor si,si
          add di,144
          pop cx
          loop ok1

          mov ax,4c00h          
          int 21h    
code ends   
end start
fpamc
[第2楼]   [ 回复时间:2012-07-17 08:12 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
没验证哈。。。
12345678911
[第3楼]   [ 回复时间:2012-07-17 16:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-26 20:17
assume cs:code,ds:data,ss:stack      

data segment             
db 'welcome to masm!'  ;定义要显示的字符串(共16字节)            
db 02h,24h,71h         ;定义三种颜色属性    
 data ends        

stack segment             
dw 8 dup(0)     
stack ends      

code segment     

start :mov si,data 
          mov ds,si 
          xor si,si 
  
          mov di,0b800h 
          mov es,di 
          mov di,720h 

          mov sp,stack 
          mov ss,sp 
          mov sp,16 

          mov bx,16  ;为什么给bx值16
          mov cx,3 

ok1   :push cx 
          mov cx,16 
          mov ah,[bx] 

ok2   :mov al,[si] 
          mov es:[di],ax 
          inc si 
          add di,2 
          loop ok2 

          inc bx 
          xor si,si ;为什么要清0
          add di,144 
          pop cx 
          loop ok1 

          mov ax,4c00h           
          int 21h     
code ends    
end start
fpamc
[第4楼]   [ 回复时间:2012-07-18 08:04 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
你编译一下。然后运行一下就知道了*^_^*
fpamc
[第5楼]   [ 回复时间:2012-07-18 08:05 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
bx为16是为了取色值哇。
12345678911
[第6楼]   [ 回复时间:2012-07-19 14:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-26 20:17
welcome to masm!
         welcome to masm!
                 welcome to masm!
我编译了成这样
但是把add di,144改为add di,128就好了
为什么
fpamc
[第7楼]   [ 回复时间:2012-07-19 16:22 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
因为我算错了,^o^
12345678911
[第8楼]   [ 回复时间:2012-07-20 05:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-26 20:17
那为什么是128呢
我一直认为是160
fpamc
[第9楼]   [ 回复时间:2012-07-21 01:01 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
每次小循环后。
di的值都是那16个字(字符+字符属性)后的位置。

如果,直接加上160。会指向下一行的16个字后边。

如果想指向16个字的下一行的正确位置'就要减去这16个字的长度,也就是32字节。
也就是160 - 32 =128
12345678911
[第10楼]   [ 回复时间:2012-08-19 17:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-26 20:17
此贴由 贴主 于 [ 2012-08-19 17:24 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved