|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
|
|