鱼C论坛

 找回密码
 立即注册
查看: 1745|回复: 0

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

[复制链接]
发表于 2012-7-9 12:42:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 紫冥 于 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,[si] ;将字符的ASCII码放入ax
mov es:64[bx][di],ax ;再通过ax传递给奇数列,64即为第33行的开始单元,33*2-2=64(是10进制)
mov es:64[bx+0A0H][di],ax ;同行异列内容相同再复制一次
mov es:64[bx+140H][di],ax ;同行异列内容相同再复制一次,可以用循环但是不容易让人看懂
mov byte ptr es:64[bx][di+1],02H ;将字的属性传递给偶数列
mov byte ptr es:64[bx+0A0H][di+1],24H ;同行异列内容相同再复制一次
mov byte ptr es:64[bx+140H][di+1],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[si] ;把颜色属性值放进AH寄存器中
inc si ;索引颜色属性的偏移地址自增1
xor bx,bx ;清空BX寄存器中的值,用于索引定义的字符串的Ascii码在内存中的偏移地址
mov cx,10h ;循环16次,依次把定义好的字符串的Ascii码写入显存
s: mov al,[bx] ;把定义的字符串的Ascii码依次放入AL寄存器中
mov es:[di],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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 09:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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