. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9 三个loop循环减少到一个loop循环完成的演变,新手在此与大家分享一些学习过程  [待解决] 回复[ 2次 ]   点击[ 419次 ]  
ludwj
[帖 主]   [ 发表时间:2014-09-06 23:17 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-01-06 02:34
先写的三个循环的代码
assume cs:code,ds:data

data segment 
db 'welcome to masm!'
data ends

code segment
rk:  mov ax,data
         mov ds,ax
         mov ax,0b872h ;屏幕中间的位置显示
         mov es,ax
         mov bx,0 ;第一行偏移
         mov si,0
         mov cx,10h
s:   mov al,[si] 
     mov ah,8ah ;绿字高亮闪烁
     mov es:[bx],ax
         add bx,2
         inc si
         loop s
         
         mov bx,0a0h ;第二行偏移
         mov si,0
         mov cx,10h
s1:  mov al,[si] 
     mov ah,0ach ;绿底红字高亮闪烁
     mov es:[bx],ax
         add bx,2
         inc si
         loop s1
         
         mov bx,140h ;第三行偏移
         mov si,0
         mov cx,10h
s2:  mov al,[si] 
     mov ah,0f9h ;白底蓝字高亮闪烁
     mov es:[bx],ax
         add bx,2
         inc si
         loop s2
         
         mov ax,4c00h
         int 21h
         
code ends
end rk


精简后用一个循环能完成了
assume cs:code,ds:data

data segment 
db 'welcome to masm!'
data ends

code segment
rk:  mov ax,data
         mov ds,ax
         mov ax,0b872h ;屏幕中间的位置显示
         mov es,ax
         mov bx,0 
         mov si,0
         mov cx,10h
s:   mov al,[si] 
     mov ah,8ah ;绿字高亮闪烁
     mov es:[bx+0],ax ;第一行偏移 0
         
         mov al,[si] 
     mov ah,0ach ;绿底红字高亮闪烁
     mov es:[bx+0a0h],ax ;第二行偏移 0a0h
         
         mov al,[si] 
     mov ah,0f9h ;白底蓝字高亮闪烁
     mov es:[bx+140h],ax ;第三行偏移 140h
         
         add bx,2
         inc si
         loop s
         
         mov ax,4c00h
         int 21h
         
code ends
end rk
gyq
[第1楼]   [ 回复时间:2014-09-07 01:03 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2014-08-02 21:25
不错。
kok1986
[第2楼]   [ 回复时间:2014-09-07 22:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-06-30 13:40
在LZ的基础上,又融合了他人的经验,重新又写了一个,共勉之。(自己写的第一个,用了3次循环,第二个虽然用了1个循环,但比不上LZ的简单.)下面这个其实可以不用栈的。
-----------------------------------------------------
assume cs:code
data segment 
        db 'welcome to masm!' 
        db 0000010B,00100100B,01110001B 
data ends 

stack segment
        dw 0,0,0,0,0,0,0,0
stack ends

code segment                         
start:  mov ax,data                             
        mov ds,ax   
        mov ax,stack
        mov ss,ax
        mov sp,10h
        
        mov ax,0b878h               ;定位到B878是为了显示在屏幕中间 
        mov es,ax                                                 ;用es作为显示屏的内存段地址,bx作为它的偏移地址
        mov bx,0
        mov si,0
        mov bp,0                    ;用bp指向字符数据,di指向色彩模式
        mov di,10h                                           
        
        mov cx,3  
        
s:      push cx                     ;将外层循环cx入栈
        mov cx,10h 
        
s1:     mov al,ds:[bp] 
                  mov ah,ds:[di]
                  mov es:3ch[bx][si],ax                        ;输入该字符的色彩模式
                  
                  add bx,2
        inc bp                                                                                                                                                                  
        loop s1 
                 
        pop cx                                                     ;恢复外层循环的cx
                  mov bx,0                                                        ;修改bx和si换行
                  add si,0a0h
                  mov bp,0        
        inc di                                                          ;输入下个字体颜色                               
        loop s 

        mov ax,4c00h 
        int 21h         
code ends 
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved