鱼C论坛

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

[汇编作业] 实验9 新手菜鸟请教下编程思想。

[复制链接]
发表于 2018-9-6 23:08:18 | 显示全部楼层 |阅读模式

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

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

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
***************************************别人的标准代码****************************************
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 21:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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