|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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指令,一次执行到文件尾,就可以看到我们想要的效果啦!
最后附一张效果图:
|
|