汇编网首页登录博客注册
jiajiade01的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
友情链接

[2009-01-17 18:48] 王爽 《汇编语言》    实验4

(1) 编程,向内存0:200~0:23F依次传送数据0~63(3FH).

将0:200~0:23F用0020:0~0020:3F来描述,以使循环比较直观.数据传送的规则是从0开始依次传送.并且这段内存单元的偏移地址的值的递增和常数值的递增是一一对应的.也就是说,每一次传送,准备传送的数据和存放偏移地址的寄存器的内容相同,比如3=(bx).据此编程:
assume cs:shuju
shuju segment

    mov ax,20H
    mov ds,ax
    mov cx,3FH     ;改错:应该是40H,把0忘掉了,谢谢老师.
    mov bx,0
  s:mov [bx],bx
    inc bx
    loop s
    mov ax,4c00H
    int 21H

shuju ends
end

(2) 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括"mov ax,4c00h”和"int 21h”.
在第一问里已经符合这个条件了,我考虑了,以我现在的能力,9条是不能再少了.

(3) 下面的程序的功能是将"mov ax,4c00h”之前的指令复制到内存0:200处,补全程序.上机调试,跟踪运行结果.
assume cs:code
code segment

     mov ax,?         ;为设定指令代码的数据所在的内存单元的段地址做准备
     mov ds,ax
     mov ax,0020h
     mov es,ax 
     mov bx,0
     mov cx,?          ;循环次数
s:   mov al,[bx]
     mov es:[bx],al
     inc bx
     loop s
     mov ax,4c00h
     int 21h

code ends
end

1.看完整个程序可以看出,程序完成的任务是把 mov ax,4c00H 之前的指令以数据的形式复制到内存 0:200 处,从内存的角度看指令在内存中就是数据,它们存放在内存 ((cs)*16:0) 处,第1个填空就是为读取这段内存中的数据所在内存中的段地址做准备,我们可以把cs中保存的段地址送到ds中,用它保存读取这段内存时的段地址,所以第1个空应该填cs

2.第2个填空是要求填循环的次数,这是指哪方面的次数呢?指令在内存中是一个一个字节连续摆放的,一次读取一个字节中的内容送到指定的内存处,这就完成了一次复制工作,接着按顺序读取下一个字节中的内容进行复制,直到按要求复杂完所有内容,每一次的复制工作是按顺序重复进行的,所以在程序可以用循环的方式实现这个过程.本题是要求复制mov ax,4c00H之前的指令,mov ax,4c00H之后的指令在程序中占用了5个字节,程序在内存中占用的字节数减去5就是循环的次数,在debug的环境下,debug加载完程序后,cx中保存的就是程序的长度,所以对于本程序可以把 mov cx,? 可以改为 sub cx,5 可以实现循环的次数,但是本题是要求填空,所以我们可以先填上任意一个常数,比如1,因为我们的目的是为了用debug加载程序后从cx中得到程序的长度后按要求减去5就得到了循环的次数,循环次数的多少跟程序的长度无关.我们也可以一个一个指令的加来得到循环次数,但是如果程序很长呢,比如几千条指令你还能一个一个的去加么?
  最后从cx中得到程序长度后减去5,得到第2个空的答案---18H.
评论次数(5)  |  浏览次数(584)  |  类型(汇编作业) |  收藏此文  | 

[  jiajiade01   发表于  2009-01-17 22:55  ]

又是不注意细节,做第5章的检测题又错了一道,第二次做检测题的时候才发现,很简单的一道题做错了,就是因为把字单元错看成单元了.
 程序执行后,内存中字单元2000:1005中的内容为
看来做汇编一定要非常细心才行.

[  crazyman   发表于  2009-01-18 15:53  ]

博主分析的很好,很详细,但是第一提有一个小瑕疵,就是对于数据份额范围没看好,你写的是mov cx,3FH ,但是,数据应该是0~3F,其实是40H个数据,所以,应该cx的循环控制也得是40H。不过,这倒不影响博主对知识本人的理解,算是一个小细节吧。呵呵

[  jiajiade01   发表于  2009-01-18 23:21  ]

谢谢crazyman老师,我是把0忘掉了,以后一定注意,十分感谢.

[  游客   发表于  2009-09-17 05:49  ]

s:mov [bx],bx 也不对吧
应该是 mov [bx],bl 因为内存单元是字节数据,而bx是16位数据

[  游客   发表于  2009-09-17 05:51  ]

252025628 如果我说的不对,希望博主联系我,还请赐教

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码