紫冥 发表于 2012-7-9 12:42:35

实验九,这2种写法,那种的效率高点呢?为什么呢?大家来热烈讨论下。

本帖最后由 紫冥 于 2012-7-9 12:45 编辑

代码一:
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0B800H
mov es,ax ;用es储存显示缓冲区的段地址B800
mov cx,16 ;循环16次,按照列循环(共16列)
mov bx,6E0H ;第12行的起始地址,12*160-160=1760=6E0H
mov si,0
mov di,0 ;偏移地址清零,si和di用来定位数据结构中的每一个项目
s:
mov ax, ;将字符的ASCII码放入ax
mov es:64,ax ;再通过ax传递给奇数列,64即为第33行的开始单元,33*2-2=64(是10进制)
mov es:64,ax ;同行异列内容相同再复制一次
mov es:64,ax ;同行异列内容相同再复制一次,可以用循环但是不容易让人看懂
mov byte ptr es:64,02H ;将字的属性传递给偶数列
mov byte ptr es:64,24H ;同行异列内容相同再复制一次
mov byte ptr es:64,71H ;同行异列内容相同再复制一次。内容不同所以不能用循环,这也是为什么不能以行数为循环次数
inc si ;记录复制到的位置,以便下次继续
add di,2 ;记录复制到的位置,以便下次继续
loop s

mov ax,4c00h
int 21h
code ends
end start
代码二:
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
页: [1]
查看完整版本: 实验九,这2种写法,那种的效率高点呢?为什么呢?大家来热烈讨论下。