|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
实验9
编程:再屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串“welcome to masm!”
完成代码后运行程序成功了,随网上查看标准答案,结果发现别人代码都比我的长,研究后发现:
(1)别人的答案是利用双循环,和栈。1.外循环3次,增加字符属性,复写3行;2.内循环16次把“welcome to masm!”和颜色属性写入显示缓冲区。看得出来这是标准的录表格的方法。列循环套行循环。
(2)因为我从来没有接触过编程,没考虑那么复杂,于是一次写一列3个字符,循环16次。
(3)显然,别人的答案更精妙,如果写的不是3行,而是4行,5行。别人的可以直接把CX=3改为4、5.....开头数据段加入颜色代码就行了。而我就必须增加一行代码用来定位。
(4)所以产生两个疑问。我这样不标准但是勉强完成了任务的答案算不算正确?一个程序的代码应该追求简洁、还是精巧易更改?
***************************************我的代码****************************************
assume cs:codesg,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,0B864h ;定位缓冲区第11行(起始为01行)
mov ss,ax
mov bp,0 ;定位缓冲区偏移地址
mov bx,0 ;定位数据区偏移地址
mov cx,16 ;定义循环
s: mov al,[bx] ;(al)=字符
mov ah,ds:[16] ;(ah)=属性
mov [bp+64],ax ;(ax)=【属性,字符】,送入缓冲区
mov ah,ds:[17] ;(ax)=属性
mov [bp+64+160],ax ;(ax)=【属性,字符】,送入缓冲区
mov ah,ds:[18] ;(ax)=属性
mov [bp+64+320],ax ;(ax)=【属性,字符】,送入缓冲区
add bx,1 ;数据区偏移地址+1
add bp,2 ;缓冲区偏移地址+2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
***************************************我的代码****************************************
***************************************别人的标准代码****************************************
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,data
mov es,ax ; es指向数据段
mov ax,0B800h
mov ds,ax ;ds指向显示的部分
mov bx,0 ;显示偏移 三次每次增加10h
mov si,10h ;颜色的偏移量,三次循环每次增加1h
mov cx,3
s0: ;三行循环
mov ah,es:[si] ;保存字符的颜色 一个字节
push cx
push si
mov cx,16 ;十六次循环
mov si,0 ;si显示区域每次的偏移 每次加2
mov di,0 ;di字符读取时候每次的偏移 每次加1
s1: ;每一行 先放一个ascii再放属性,放16次
mov al,es:[di] ;字符放在al里;mov ds:[bx+si],al ;低字节放字符
mov ds:[bx+si],ax ;mov ds:[bx+si+1],ah ;高位字节存放颜色
add si,2
add di,1
loop s1
pop si
pop cx
add si,1h ;偏移量为1指向下一个字节
add bx,0a0h ;每行160个字符
add dx,1h
loop s0
all:
jmp short all ;一直循环
mov ax,4c00h
int 21h
code ends
end start
***************************************别人的标准代码**************************************** |
|