紫冥 发表于 2012-7-9 01:51:28

实验九,只要35行代码!有点投机取巧,大家看下是否很讲效率?

assume cs:code,ds:data,ss:stack
        data segment
                db'welcome to masm!'        ;定义要显示的字符串(共16字节)
                db 02h,24h,71h        ;定义颜3种色属性
        data ends
        stack segment
                dw 1 dup(0)         ;定义栈段,用于存放外层循环礐CX的值
        stack ends
        code segment
start:        mov ax,data                ;获取定义好的字符串的Ascii码在内存中的起始段地址
                mov ds,ax
                mov ax,stack        ;获取栈段的起始段
                mov ss,ax
                mov ax,0b872h ;定义要把数据写入显存的起始段地址
                mov es,ax
                xor si,si        ;用做索引颜色属性的偏移地址
                xor di,di        ;用做索引要写入数据的显存的偏移地址
                mov cx,3h        ;循环3次,定义3次颜色属性和3次依次把定义好的字符串的Ascii码写入显存
        s1:        push cx         ;把外层循环次数压进栈,以备等下能恢复,避免内层循环改变外层循环的次数
                mov ah,ds:10h        ;把颜色属性值放进AH寄存器中
                inc si        ;索引颜色属性的偏移地址自增1
                xor bx,bx        ;清空BX寄存器中的值,用于索引定义的字符串的Ascii码在内存中的偏移地址
                mov cx,10h        ;循环16次,依次把定义好的字符串的Ascii码写入显存
        s:        mov al,         ;把定义的字符串的Ascii码依次放入AL寄存器中
                mov es:,ax        ;把AX寄存中的字符Ascii码和颜色属性写进显存中
                inc bx                ;所以定义好的字符串的Ascii码在内存中的偏移地址自增1
                add di,2        ;索引显存的偏移地址增加2
                loop s
                pop cx                ;恢复外层循环的CX循环次数的值
                add di,80h                ;显存中的地址加128个字节,使地址指向第二行需要写入定义好的字符的起始位置
                loop s1
                mov ax,4c00h
                int 21h
        code ends
end start

NeBen 发表于 2012-7-9 08:50:31

用了一些这个实验前没学到的代码,有点不对味道,况且39行是多了,我写的是大概30行 http://bbs.fishc.com/thread-19400-1-1.html
页: [1]
查看完整版本: 实验九,只要35行代码!有点投机取巧,大家看下是否很讲效率?