. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验九——使用行、列两层循环嵌套的程序  [待解决] 回复[ 3次 ]   点击[ 315次 ]  
zoudaokou2006
[帖 主]   [ 发表时间:2011-02-14 09:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07
assume cs:codesg, ss:stacksg, ds:datasg

ATTR_BLUEF                         EQU         00000010B        ;绿色
ATTR_REDF_GREENB                 EQU        00100100B        ;绿底红色
ATTR_BLUEF_WHITEB                EQU        01110001B        ;白底蓝色

datasg segment
        db 'welcome to masm!'
        db ATTR_BLUEF        
        db ATTR_REDF_GREENB
        db ATTR_BLUEF_WHITEB                
datasg ends

stacksg segment 
        dw 0,0,0,0,0,0,0,0
stacksg ends

buff segment
        db 4000 dup (0)
buff ends
        
codesg segment
start:
        mov ax, datasg                        ;用于datasg中数据寻址
        mov es, ax

        mov ax, 0B800H                        ;用于显示缓冲区数据寻址
        mov ds, ax
        
        mov ax, stacksg                        ;创建堆栈
        mov ss, ax
        mov sp, 10h

        mov bx, (11 * 0a0h)                ;缓冲区第12行起始地址

        mov cx, 3                        ;12-14行
        mov bp, 0
line:
        push cx
        mov dl, es:10h[bp]                ;dl保存该行属性

        mov si, 0h
        mov di, 0h        
        mov cx, 10h                        ;33-48列
column:
        mov al, es:0h[di]
        mov [bx][64 + si], al                ;数据
        mov [bx][64 + si + 1], dl        ;属性

        inc di
        add si, 2
        loop column

        add bx, 0a0h                        ;下一行
        inc bp
        pop cx
        loop line

;拷贝出当前25*80缓存,即使刷新界面,仍能检查缓存。
check:
        mov ax, buff
        mov es, ax

        mov ax, 0B800H
        mov ds, ax                

        mov bx, 0
        mov cx, 2000
s:
        mov ax, [bx]
        mov es:[bx], ax

        add bx, 2
        loop s

        mov ax, 4c00h
        int 21h

codesg ends
end        start
zaixuexi
[第1楼]   [ 回复时间:2011-02-14 23:31 ]   [引用]   [回复]   [ top ] 
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28
双缓冲的想法不错,呵呵.
youguiqing
[第2楼]   [ 回复时间:2011-03-08 00:48 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-03 21:13
assume cs:code,ds:data,ss:stack 
data segment
db 'Welcome to masm!'
dw 02h,24h,71h       ;三种颜色的代码
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
           start:mov ax,data    ;设置字符所在为ds段
                  mov ds,ax
                  mov ax,stack    ;设置载空间
                  mov ss,ax
                  mov sp,16
                  mov ax,0b800h   ;设置输出为ES段
                  mov es,ax
                  mov bp,1030 ;bp=80*12行+70=1030差不多在中间了
                  mov si,16   ;设置si为颜色所在内存地址
                  mov cx,3    ;显示3行所以设外层loop为3
            s1:mov di,0
               mov bx,0
               push cx        ;外层loop用来保存cx值          
                  mov cx,16
                s:push [bx]  ;把ds:0中的字显示到屏幕第12行中间
                  pop es:[bp+di] ;这里用di来每显一个字后向2字节
                  push [si]     ;把颜色输入
                  pop es:1[bp+di]
                  inc bx
                  add di,2   ;这里用di来每显一个字后向2字节
                  loop s
                  add si,2   ;换一种颜色
                  add bp,160 ;屏幕显示换一行
                  pop cx    ;取回外层loop的CX值
                  loop s1
                  mov ax,4c00h
                  int 21h
code ends
end start
jackli715239314
[第3楼]   [ 回复时间:2011-09-05 15:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-05 09:58
非常不错的程序!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved