一、预备知识

ps:第九章细碎的知识点还是挺多的,我打算分开整理了,这里就写一些实验用到的知识点

1、数字到字符的转化:

mov dl,1

add dl,48(add dl,30h)

2、颜色

在屏幕上一行中,一个字符占两个字节的存储空间,低位字节存储字符的ASCΙΙ码,高位字节存储字符的属性

一行共有80个字符,占160个字节

 

二、实验任务

1、补全程序t1.asm,完成在屏幕上输出内存单元中的十进制两位数

源代码:

assume cs:code, ds:data

data segment

     db 12

     db 0,0 

data ends

code segment

start:

      mov ax,data

      mov ds,ax      

                     

      mov ah,0

      mov al,ds:[0]  

      mov bl,10

      div bl

      mov ds:[1],al   ;第一个字节存放的是12,对应的是ds:[0],所以商存放在ds:[1]中,余数存放在ds:[2]中

      mov ds:[2],ah   

                     

      mov ah,2

      mov dl,ds:[1]   

      add dl,48      

      int 21h

                 

      mov ah,2

      mov dl,ds:[2]    

      add dl,48           

      int 21h

                 

      mov ax,4c00h

      int 21h

code ends

end start

ps:我知道这个实验很简单,老师上课说5分钟能做出来,但我对这些知识点不是很熟悉,尝试了一下,花了15分钟左右写出来了

ps:不过这个实验对于我来说已经算是简单的了,后面的实验就不是一会儿可以做出来的了

实验结果:

 

2、补全程序t2.asm,完成在屏幕上输出data段定义的5个十进制两位数,数据和数据之间以空格间隔

源代码:

assume cs:code, ds:data

data segment

     db 12,35,96,55,67 

data ends

code segment

start:

      mov ax,data

      mov ds,ax

      mov di,0h

      mov cx,5 

                     

s:    mov ah,0

      mov al,ds:[di]  

      mov bl,10

      div bl

      mov ds:[5],al   

      mov ds:[6],ah   

                     

      mov ah,2

      mov dl,ds:[5]   

      add dl,48      

      int 21h

                 

      mov ah,2

      mov dl,ds:[6]    

      add dl,48             

      int 21h

                 

      mov ah,2

      mov dl,32

      int 21h

              

      inc di

      loop s

                

      mov ax,4c00h

      int 21h

code ends

end start

实验结果:

这是最后出来的结果,但是这个程序感觉也不是那么容易写的,有可能不写程序吧,有思路但是写的程序总是漏东西

下面是我一开始写的程序,漏洞百出

这是刚开始的程序,刚开始我根据任务1改了一下,写出来的这个,然后运行了。。。emmmmmm

出来是这个。。感觉非常夸张。。

我当时所有的注意点都在为什么都是12上,并没有注意循环次数的问题

去检查了一下程序,mov al,ds:[1]和mov ah,ds:[2]这个有问题,原题给的是5个字节数据

所以我把那部分内容改了,应该是ds:[5]和ds:[6],然后我又运行了一下

出来是这个结果,这个时候我才发现我并没有设置循环的次数。。

然后再在程序中加了一个mov cx,5才出来最后的结果

 

3、在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'Welcome to masm!'

源代码:

assume ds:data,cs:code

data segment

      db 'Welcome to masm!'

      db 2H,24H,71H

data ends

code segment

start:     mov ax,data

            mov ds,ax

            mov ax,0b800h

            mov es,ax

            mov bx,0720h;通过老师给的提示当中的表格,大概可以知道中间位置的地址,再调试一下就能试出0720h

            mov si,0

            mov cx,16

s:          mov ax,[si]

            mov ah,2h;绿色字体

            mov es:[bx],ax

            mov ah,24h;绿底红色

            mov es:[bx+160],ax;没有想到好的办法,就直接用这个办法换行了

            mov ah,71h;白底蓝色

            mov es:[bx+320],ax

            inc si

            add bx,2;一个字符占两个字节

            loop s

            mov ax,4c00h

            int 21h

code ends

end start

实验结果:

这个实验利用16次循环分别对每个字符进行不同的染色

ps:关于那个换行,我去看过网上的答案,看不懂为什么那么写,我暂时能想到的就只有我写的那种样子

 

总结:

(1)我觉得想要很好地完成实验必须要对所学的知识很熟悉,半生不熟的状态做实验会很慢,而且很容易做不出来

(2)这次实验包括上次的我都是先把学的东西复习一遍再做,像以前直接做根本就做不了

(3)我最后按照书上的去做了一下闪烁的,很有意思,以后自己写程序输出什么的可以用闪烁,可以根据需要改变字体的颜色

(4)这次实验我是跟着提示写完的,这几个程序我自己确实写不来,跟着提示才能慢慢写出来

(5)这几个实验都用到了loop,没有用跳转指令jmp,我自己对loop还比较熟

(6)我一直不怎么关注debug和汇编源程序数据写法的区别,这次实验里面碰到了

debug默认是十六进制的数,但是汇编源程序默认是十进制的数,所以在写数据的时候需要注意自己要写的到底是十进制的还是十六进制的

posted on 2018-12-09 19:20  樱花飘落の季節  阅读(257)  评论(0编辑  收藏  举报