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