箪v箪 发表于 2012-4-29 14:03:29

实验9

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:
                mov ah,ds:10h
                mov es:,ax
                inc si
                add di,2
                loop s1
                incbx
                               
                pop ax
                add ax,0ah
               
                pop cx
                loop s3
               
                mov ax,4c00h
                int 21h
               
code ends
end start
               
把小甲鱼的程序优化了一下,分享分享

小王子之歌 发表于 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
               
                mov cx, 3
        S:                                                                                ;外循环,3次,一次为一行 di
                mov bx, 0                                                        ;字符字节偏移
               
                push cx
               
                mov cx, 16
                s0:                                                                        ;内循环,一次1字节字符(写入显示地址为2字节) bx
                        mov al,                         
                        push bx                                                        ;保存 bx,下面可用2*(bx) 来完成显示地址偏移
                        add bx, bx
                        mov es:,         al
                        mov al,                               16
                        mov es:1,         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同分享,俺独立写的代码,才发现与小甲鱼的,还有网上参考答案出入比较大...但试验了一下,还是可以的...求优化...
页: [1]
查看完整版本: 实验9