鱼C论坛

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

[汇编作业] 实验9易错点分析

[复制链接]
发表于 2016-9-5 14:47:39 | 显示全部楼层 |阅读模式

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

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

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

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

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

最开始我以为:mov ds:[0],al是将al中的内容放在ds:[0]的低位,mov ds:[0],ah是将ah中的内容放在ah的高位,所以我在实验9循环是这么写的:
s:                mov al,ds:[bx]
                mov es:[si+720h],al
                mov es:[si+7C0h],al
                mov es:[si+860h],al
                mov ah,00000010b                ;设置黑底绿色属性
                mov es:[si+720h],ah
                mov ah,00100100b                ;设置绿底红色属性
                mov es:[si+7C0h],ah
                mov ah,01110001b                ;设置白底蓝色属性
                mov es:[si+860h],ah
                inc bx
                add si,2
                loop s
结果很是悲催,调试后一点内容都没有显示,晕菜,单步运行后发现,mov ds:[0],al和mov ds:[0],ah的是没有区别的,都是把al或者ah中的内容放在ds:[0]的低8位,也就是说,我上面的循环实际上自己覆盖了自己,当然没有什么效果。

2.循环的第一种方式

这个循环是将data:[0](两个字节,也就是'we')的内容通过ax先赋给es:[0](两个字节'we'),然后设置al为显示模式,再把al赋给es:[1]的低位,覆盖了es:[0]的高位(内容为:'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:[bx]
                mov es:[bx],al
                inc bx
                loop s0                ;s0用来清屏
                
                mov bx,0
                mov si,0
                mov cx,16
s:                mov ax,ds:[bx]
                mov es:[bx+720h][si],ax
                mov es:[bx+7C0h][si],ax
                mov es:[bx+860h][si],ax
                mov al,00000010b                ;设置黑底绿色属性
                mov es:[bx+721h][si],al
                mov al,00100100b                ;设置绿底红色属性
                mov es:[bx+7C1h][si],al
                mov al,01110001b                ;设置白底蓝色属性
                mov es:[bx+861h][si],al
                inc bx
                inc si
                loop s
                
                mov ax,4c00h
                int 21h
code ends

end start

3.循环的第二种方式
这个循环是将data:[0]的低位(一个字节,也就是'w')的内容先赋给al,然后设置ah为显示模式,再把ax赋给es:[0](两个字节),es:[0]的低位为显示内容,高位为显示模式,以此为循环,代码如下:
;实现功能:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串
;'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:[bx]
                mov es:[bx],al
                inc bx
                loop s0                ;s0用来清屏
                
                mov bx,0
                mov si,0
                mov cx,16
s:                mov al,ds:[bx]
                mov ah,00000010b                ;设置黑底绿色属性
                mov es:[si+720h],ax
                mov ah,00100100b                ;设置绿底红色属性
                mov es:[si+7C0h],ax
                mov ah,01110001b                ;设置白底蓝色属性
                mov es:[si+860h],ax

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

end start
                

4.调试时注意问题
很多童鞋调试还像之前一样,用T指令单步看,结果是一点也没有出现想要的结果,这是由于T指令会覆盖之前修改es:[0]的结果,所以,我们使用g指令,一次执行到文件尾,就可以看到我们想要的效果啦!
最后附一张效果图:
实验9.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 16:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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