鱼C论坛

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

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

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

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

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

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

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

  26. mov ax,4c00h
  27. int 21h
  28. code ends
  29. end start
复制代码

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-28 03:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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