鱼C论坛

 找回密码
 立即注册
查看: 2078|回复: 1

[技术交流] 实验9

[复制链接]
发表于 2012-4-29 14:03:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 21h,26h,74h
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
               
                xor bx,bx          ;bx清0,用来索引颜色
                mov ax,0b872h      ;屏幕中间现存的段地址,
               
                mov cx,3           ;外循环3次
        s3: push cx            ;三个入栈保存外循环相关寄存器的值
                push ax            ;以防止在内循环中他们的值被改变
                ;push bx
               
                mov es,ax         
                mov si,0           ;索引源数据,字符welcome to masm
                mov di,0           ;定位目标地址
                mov cx,16          ;内循环16次
        s1: mov al,ds:[si]
                mov ah,ds:10h[bx]
                mov es:[di],ax
                inc si
                add di,2
                loop s1
                inc  bx
                               
                pop ax
                add ax,0ah
               
                pop cx
                loop s3
               
                mov ax,4c00h
                int 21h
               
code ends
end start
               
把小甲鱼的程序优化了一下,分享分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-3 17:11:15 | 显示全部楼层
;=============================================================
;     实验九: 在屏幕中间显示3行不同前景,背景色的字符

;=============================================================

assume cs:codesg, ds:datasg, ss:stacksg

datasg segment
                db 'welcome to masm!'                                ;显示的字符
                db 00000010b, 00100100b, 01110001b  ;颜色属性
datasg ends

stacksg segment
                db 8 dup(0)
stacksg ends

codesg segment

start:
                mov ax, stacksg
                mov ss, ax
                mov sp, 8
                mov ax, datasg
                mov ds, ax
                mov ax, 0B872H                                                ;显示中间行中间列偏移地址
                mov es, ax
                
                mov di, 0                                                        ;行偏移,每行 +160
                mov si, 0                                                        ;颜色属性字节偏移 ds:16[si]
                
                mov cx, 3
        S:                                                                                ;外循环,3次,一次为一行 di
                mov bx, 0                                                        ;字符字节偏移
                
                push cx
                
                mov cx, 16
                s0:                                                                        ;内循环,一次1字节字符(写入显示地址为2字节) bx
                        mov al,                            [bx]
                        push bx                                                        ;保存 bx,下面可用2*(bx) 来完成显示地址偏移
                        add bx, bx
                        mov es:[bx + di],         al
                        mov al,                                 16[si]
                        mov es:1[bx + di],         al
                        pop bx
                        
                        inc bx
                        
                loop s0
                
                add di, 160
                inc si
                
                pop cx
        
        loop S
                
                mov ax, 4c00H
                int 21H
        
codesg        ends

end start
同分享,俺独立写的代码,才发现与小甲鱼的,还有网上参考答案出入比较大...但试验了一下,还是可以的...求优化...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表