. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第5章 实验4 第2题 我的解答 (附带说明loop指令)  [已解决] 回复[ 4次 ]   点击[ 376次 ]  
realbit
[帖 主]   [ 发表时间:2011-11-28 22:16 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
我的程序代码:
assume cs:codes

codes segment
              
        mov ax,0020h
        mov ds,ax
        mov bx,0

        mov cx,40h
        
      s:mov [bx],bl
        inc bx
        loop s
 
        mov ax,4c00h
        int 21h

codes ends

end

其中最容易出错的是这句:mov cx,40h
到底是40h(64)或是3Fh(63)呢?
正确答案是40h

我们来看一下怎么测试。

第1步:编译和连接并生成exe格式的程序。

第2步:进入debug,使用e命令使内存单元 0020:0000~0020:0040 全部初始化为FF(或是其它与0~3Fh不
       一样的数)。
       步骤省略。

第3步:使用d命令查看内存单元 0020:0000~0020:0040 的内容:

-d 20:0 40
0020:0000  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF   ................
0020:0010  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF   ................
0020:0020  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF   ................
0020:0030  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF   ................
0020:0040  FF                                                .

第4步:使用t或p命令执行程序。
       步骤省略。

第5步:使用d命令再次查看内存单元 0020:0000~0020:0040 的内容:

-d 20:0 40
0020:0000  00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F   ................
0020:0010  10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F   ................
0020:0020  20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F    !"#$%&'()*+,-./
0020:0030  30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F   0123456789:;<=>?
0020:0040  FF                                                .

至此可以验证内存单元 0020:0000~0020:003F 发生了改变,而内存单元 0020:0040并未改变。
因此我的程序是对的。

再说一点,要特别注意loop循环的次数。
因为在循环之前我们未做任何写入内存的操作,因此我们要执行0~63共64次操作(cx的值即为循环的次数)
所以cx=40h(64)。

记得本章讲解loop操作的时候,有的计算实际上在操作前已经做了一些提前的操作,比如求2的多少次方的问题。
在一般情况下,初始化应该是s=1(s表示积),而书中的例子是初始化s=2(详细例子见5.2和5.3小节),这是
需要注意,细节的问题往往导致程序出错。

这就是我的一点感想吧,希望对大家的学习有帮助。
realbit
[第1楼]   [ 回复时间:2011-11-28 22:23 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
附带说明第3题。
mov cx,_

对于这个空,我认为绝对不能用一个常数来填。 
因为在不同的平台,不同的编译器或是其他原因,指令长度可能是不一样的。 
如果把程序变换下环境,程序就很可能出错!

这是我的意见,欢迎大家发表意见,一起讨论。
tomato
[第2楼]   [ 回复时间:2011-11-28 22:37 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主讲解地很清晰。
foraolita
[第3楼]   [ 回复时间:2011-11-29 15:06 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:0
注册日期:2011-11-18 12:33
直接写64,程序自动将10进制转换成16进制,这个你不用管。
realbit
[第4楼]   [ 回复时间:2011-12-03 16:37 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
此贴由 贴主 于 [ 2011-12-03 16:37 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(tomato):5分   3楼(foraolita):1分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved