鱼C论坛

 找回密码
 立即注册
查看: 2801|回复: 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循环是这么写的:

  1. s:                mov al,ds:[bx]
  2.                 mov es:[si+720h],al
  3.                 mov es:[si+7C0h],al
  4.                 mov es:[si+860h],al
  5.                 mov ah,00000010b                ;设置黑底绿色属性
  6.                 mov es:[si+720h],ah
  7.                 mov ah,00100100b                ;设置绿底红色属性
  8.                 mov es:[si+7C0h],ah
  9.                 mov ah,01110001b                ;设置白底蓝色属性
  10.                 mov es:[si+860h],ah
  11.                 inc bx
  12.                 add si,2
  13.                 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'),以此为循环,代码如下:

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

  8. table segment
  9.         db 4000 dup(0)
  10. table ends

  11. code segment
  12. start:        mov ax,data
  13.                 mov ds,ax
  14.                
  15.                 mov ax,0b800h
  16.                 mov es,ax
  17.                
  18.                 mov ax,table
  19.                 mov ss,ax
  20.                
  21.                 mov bx,0
  22.                 mov si,0
  23.                
  24.                 mov cx,0fa0h
  25. s0:                mov al,ss:[bx]
  26.                 mov es:[bx],al
  27.                 inc bx
  28.                 loop s0                ;s0用来清屏
  29.                
  30.                 mov bx,0
  31.                 mov si,0
  32.                 mov cx,16
  33. s:                mov ax,ds:[bx]
  34.                 mov es:[bx+720h][si],ax
  35.                 mov es:[bx+7C0h][si],ax
  36.                 mov es:[bx+860h][si],ax
  37.                 mov al,00000010b                ;设置黑底绿色属性
  38.                 mov es:[bx+721h][si],al
  39.                 mov al,00100100b                ;设置绿底红色属性
  40.                 mov es:[bx+7C1h][si],al
  41.                 mov al,01110001b                ;设置白底蓝色属性
  42.                 mov es:[bx+861h][si],al
  43.                 inc bx
  44.                 inc si
  45.                 loop s
  46.                
  47.                 mov ax,4c00h
  48.                 int 21h
  49. code ends

  50. end start
复制代码


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

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

  8. table segment
  9.         db 4000 dup(0)
  10. table ends

  11. code segment
  12. start:        mov ax,data
  13.                 mov ds,ax
  14.                
  15.                 mov ax,0b800h
  16.                 mov es,ax
  17.                
  18.                 mov ax,table
  19.                 mov ss,ax
  20.                
  21.                 mov bx,0
  22.                 mov si,0
  23.                
  24.                 mov cx,0fa0h
  25. s0:                mov al,ss:[bx]
  26.                 mov es:[bx],al
  27.                 inc bx
  28.                 loop s0                ;s0用来清屏
  29.                
  30.                 mov bx,0
  31.                 mov si,0
  32.                 mov cx,16
  33. s:                mov al,ds:[bx]
  34.                 mov ah,00000010b                ;设置黑底绿色属性
  35.                 mov es:[si+720h],ax
  36.                 mov ah,00100100b                ;设置绿底红色属性
  37.                 mov es:[si+7C0h],ax
  38.                 mov ah,01110001b                ;设置白底蓝色属性
  39.                 mov es:[si+860h],ax

  40.                 inc bx
  41.                 add si,2
  42.                 loop s
  43.                
  44.                 mov ax,4c00h
  45.                 int 21h
  46. code ends

  47. end start
  48.                
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 23:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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