1093196873@qq.c 发表于 2018-9-6 23:08:18

实验9 新手菜鸟请教下编程思想。

实验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,                                          ;(al)=字符
      mov ah,ds:                                       ;(ah)=属性
      mov ,ax                                    ;(ax)=【属性,字符】,送入缓冲区

      mov ah,ds:                                       ;(ax)=属性
      mov ,ax                                    ;(ax)=【属性,字符】,送入缓冲区

      mov ah,ds:                                       ;(ax)=属性
      mov ,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:                                                                                           ;保存字符的颜色 一个字节
push cx      
push si

mov cx,16                                                                  ;十六次循环
mov si,0                                                                     ;si显示区域每次的偏移 每次加2
mov di,0                                                                     ;di字符读取时候每次的偏移 每次加1
s1:                                                                                 ;每一行 先放一个ascii再放属性,放16次
mov al,es:                                                               ;字符放在al里;mov ds:,al                ;低字节放字符
mov ds:,ax ;mov ds:,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
***************************************别人的标准代码****************************************
页: [1]
查看完整版本: 实验9 新手菜鸟请教下编程思想。