joker11111 发表于 2016-9-5 14:47:39

实验9易错点分析

本帖最后由 joker11111 于 2016-9-5 15:01 编辑

今天在做实验9,觉得题并不难,其中思路还是比较多,容易混,现在详细分析如下:

1.mov ds:,al和mov ds:,ah的有区别么

最开始我以为:mov ds:,al是将al中的内容放在ds:的低位,mov ds:,ah是将ah中的内容放在ah的高位,所以我在实验9循环是这么写的:

s:                mov al,ds:
                mov es:,al
                mov es:,al
                mov es:,al
                mov ah,00000010b                ;设置黑底绿色属性
                mov es:,ah
                mov ah,00100100b                ;设置绿底红色属性
                mov es:,ah
                mov ah,01110001b                ;设置白底蓝色属性
                mov es:,ah
                inc bx
                add si,2
                loop s

结果很是悲催,调试后一点内容都没有显示,晕菜,单步运行后发现,mov ds:,al和mov ds:,ah的是没有区别的,都是把al或者ah中的内容放在ds:的低8位,也就是说,我上面的循环实际上自己覆盖了自己,当然没有什么效果。

2.循环的第一种方式

这个循环是将data:(两个字节,也就是'we')的内容通过ax先赋给es:(两个字节'we'),然后设置al为显示模式,再把al赋给es:的低位,覆盖了es:的高位(内容为:'e'),以此为循环,代码如下:

;实现功能:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串
;'welcome to masm!'
;*****joker*****
assume cs:code,ds:data
data segment
        db 'welcome to masm!'
data ends

table segment
        db 4000 dup(0)
table ends

code segment
start:        mov ax,data
                mov ds,ax
               
                mov ax,0b800h
                mov es,ax
               
                mov ax,table
                mov ss,ax
               
                mov bx,0
                mov si,0
               
                mov cx,0fa0h
s0:                mov al,ss:
                mov es:,al
                inc bx
                loop s0                ;s0用来清屏
               
                mov bx,0
                mov si,0
                mov cx,16
s:                mov ax,ds:
                mov es:,ax
                mov es:,ax
                mov es:,ax
                mov al,00000010b                ;设置黑底绿色属性
                mov es:,al
                mov al,00100100b                ;设置绿底红色属性
                mov es:,al
                mov al,01110001b                ;设置白底蓝色属性
                mov es:,al
                inc bx
                inc si
                loop s
               
                mov ax,4c00h
                int 21h
code ends

end start


3.循环的第二种方式
这个循环是将data:的低位(一个字节,也就是'w')的内容先赋给al,然后设置ah为显示模式,再把ax赋给es:(两个字节),es:的低位为显示内容,高位为显示模式,以此为循环,代码如下:

;实现功能:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串
;'welcome to masm!'
;*****joker*****
assume cs:code,ds:data
data segment
        db 'welcome to masm!'
data ends

table segment
        db 4000 dup(0)
table ends

code segment
start:        mov ax,data
                mov ds,ax
               
                mov ax,0b800h
                mov es,ax
               
                mov ax,table
                mov ss,ax
               
                mov bx,0
                mov si,0
               
                mov cx,0fa0h
s0:                mov al,ss:
                mov es:,al
                inc bx
                loop s0                ;s0用来清屏
               
                mov bx,0
                mov si,0
                mov cx,16
s:                mov al,ds:
                mov ah,00000010b                ;设置黑底绿色属性
                mov es:,ax
                mov ah,00100100b                ;设置绿底红色属性
                mov es:,ax
                mov ah,01110001b                ;设置白底蓝色属性
                mov es:,ax

                inc bx
                add si,2
                loop s
               
                mov ax,4c00h
                int 21h
code ends

end start
               


4.调试时注意问题
很多童鞋调试还像之前一样,用T指令单步看,结果是一点也没有出现想要的结果,这是由于T指令会覆盖之前修改es:的结果,所以,我们使用g指令,一次执行到文件尾,就可以看到我们想要的效果啦!
最后附一张效果图:
页: [1]
查看完整版本: 实验9易错点分析