. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验题4 (2)不用9条指令,只用8条的做法。。。因为我不会做9条的。。。  [待解决] 回复[ 143次 ]   点击[ 4468次 ]  
hino
[帖 主]   [ 发表时间:2008-08-11 20:10 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:3
注册日期:2008-06-22 20:23
assume cs:abc
abc segment

   mov ax,0200h
   mov ds,ax
   mov cx,64
 s:mov bx,cx
   mov [bx],bl
   loop s

   mov ax,4c00h
   int 21h

abc ends
end

我只会做8条指令的。。。
hino
[第1楼]   [ 回复时间:2008-08-11 20:17 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:3
注册日期:2008-06-22 20:23
晕啊。原来ds要设20h,我设成了200h。
zhangtaopy
[第2楼]   [ 回复时间:2008-08-19 12:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-08-19 12:07
晕  我做出来也是8条指令   以为自己做错了~~

原来是对的。。。
mess
[第3楼]   [ 回复时间:2008-08-19 12:43 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
很厉害,我都没有想过这个方法,确实很不错。

不过好像有点问题。题的正确与否我们自己通过debug就能验证。抛开9条指令的限制也无妨:-)

下面是这个程序的结果:
-g

Program terminated normally
-d 0:200
0000:0200  00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F
0000:0210  10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F
0000:0220  20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F
0000:0230  30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F
0000:0240  40 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
--------------------
我们可以看到0000:0240被更改了,而0000:0200没有更改(见loop指令的操作),由于开始默认的是0,所以正好符合题意,反之如果其默认的不是0!
mouse
[第4楼]   [ 回复时间:2008-08-21 09:26 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
同意楼上,楼主的思路不错,不过实现细节有点问题~
999stone999
[第5楼]   [ 回复时间:2008-09-03 14:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-21 10:47
我的程序如下:
assume cs:codesg
codesg segment
start: mov ax,0020h
       mov ds,ax
       mov bx,0
       mov cx,40h
     s:mov ds:[bx],bx/bl;二选一
       inc bx/bl;二选一
       loop s
       mov ax,4c00h
       int 21h
codesg ends
end start
mouse
[第6楼]   [ 回复时间:2008-09-04 10:07 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
s:mov ds:[bx],bx/bl;二选一
-------------
这个用bx会有问题,不清楚的可以自己思考下
mxl800
[第7楼]   [ 回复时间:2008-09-21 09:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-17 16:50
楼上是说(bx)是字型数据,而([bx])要存放的是字节型数据。所以会有问题,但是实际操作中是不受这个问题影响的,因为在内存中第二个数的低8位(我们所需的数据)会将第一个数的高8位(就是00)覆盖掉,正好也符合也题意的存放形式。
但是楼主这样做会有个问题就是,将这段内存的第64位改了,而第1位没改,只是原来就是0而已。
不过楼主的思路还是正确的,只是在传送数据之前将(bx)再减去一位就对了!
我也是初学,不知说的是否正确?
anly2782
[第8楼]   [ 回复时间:2008-09-28 02:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-21 15:29
assume cs:abc 
abc segment 

   mov ax,0200h 
   mov ds,ax 
   mov cx,64 
 s:mov bx,cx 
   mov [bx],bl 
   sub bx,1    加条指令,不知道对不对。
   loop s 

   mov ax,4c00h 
   int 21h 

abc ends 
end
gotowest
[第9楼]   [ 回复时间:2008-10-01 02:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-26 11:36
没有考虑到细节问题
flyleaf
[第10楼]   [ 回复时间:2008-10-03 11:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:5
注册日期:2008-08-23 12:53
楼主还没有初始化 bx 呢,应该要加多一条 ”mov bx,0“  的指令吧?
yugong
[第11楼]   [ 回复时间:2008-10-06 18:25 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10
第8楼的程序有问题哦
vipmike007
[第12楼]   [ 回复时间:2008-10-07 22:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-12 00:11
程序有问题,要加一条:mov ah,0  个人见解
zzf0707
[第13楼]   [ 回复时间:2008-10-22 07:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-10 15:22
我是按楼主提供的程序做的,执行成功了,只是有一点没搞清楚,第一次用r命令查看时,居然显示cx=0013 不应该是0040吗??why
zwp20001
[第14楼]   [ 回复时间:2008-11-06 16:49 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2008-11-03 20:39
楼主的思路不错,赞一个先~
如果按照正常的思路是从00,01,02,一个以个往里面写数据!但是楼主的程序是倒过来“40”,“3f”这样的顺序来写的!但是查看的时候0000:0200 这个位置是没有改变的,楼主的运气好刚好0000:0200处就是“00”。实际上是因为循环程序但发现CX=0的时候就直接跳出,少执行一次mov [bx],bl ,所以0000:0200出没被改写。
496952514
[第15楼]   [ 回复时间:2008-11-24 09:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-24 08:49
楼主思路不错,顶!
lwz
[第16楼]   [ 回复时间:2008-11-24 20:48 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2008-11-24 20:37
5楼兄弟的MOV AX,40H是什么意思呀
lwz
[第17楼]   [ 回复时间:2008-11-24 21:48 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2008-11-24 20:37
各位哥哥看看小弟这个是不是王爽老师要的9位的程序呀
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,63
s:mov [bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
zhangsun20
[第18楼]   [ 回复时间:2008-11-26 11:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-26 10:14
各位哥哥看看小弟这个是不是王爽老师要的9位的程序呀
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,63
s:mov [bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
------------------

回复:我也是新手,说错了不要骂啊,63十进制,还有,你根本没有理解二进制度和十六进制和编程,他是说从0开始,那也应该是64次,那也应该是3F+1=40H,看好了后面是“H“
yinxd6112
[第19楼]   [ 回复时间:2008-11-26 17:51 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2008-11-24 18:10
这是我写的

assume cs: code
code segment
        mov ax,0020h
        mov ds,ax
        mov cx,64
        mov bx,0h
s:        mov ds:[bx],bl
        inc bl
        loop s

        mov ax,4c00h
        int 21h        

code ends
end
共9条指令
其中bx是需要初始化的,因为你并不能保证bx中的值一定是0,所以mov bx,0h还是需要的
811179242
[第20楼]   [ 回复时间:2008-12-05 13:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-20 20:14
楼主太牛X了 学习了
xyw5224
[第21楼]   [ 回复时间:2008-12-06 18:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:3
注册日期:2008-11-21 14:43
楼主的思路不错,赞一个先~
如果按照正常的思路是从00,01,02,一个以个往里面写数据!但是楼主的程序是倒过来“40”,“3f”这样的顺序来写的!但是查看的时候0000:0200 这个位置是没有改变的,楼主的运气好刚好0000:0200处就是“00”。实际上是因为循环程序但发现CX=0的时候就直接跳出,少执行一次mov [bx],bl ,所以0000:0200出没被改写。
------------------
回复:同意楼上的说法,如果按楼主的写的话,填的值是64-1,0没有填进去,CX到0就跳出了,但题的要求是0-63,而不是1-64吧!
valyan
[第22楼]   [ 回复时间:2008-12-11 11:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-28 19:42
assume cs:code
code segment
    mov ax,0020h
    mov ds,ax
    mov bx,0
    mov cx,64

s:  mov [bx],bl
    inc bx
    loop s

    mov ax,4c00h
    int 21h

code ends
end
hanlsheng
[第23楼]   [ 回复时间:2008-12-24 10:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17
楼主这种非常的想法很好,但是细节上有问题,楼上的都说了啊。22楼是正解
cxflove
[第24楼]   [ 回复时间:2009-01-05 23:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:8
注册日期:2008-12-17 17:52
想法不错,可是题目要求 "依次" 传送数据0-63(3fh)
changkong
[第25楼]   [ 回复时间:2009-01-09 03:16 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-12-28 19:04
楼主没有初始化
theguiking
[第26楼]   [ 回复时间:2009-01-12 12:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2008-12-16 19:25
仅仅分析代码:
   mov ax,0200h
   mov ds,ax
   mov cx,64
 s:mov bx,cx
   mov [bx],bl
   loop s

   mov ax,4c00h
   int 21h 

楼主这么想很好,不过忽略了一点
 s:mov bx,cx
   mov [bx],bl
   loop s
这一段中前面两条指令最后一次执行是在cx=1的情况下,紧接着执行loop s的时候0=cx=cx-1,就直接跳到下一步去了。而没有对0:200内存单元进行设置。

这样既能算是你的程序是正确的,又能算不正确的。

正确在:(引用教材)"DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码",这样0:200这个内存单元可以说是默认为0的。所以你的程序忽略了对0:200单元的数据的设置某种意义以上来说是可行的。

不正确在:0:200也有可能不是0,所以如果忽略了对其进行设置,很可能导致程序运行结果不正确。例如:用debug运行你写的程序,先e 0:200 5,然后再执行程序,那结果就不正确了。

我个人倾向于你的程序是不正确的观点。同时你的程序要修改正确,那也需要再增加一条指令。具体有很多种方式。

以上:个人愚见。
wping
[第27楼]   [ 回复时间:2009-01-16 15:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-15 17:32
楼主的探索还是值得肯定的.只是往0000:0240 40多写了一次,而0000:0200又没写.即写入内存的是1-64,而不是题目要求的0-63
还有(bx)不一定是0.
winxie
[第28楼]   [ 回复时间:2009-02-17 21:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-16 21:42
少条初始化语句呀。的确不能算正确。
想想高级语言如果没有初始化一个变量就去使用,那是什么后果?

多么隐晦的BUG呀。
xuan214
[第29楼]   [ 回复时间:2009-03-08 15:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
我的做法这样是8句 是对的吗?
assume cs:code 
code segment 
    mov ax,0020h 
    mov ds,ax  
    mov cx,64 

s:  mov ds:[0],bl 
    inc bx 
    loop s 

    mov ax,4c00h 
    int 21h 

code ends 
end
acnbr
[第30楼]   [ 回复时间:2009-03-27 11:41 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:0
注册日期:2009-03-14 22:04
回复:[第29楼]
------------------
bx还没初始化呢,如果不是0怎么办?
qvbear
[第31楼]   [ 回复时间:2009-04-23 04:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-07-31 18:57
楼主你的程序是错误的

程序没有给 0:200 处赋值
在 loop s  后面应该加上一句  mov ds:[0],cl

你的结果正确  是因为  0:200  处正好是 00
运气而已
因为  0:200 处也有可能不是 00
liaost
[第32楼]   [ 回复时间:2009-05-04 11:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-28 11:02
assume cs:code 
code segment 
start:        mov ax,0200h 
           mov ds,ax
          mov cx,64

s:        mov bx,cx
        mov byte ptr [bx-1],cl  
           loop s 

           mov ax,4c00h 
           int 21h 


code ends 
end start
ooooo
[第33楼]   [ 回复时间:2009-05-09 05:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-08 06:03
s:mov bx,cx 
   mov [bx],bl 
   loop s 
呀呀呀,一看就知道错得严重了,楼主这里不是一直都在重复在偏移地址0064写入64吗??原地踏步,都没有加
INC BX
ooooo
[第34楼]   [ 回复时间:2009-05-09 05:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-08 06:03
这里好搞笑啊,好多比我更菜的,嘻嘻
s:  mov ds:[0],bl  
    inc bx  
    loop s  这代码也是原地踏步啊,一直向MOV DS:[0]写入数据啦,
ooooo
[第35楼]   [ 回复时间:2009-05-09 05:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-08 06:03
忘了提示,是29楼的代码
jixiaoliang
[第36楼]   [ 回复时间:2009-05-09 13:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-22 12:29
22楼的正确~~ 你做的8条指令 少了条 对 BX初始化的~~ 如果 BX不是 0 那就 写的 乱 7八糟了~~
flyincold
[第37楼]   [ 回复时间:2009-05-19 14:16 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-13 21:46
想法很不错呀,这题是碰上了,但还是却一个内存单元没有写入,如果题目不是传送数据0~63,而是6~69你咋办?
flyincold
[第38楼]   [ 回复时间:2009-05-19 14:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-13 21:46
啊,好象原来的9条做法也不行了
zhy_zhy
[第39楼]   [ 回复时间:2009-07-13 16:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-06-29 14:39
大家讲的有点混乱啊……
楼主这里是不用对BX初始化的,因为使用BX的第一句为mov BX,CX。
回33楼,这里用loop后CX值是会变的,相应的BX值也会变,不可能原地踏步。
个人认为26、27楼讲的有道理。楼主的程序实现的是在0020:0001~0020:0040处依次写入了1H~40H。与题目不符……
我觉得正确的应该是这样的:
assume cs:abc 
abc segment 
   mov ax,0020h 
   mov ds,ax 
   mov cx,64 
 s:mov bx,cx 
   sub bx,1       ;这里加一句就好
   mov [bx],bl 
   loop s 

   mov ax,4c00h 
   int 21h 
abc ends 
end 
这样的话还是9句呢!
kstg3794677
[第40楼]   [ 回复时间:2009-07-17 17:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-07-04 17:18
你这个是将1-64传送到内存0:201-0:240中,和题目中的错开了
891204dh
[第41楼]   [ 回复时间:2009-07-29 22:59 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
第18楼,你的程序执行完后,看似没有错误,可是你把内存 0:240 中的数据改成了 00 了 这个是很危险的操作,不知道我说得对不对?
-d 0:200 
0000:0200  00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F 
0000:0210  10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F 
0000:0220  20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F 
0000:0230  30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 
0000:0240  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
891204dh
[第42楼]   [ 回复时间:2009-07-29 23:00 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
因为你用的是DX,它是的长度是一个字,而我们操作的单位是一个字节
amu
[第43楼]   [ 回复时间:2009-08-13 13:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-08 10:04
我的答案
code segment
  mov ax,0020h
  mov ds,ax
  sub bx,bx
  mov cx,0040h
  s:mov [bx],bl
  inc bx
  loop s
  mov ax,4c00h
  int 21h
code ends
end
jvhybg
[第44楼]   [ 回复时间:2009-08-13 22:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-30 10:07
assume cs:code
code segment
        mov ax,0020h
        mov ds,ax
        mov bx,0
        mov cx,40h
        s:mov ds:[bx],bl
        inc bl
        loop s
        mov ah,4ch
        int 21h
        code ends
        end
qwerdsa123
[第45楼]   [ 回复时间:2009-08-19 16:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-11 14:26
我的程序 大家指点一下
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0

mov cx,64
s:mov ds:[bx],bl
inc bx
loop s

mov ax,4c00H
int 21H
code ends
end
qwerdsa123
[第46楼]   [ 回复时间:2009-08-19 17:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-11 14:26
后来 我又修改了一下感觉可以将cx改为63 因为在mov ax,0020H mov ds,ax mov bx,0这里00020已经被赋值为0了
 
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0

mov cx,63
s:mov ds:[bx],bl
inc bx
loop s

mov ax,4c00H
int 21H
code ends
end
idefeng
[第47楼]   [ 回复时间:2009-08-21 10:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-15 16:53
我是这样写的,有没有问题啊?请高手看一下:
assume cs:code

code segment
      mov ax,0000H
      mov ds,ax
      mov bx,0200H
      mov cx,64
    s:mov [bx],bl
      inc bx
      loop s

      mov ax,4c00h
      int 21h
code ends
end
heidaizx
[第48楼]   [ 回复时间:2009-09-25 10:49 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:3
注册日期:2008-11-09 22:07
楼主的思路挺好的,但是这样会提前跳出循环导致,0:200单元处没有赋值,即使侥幸这是个安全区,初始化时都是0,这种做法也是不对的
yasin
[第49楼]   [ 回复时间:2009-10-08 20:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-05 23:09
第19楼,22楼,43楼,44楼,45楼,47楼正解.
第33楼理解有误哦.s:mov bx,cx  
                 mov [bx],bl  
                 loop s  
 这几句可没有"原地踏步"哦!很明显(bx)是随着(cx)的递减而不断递减的!这怎么能叫原地踏步呢!想想看哦!

其实楼主思路是相当创意的!问题在于没有达到题目的要求啊!按楼主的写法,第一次被送到ds:[bx](此时(bx)=(cx)=64)的数据是(cx)的值64,可是题目要求被送入的数据是0~63啊!可不包括64哦!而且当(cx)=1循环体走完后,loop就不再跳转s了,因为此时(cx)-1=0,程序直接往下走了.因而0也没有被送到内存.另外,题目要求的内存空间是0:200~0:23f,楼主的程序在执行完后用到的是0:201~0:240.
alabo886
[第50楼]   [ 回复时间:2009-10-14 13:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-09 19:25
哈哈,你的方法很有创意啊!
marvel12345
[第51楼]   [ 回复时间:2009-10-15 20:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-20 08:23
这样好像是倒着输入的   输入的好像是64-0 而不是依次输入0-64 
不过谢楼主了 这种思路解决了我下一题的思路
release_lag
[第52楼]   [ 回复时间:2009-11-24 15:20 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2009-10-27 16:12
不可否认,楼主的思维不拘一格,很有创意
第四十九楼的正解,楼主的程序是从64复制到1,虽然不是我们要的答案,但却是我们应该学习的思维
我的答案是
    mov ax,20h
    mov ds,ax
    mov bx,0
    mov cx,40h
    
  s:mov [bx],bl
    inc bx
    loop s

    mov ax,4c00h
    int 21h
hay1323
[第53楼]   [ 回复时间:2009-11-30 13:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-20 22:10
yasin说的很对哦.佩服!
taijituishou
[第54楼]   [ 回复时间:2009-12-03 17:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-12 06:06
yasin正解!
82356722
[第55楼]   [ 回复时间:2009-12-15 14:44 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-03-27 20:52
楼主,8个指令不对哈,你没有初始化bl的值,,,
应该是这样地。。。。
assume cs:abc 
abc segment 

   mov ax,020h 
   mov ds,ax
   mov bl,0 
   mov cx,64 
 s:mov [bl],bl 
   int bl 
   loop s 

   mov ax,4c00h 
   int 21h 

abc ends 
end
82356722
[第56楼]   [ 回复时间:2009-12-15 14:46 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-03-27 20:52
还有,看看你的bl没变化,再循环也是一个值啊
regex
[第57楼]   [ 回复时间:2010-01-02 22:58 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
初始化需要的寄存器, 是个好习惯。
inrg
[第58楼]   [ 回复时间:2010-01-16 17:55 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-08 14:22
提示你一下 你还是9条指令  如果按你那样来 不符合题目要求

s:mov bx,cx 
mov [bx],bl 

cx = 64   地址偏移是从0 / 63开始的 所以 mov [bx], bl 中的bx 应该 bx = bx -1 还是9条指令
jabyshen
[第59楼]   [ 回复时间:2010-03-17 20:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-01 21:17
作为个别案例分析还是很有价值的。
hj200009
[第60楼]   [ 回复时间:2010-03-24 21:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-22 11:30
逆向思维 加 发散思考方式,虽细节方面有瑕疵,但值得肯定!!!
hj200009
[第61楼]   [ 回复时间:2010-03-24 21:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-22 11:30
不满足于你看到了什么,而要深度思考你还看到了什么,表象背后隐藏的东西便可能浮出水面...
renhaidulang
[第62楼]   [ 回复时间:2010-04-04 13:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-03 22:07
你的结果是错误的!!!
你这样更改的是0:201H--0:240H,而题目要求的是0:200H--0:23FH!!!!
你用debug调一下自己看看就知道了
gin
[第63楼]   [ 回复时间:2010-04-18 18:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-03 03:20
第一次执行就是错的
cx=64=40h  第一次复制的植就措勒
而且题目是让从0-63[3f]你这个还是反过来的。。。。
idpanjian
[第64楼]   [ 回复时间:2010-12-06 14:47 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-03 12:08
复制的曲间有误,题目要求0--63
LZ是循环次数为64次,64--1由于cx=0不执行,所为0200:0是不会被复制的
trapdoor
[第65楼]   [ 回复时间:2010-12-07 16:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-06 12:31
但是有点问题,题目要求是从0—63,而不是到64!
minorno1
[第66楼]   [ 回复时间:2010-12-08 19:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-09 20:01
有问题啊 题目要求是 输入0~63 不是64到1 啊
8782711
[第67楼]   [ 回复时间:2010-12-16 10:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-12 20:21
少了inc bx,bx一直等于0
8782711
[第68楼]   [ 回复时间:2010-12-16 10:43 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-12 20:21
哦,是我看错了
8782711
[第69楼]   [ 回复时间:2010-12-16 10:43 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-12 20:21
LZ的方法启发了我啊
caizlha
[第70楼]   [ 回复时间:2010-12-18 13:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-26 16:20
悲剧
static
[第71楼]   [ 回复时间:2010-12-20 08:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-06 11:12
0没有被赋值进去把
aibvfhpia
[第72楼]   [ 回复时间:2010-12-20 12:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-20 11:44
ASSUME    CS:TESTFOUR
    TESTFOUR  SEGMENT
              MOV       AX,0200H
              MOV       DS,AX
              MOV       CX,40h
          S:  MOV       BX,CX
              MOV       [BX],CX
              SUB       cx,1
              LOOP      S
              MOV       AX,4C00H
              INT       21
    TESTFOUR  ENDS
              END
aibvfhpia
[第73楼]   [ 回复时间:2010-12-20 14:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-20 11:44
SUB       cx,1
加不加  没关系。
liber
[第74楼]   [ 回复时间:2010-12-21 10:46 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2010-12-15 20:35
assume cs:mycode
mycode segment
    mov ax,0020H
    mov ds,ax
    mov bx,0H
    mov cx,3fH
    s:mov [bx],bx
    inc bx
    loop s
    
    mov ax,4c00H
    int 21H
mycode ens
end
yin.viky
[第75楼]   [ 回复时间:2010-12-27 21:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2010-10-31 08:38
大家讲的有点混乱啊……
楼主这里是不用对BX初始化的,因为使用BX的第一句为mov BX,CX。
回33楼,这里用loop后CX值是会变的,相应的BX值也会变,不可能原地踏步。
个人认为26、27楼讲的有道理。楼主的程序实现的是在0020:0001~0020:0040处依次写入了1H~40H。与题目不符……
我觉得正确的应该是这样的:
assume cs:abc 
abc segment 
   mov ax,0020h 
   mov ds,ax 
   mov cx,64 
 s:mov bx,cx 
   sub bx,1       ;这里加一句就好
   mov [bx],bl 
   loop s 

   mov ax,4c00h 
   int 21h 
abc ends 
end 
这样的话还是9句呢!
------------------
回复:看了前面30多个的,这个应该是很好的分析。29楼的也是对的。学习了,感谢。
hawell
[第76楼]   [ 回复时间:2011-01-14 18:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-14 18:20
已经验证完毕!楼主的编程是错误的,先不说你的bx没有初始化0,可能会出现问题!
而你的赋值完全错误,20H:0你根本就没写入,因为loop先执行的是cx-1,你只是碰巧20h:0的数据为0罢了。不相信自己用emu8086自己在 20H:0写入其他数据验证下!
发下标准答案哈!!!!!!!!emu8086内存验证正确!
assume cs:code
code segment
mov ax,20h
mov ds,ax
mov bx,0
mov cx,40h
s: mov [bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
349118010
[第77楼]   [ 回复时间:2011-01-26 10:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-20 14:15
这道题大家都用了多少时间。。。。我想了好久
lianrenjujishou
[第78楼]   [ 回复时间:2011-02-19 20:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-06 13:11
我做的和17楼一样,呵呵
bluelonestar
[第79楼]   [ 回复时间:2011-03-21 22:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-27 22:37
assume cs:abc 
abc segment 

   mov ax,0020h 
   mov ds,ax 
   mov cx,64 
 s:sub cx,1
   mov bx,cx 
   mov [bx],bl 
   loop s 

   mov ax,4c00h 
   int 21h 

abc ends 
end 

我认为把楼主的这样改一下就行了
shangyl00
[第80楼]   [ 回复时间:2011-04-04 13:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-04 12:43
楼主的程序我运行如下: 貌似有问题!
C:\Masm>debug 3.exe
-r
AX=0000  BX=0000  CX=0013  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B83  ES=0B83  SS=0B93  CS=0B93  IP=0000   NV UP EI PL NZ NA PO NC
0B93:0000 B80002        MOV     AX,0200
-g

Program terminated normally
-d 0:200
0000:0200  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0230  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0240  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0250  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0260  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0270  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-
mqywqs
[第81楼]   [ 回复时间:2011-04-10 23:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-05 12:00
不管怎么说楼主很厉害,3楼分析的也很透彻
linzy
[第82楼]   [ 回复时间:2011-04-12 14:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-31 22:33
郁闷 楼主的程序都有问题啊! BX没有初始化就开始赋值了???厉害无中生有!!!
linzy
[第83楼]   [ 回复时间:2011-04-12 14:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-31 22:33
居然有这么多人夸奖 这么多人的 mov cx,64 写成了 mov cx,63 厉害啊 凶悍啊 写成这样了还在那里说看看我的程序写的咋样好不好???更有连BX初始化都没有 还有S:MOV [BX],BX 这是什么意思??? 别人是要你一个单元一个单元的进行操作 并不是一个字单元一个字单元的连续传送数据 虽然可能没错但是这种态度难道可以?》??
linzy
[第84楼]   [ 回复时间:2011-04-12 15:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-31 22:33
第七十九楼的程序我不知道是在做什么???s:sub cx,1减掉一个1 loop s cx又减掉一个1 那这样到头才循环了多少次??、 那结果就是这样 63 61 59 57 ……
philipyyh
[第85楼]   [ 回复时间:2011-04-17 20:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-17 04:00
你好。 
你复制的是1-64(40h)从0000:0201到0000:240,并没有复制0到0000:0200。因为cx=0时,程序直接就向下走了。
0000:0200为0是因为他的初始值是0.
换句话说,如果系统在0000:0200赋予的初始值不为0,那么这个程序就得不出这个结论。你可以先把0000:0200设成其他值试试。
cibly
[第86楼]   [ 回复时间:2011-04-29 11:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-29 11:13
不是已经mov bx,cx 
为什么有人说要给BX赋初值,请赐教
rotapple
[第87楼]   [ 回复时间:2011-06-02 17:54 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
我只是来交下作业。上面已经有很多人写了正确答案,就没细看了。
  mov ax,20h
  mov ds,ax
  mov bx,0
  mov cx,40h
s:mov [bx],bl
  inc bx
  loop s
  mov ax,4c00h
  int 21h
lzh22355495
[第88楼]   [ 回复时间:2011-07-03 19:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-09-17 02:05
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s:    inc bx
loop s
mov ax,4c00H
int 21H
code ends
end

mov [bx],bx 这样设置好像没有什么异常。。
不知道这样设置有什么不妥的吗?????  求解答。
lzh22355495
[第89楼]   [ 回复时间:2011-07-03 19:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-09-17 02:05
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s: mov [bx],bx
   inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
mov [bx],bx 这样设置好像没有什么异常。。
不知道这样设置有什么不妥的吗?????  求解答。
这个是完整的,刚那个掉了一句。
huameng
[第90楼]   [ 回复时间:2011-07-06 13:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-04 14:44
如果是考试,楼主得零分,姑且不说你聪明地用了8条指令,对照下题意,就不符合要求!
lidezheng
[第91楼]   [ 回复时间:2011-07-29 12:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-28 19:47
mov [bx],bx这条指令不符合题意,因为你一下给两个字节单元赋值,题目要求是一个字节单元一个值0-63,虽然编译能通过
lidezheng
[第92楼]   [ 回复时间:2011-07-29 12:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-28 19:47
结果不对,仔细看看题吧!
这是我改进后的结果
;-----------------------------------------
;向内存0:200-0:23F依次传送数据0-63(3FH)
;2011-7-29
;-----------------------------------------
assume        cs:code
code        segment

start:        mov        bx,0
        mov        ds,bx
        mov        cx,64                        ;循环次数
        
s:        mov        [0200H+bx],bl
        inc        bx
        loop        s
        
        mov        ax,4c00H
        int        21H

code ends
        end        start
lidezheng
[第93楼]   [ 回复时间:2011-07-29 12:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-28 19:47
回复:[第89楼]
------------------
mov [bx],bx这条指令不符合题意,因为你一下给两个字节单元赋值,题目要求是一个字节单元一个值0-63,虽然编译能通过
lhk3355
[第94楼]   [ 回复时间:2011-07-30 10:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-17 23:03
好办法 CX 变成C里的i--了
mywtfmp3
[第95楼]   [ 回复时间:2011-10-05 01:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41
lz的想法非常赞啊,而且你的程序可以再少一列。(虽然有错误,但是减少了很多读寄存器的时间,赞)
assume cs:abc 
abc segment 

   mov ax,0200h 
   mov ds,ax 
   mov cx,64 
 s:mov bx,cx             // 这里把cx的内容存进bx完全是多余的,可以直接用cx的内容吗
   mov [bx],bl           // 两句合成一句  mov [cx],cl
   loop s 

   mov ax,4c00h 
   int 21h 

abc ends 
end 

我只会做8条指令的。。。
chinatree
[第96楼]   [ 回复时间:2011-10-05 06:07 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
mov [cx],cl
 可以这样用吗?
mywtfmp3
[第97楼]   [ 回复时间:2011-10-09 22:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41
mov [cx],cl
 可以这样用吗?
------------------
回复:可以这样用的。【cx】只是表征地址,但是没有说明操作数的大小,cl就表示复制一个字节。如果是cx就是复制一个字。
chinatree
[第98楼]   [ 回复时间:2011-10-10 02:26 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
回复:[第97楼] mywtfmp3
请你在debug中试一次再这样说,然后请你再思考下为什么会是那样。
rotapple
[第99楼]   [ 回复时间:2011-10-10 11:08 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:6
注册日期:2011-06-01 16:20
to: mywtfmp3

如果还没有自己实践过请不要回复其它人,以免造成误会,谢谢。
twozs
[第100楼]   [ 回复时间:2011-11-11 01:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-10 23:00
好多人都说没有初始化bx,我觉得应该算是初始化过了,应为有mov bx,cx 这一句啊,是不是你们认为只有设0才是初始化呢?设其他的值也应该算是初始化了啊!楼主程序的问题我看主要还是多了对0020:0040单元的写入,少了对0020:0000单元写0,而只是因为原始为0,所以结果才对了,这个问题楼上许多大人都已经分析清楚了!不过楼主的思路很特别,表示佩服!
tvrctak
[第101楼]   [ 回复时间:2011-11-14 23:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-14 23:34
assume cs:tvrctak
code segment
  mov ax,0020h
  mov ds,ax
  mov bx,0
  mov cx,64
s:
  mov ds:[bx],bl
  inc bx
  loop s
  mov ax,4c00h
  int 21h
tvrctak ends
end
tvrctak
[第102楼]   [ 回复时间:2011-11-14 23:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-14 23:34
回复:[第17楼]
------------------
有问题啊、通过debug 运行后最后一位.(0020:0000 3f)3f=00;
(0~63)是64位数,但cx=63,每间循环一次,CX-1、当执行到63-63的时候是执行第64步,减后成了0、所以不在执行,保持原来的数,(0020:003F)=原来的数(0)所以第六十四位就变成0了。并不是(十六进制的3f)
tomato
[第103楼]   [ 回复时间:2011-11-15 19:15 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
这是个细节问题,结果上看不出来,是个隐藏问题。
wulixunhua321
[第104楼]   [ 回复时间:2011-11-26 14:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-26 13:42
受教了,
vsoft
[第105楼]   [ 回复时间:2011-11-27 17:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-11-27 16:20
回复:[第7楼]
------------------
7楼兄弟,会覆盖吗?
我记得王老师的书上是说不会覆盖,第一个字形数据假设是1,2这两个内存单元,第二个则是3,4两个内存单元了,怎么会覆盖呢,具体在哪说的我记不得了
vsoft
[第106楼]   [ 回复时间:2011-11-27 17:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-11-27 16:20
回复:[第7楼]
------------------
7楼兄弟,会覆盖吗?
我记得王老师的书上是说不会覆盖,第一个字形数据假设是1,2这两个内存单元,第二个则是3,4两个内存单元了,怎么会覆盖呢,具体在哪说的我记不得了
------------------
回复:好像是第五章,问题5.1里面有,没有具体说,只是在问题里面体现出来了
vsoft
[第107楼]   [ 回复时间:2011-11-27 17:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-11-27 16:20
回复:[第33楼]
------------------
我去,你再想想loop是怎么执行的,每次执行前CX都要-1
s:mov bx,cx 
mov [bx],bl
你说他有没有变
vsoft
[第108楼]   [ 回复时间:2011-11-27 17:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-11-27 16:20
很棒的创意,如何提高程序的效率就是这样一点一点思考出来的,对于的楼主的做法,应该是肯定而不是否定,当然问题不可掩盖,至于初始化,有的时候也很巧妙的利用的,你判断他不需要初始化就不必再操作,否则反而降低了程序效率

奇思妙解不是很好,这种讨论的气氛也很好,哈,我喜欢
realbit
[第109楼]   [ 回复时间:2011-11-28 20:42 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
to 3楼:

楼主的程序有两个错误,
第一个:mov ax,0200h ;应改为:mov ax,0020h ,这个他自己已经发现了。
第二个:mov cx,64    ;应改为:mov cx,63 或者 mov cx,003Fh 。
                       ;使用循环,在次数上确实容易出现错误。
                       ;因此最后 0020:0040 的内存单元被赋值为40,出现了错误。
                       ;其实我觉得这个loop 就相当于C语言里面的 do...while 循环。
最后说一点,0020:0000 的内存单元本来初始化为0了,后来通过mov 命令再次赋值为0,对于这个问题,楼主的程序是对的,并没有错误。
realbit
[第110楼]   [ 回复时间:2011-11-28 20:46 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第7楼]
------------------
对的,我同意你的观点。
但是我认为这个程序并不是一个好程序,显得很混乱,
而且最后一步操作带了个尾巴,这是错误的。
反正我不喜欢这样的程序。
我还是觉得楼主的程序非常好。
realbit
[第111楼]   [ 回复时间:2011-11-28 20:47 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第10楼]
------------------
mov bx,cx
这条语句就是初始化。
realbit
[第112楼]   [ 回复时间:2011-11-28 20:52 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第17楼]
------------------
s:mov [bx],bx  ;改为:s:mov [bx],bl
realbit
[第113楼]   [ 回复时间:2011-11-28 21:08 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第110楼]
------------------
补充一下,我说的是在使用 mov ds:[bx],bx 这条语句的情况下
realbit
[第114楼]   [ 回复时间:2011-11-28 21:15 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第109楼]
------------------
这个我想了一下,最后一句话我说了。
楼主的程序是有问题的,
cx的值等于操作的次数。
实际上cx必须为64或3Fh.

看来楼主的程序还是要加一句啊。
realbit
[第115楼]   [ 回复时间:2011-11-28 21:16 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
实际上cx必须为64或40h。。。
frankafka
[第116楼]   [ 回复时间:2012-01-11 10:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-11 09:15
哪位大大帮忙把0~63按照倒叙排列写个程序啊,其他条件都和题目一样的 就把正序改成倒叙的
tomato
[第117楼]   [ 回复时间:2012-01-11 22:34 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
用63减去当前的cx值后,然后将得到的值存进去就可以了吧。
javaimgod
[第118楼]   [ 回复时间:2012-01-21 01:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
倒叙代码不知道对不对
assume cs:code
code segmnet
     mov ax,0020H
     mov ds,ax
     mov bx,63
     mov cx,64
s:   mov [bx],bl
     sub bx,1
     loop s
     mov ax,4c00h
     int 21
code ends
end
javaimgod
[第119楼]   [ 回复时间:2012-01-21 01:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
同意7楼,8楼,14楼,83楼
fpamc
[第120楼]   [ 回复时间:2012-02-29 20:02 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
仅仅分析代码:
   mov ax,0200h
   mov ds,ax
   mov cx,64
 s:mov bx,cx
   mov [bx],bl
   loop s



这个挺好

   mov ax,4c00h
   int 21h 

楼主这么想很好,不过忽略了一点
 s:mov bx,cx
   mov [bx],bl
   loop s
这一段中前面两条指令最后一次执行是在cx=1的情况下,紧接着执行loop s的时候0=cx=cx-1,就直接跳到下一步去了。而没有对0:200内存单元进行设置。

这样既能算是你的程序是正确的,又能算不正确的。

正确在:(引用教材)"DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码",这样0:200这个内存单元可以说是默认为0的。所以你的程序忽略了对0:200单元的数据的设置某种意义以上来说是可行的。

不正确在:0:200也有可能不是0,所以如果忽略了对其进行设置,很可能导致程序运行结果不正确。例如:用debug运行你写的程序,先e 0:200 5,然后再执行程序,那结果就不正确了。

我个人倾向于你的程序是不正确的观点。同时你的程序要修改正确,那也需要再增加一条指令。具体有很多种方式。

以上:个人愚见。
------------------
回复:
tomato
[第121楼]   [ 回复时间:2012-02-29 21:35 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
最后一个数据多设置了,第一个数据少设置了。
koxter
[第122楼]   [ 回复时间:2012-03-21 18:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-03-20 16:03
assmue cs:abc
abs segment
      mov ax,20h
      mov ds,ax
      mov cx 63
      s:mov ds:{cx},cx
      loop s:
      mov ax 4c00h
      int 21h
abc ends
end
不知道这么些对不对
tomato
[第123楼]   [ 回复时间:2012-03-21 22:36 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
回复122楼:实验一下,计算机会告诉你答案。
e56004474
[第124楼]   [ 回复时间:2012-04-06 12:21 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
创意不错。
chris_kscn
[第125楼]   [ 回复时间:2012-04-19 10:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-18 10:45
能用cx替代bx么?使用从3fH倒序赋值,以为都是8位 也不存在地位高位
e56004474
[第126楼]   [ 回复时间:2012-04-24 19:01 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
assume cs:abc 
abc segment 

   mov ax,0200h 
   mov ds,ax 
   mov cx,64 
 s:mov bx,cx 
   mov [bx-1],bl 
   loop s 

   mov ax,4c00h 
   int 21h 

abc ends 
end 

这样子应该没得问题了。
tianzijun
[第127楼]   [ 回复时间:2012-05-11 19:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-05-09 17:59
这也是一个解:
assume cs:code

code segment

        mov ax,20h

        mov ds,ax

        mov cx,3fh

s:      mov bx,cx
        mov [bx],bl
        loop s
        mov ds:[0],cl

        mov ax,4c00h
        int 21h

code ends
end
cavalry1989
[第128楼]   [ 回复时间:2012-07-10 15:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-06-26 07:49
支持120楼的说法,逻辑都错了,虽然你的最终结果可能是正确的,但那是在特定的环境下才会有那样有结果
ancienthuman
[第129楼]   [ 回复时间:2012-07-18 15:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-07-15 10:30
确实,楼主这个确实有问题!
stop1204
[第130楼]   [ 回复时间:2013-04-29 08:24 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
全错了诶,.,  如果不 执行 BX=0     cx 也不一定= 0  的情况  
那么假设,cx=1111H 那么 bx = 1111H  BH=11H BL=11H  DS已经被赋值 20H            
那么第一次循环 执行mov DS:BX,bl 的内存单元与数据分别是多少?
mov ds:[bx],bl        mov 20:1111,11H   ?

题目要求 向内存0:200-0:23F     就已经限定了 BX必须为0 
初始化mov bl,0  也不行,,     BH值未知, 也有机会让写入的内存单元不在题目要求范围内
hky987654321
[第131楼]   [ 回复时间:2013-08-04 02:19 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
为什么不置顶!这种探索精神应被凸显和传承。希望不要结帖。
circyo
[第132楼]   [ 回复时间:2014-03-23 18:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-02-22 22:19
0 进不到 0:200 处 
这种做法挺好,用了cx迭减
省去了inc
可惜是错的做法
dyg104
[第133楼]   [ 回复时间:2014-10-01 12:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-08-02 20:20
差了一条指令:mov bx,0
楼主忽视了bx初值的设定。
asm0101
[第134楼]   [ 回复时间:2015-03-17 00:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-02-17 23:21
经典不朽之作!
电脑就这样,顺着弄逆着弄都好,CX是3FH或40H都一样,只要控制住0:200 - 0:23F的值是0-63(3FH)就行,结果摆在那就行!求全是一种情形,不求全也是一种解。
saimyzd
[第135楼]   [ 回复时间:2015-03-27 16:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-19 14:30
的确巧妙,将CX巧妙利用。。。
adobe
[第136楼]   [ 回复时间:2016-04-03 14:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2016-04-03 14:09
为什么没人用我这种
assume cs:code
        code segment
                mov ax,0000h
                mov ds,ax
                mov bx,0200h
                mov cx,64
        s:        mov [bx],bl
                inc bl
        loop s
        mov ax,4c00h
        int 21h
        code ends
end
q_wert
[第137楼]   [ 回复时间:2017-07-17 12:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-07-17 12:09
我改成这个样子,编译一直报错,好像是mov [cx],cl这句有问题。
但是我看书上说[]里面可以直接用寄存器的啊(第三版P112),
改成mov ds:[cx],cl也不行。难道只能用mov [bx],cl吗?
assume cs:code
code segment

   mov ax,20H
   mov ds,ax
   mov cx,3FH

s: mov [cx],cl//masm报错
   loop s

   mov [cx],cl

   mov [cx],cl//报错
   int 21H
code ends
end
多谢各位大佬,抱拳
v115488
[第138楼]   [ 回复时间:2017-08-30 21:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-08-11 18:33
这个不知道还有没有在接,一楼的看了下,存在两个问题:
1,送入DX的应该是20H,不能是200H,否则与题不符。
2,这样倒着写进去,因为loop判定时cx=0则向下执行,所以dx:0位并没有写入数据。

136楼的更为漂亮些
fanpei91
[第139楼]   [ 回复时间:2019-01-30 14:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2019-01-30 14:05
回复:[第136楼]
------------------
136 楼的最漂亮。楼主的代码是有问题的。
asmuser
[第140楼]   [ 回复时间:2020-07-09 11:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-07-09 10:47
参考答案:

assume cs:code

code segment:

    mov bx,200h     // 设bx
    mov cx,40h      // 设cx
    sub ds,ds       // 设ds

s:  mov [bx],dx     // 写值
    inc bx          // bx增量
    inc dx          // cx增量
    loop s          // s循环
    
    mov ax,4c00h
    int 21

code ends

end
asmuser
[第141楼]   [ 回复时间:2020-07-09 11:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-07-09 10:47
参考答案:

assume cs:code

code segment:

    mov bx,200h     // 设bx
    mov cx,40h      // 设cx
    sub ds,ds       // 设ds

s:  mov [bx],dx     // 写值
    inc bx          // bx增量
    inc dx          // cx增量
    loop s          // s循环
    
    mov ax,4c00h
    int 21

code ends

end
------------------

勘误:

inc dx          // cx增量

更改为

inc dx          // dx增量
xbcyyy
[第142楼]   [ 回复时间:2020-09-12 16:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-08-30 07:31
assume cs:code
code segment

        mov ax,020h
        mov es,ax
        mov bx,0

        
        mov cx,64

s:        mov es:[bx],bl
        inc bx

        loop s
        mov ax,4c00h
        int 21h

code ends
end
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved