. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  刚刚完成9章的彩色字显示作业,也帖上来大家讨论(带注释)  [已解决] 回复[ 2次 ]   点击[ 591次 ]  
rotapple
[帖 主]   [ 发表时间:2011-06-08 17:07 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
因为是自动算的行列偏移,所以相对来说修改也比较容易吧。
用的双循环,以下是程序:

assume cs:code,ds:data,ss:stack

data segment
        db 'welcome to masm!'
        db 00000010b, 00100100b, 01110001b
data ends

stack segment stack                ;消除MASM编译时的警告
        db 16 dup(0)
stack ends

code segment

start:        mov ax,data                ;初始化
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,10h

        mov ax,0b800h                ;基地址
        mov es,ax

        mov ax,160                ;80字符每屏
        sub ax,32                ;输出字符串长度16
        mov dl,2
        div dl                        ;(80-16)/2
        mov ah,0                ;取整
        push ax

        mov bx,ax                ;相对于基地址的偏移存入bx

        mov ax,25                ;25行每屏
        sub ax,3                ;共3行
        mov dl,2
        div dl                        ;(25-3)/2
        mov ah,0                ;取整
        
        mov cx,ax
cpos:        add bx,0a0h                ;增加al行的偏移至bx中:行&列居中位置,0a0h为一行的偏移量
        loop cpos

        mov cx,3                ;循环
        mov di,0                ;di:颜色索引

lp0:        push bx                        ;记录起始偏移位置
        push cx                        ;记录主循环

        mov cx,16                ;次循环
        mov si,0                ;si:字符索引
        
lp1:        mov al,[si]                ;取得字符
        mov ah,10h[di]                ;取得颜色
        mov es:[bx],ax                ;写入

        inc si                        ;下一字符
        add bx,2                ;下一地址

        loop lp1

        pop cx                        ;恢复主循环次数
        pop bx                        ;恢复为当前行偏移
        add bx,0a0h                ;增加为下一行偏移
        inc di                        ;下一颜色
        
        loop lp0

        mov ax,4c00h
        int 21h

code ends

end start
rotapple
[第1楼]   [ 回复时间:2011-06-08 17:13 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
22行(不包含空白行)的push ax 是多余的,sorry忘了删掉了。
rotapple
[第2楼]   [ 回复时间:2011-06-16 15:24 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
此贴由 贴主 于 [ 2011-06-16 15:24 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved