. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验4 第一小题正解  [待解决] 回复[ 31次 ]   点击[ 2274次 ]  
tianxing9151
[帖 主]   [ 发表时间:2011-04-24 21:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-23 00:14
assume cs:codesg

codesg segment

     mov ax,0020h

     mov ds,ax

     mov bx,0

     mov dl,0

     mov cx,40h

s:   mov [bx],dl

     inc dl

     inc bx

     loop s


     mov ax,4c00h

     int 21h

 

codesg ends

end
657301893
[第1楼]   [ 回复时间:2011-04-26 20:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-25 22:45
问下 为什么 mov cx,40h  这个是40呀
neur2520
[第2楼]   [ 回复时间:2011-05-04 19:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-28 17:19
应该是3FH吧?别误人子弟。。。
yexunzhe2011
[第3楼]   [ 回复时间:2011-05-19 10:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-08 09:53
从0--3FH不就是40H次嘛,没问题
afeny
[第4楼]   [ 回复时间:2011-05-26 05:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-26 05:26
0-3fh 你们算算是不是40嘛 呵呵 也就是 0~63嘛  不是64个数吗?
perfectbullet
[第5楼]   [ 回复时间:2011-08-17 17:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-07 15:14
我直接mov cx,cx
我觉得不用变动
chinatree
[第6楼]   [ 回复时间:2011-08-17 18:07 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
除了两头必不可省的四行,楼主想想能不能精简到7行以内?
chinatree
[第7楼]   [ 回复时间:2011-08-17 18:12 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
还有程序推出的两行也不算。
boble
[第8楼]   [ 回复时间:2011-08-21 15:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12
下面的代码为本人自己所写,调试通过的,发上来大家交流:
 assume cs:code
code segment
mov ax,20h
mov ds,ax
mov bx,0h
mov cx,40h     ;这里是40而不是3F,因为3FH=63,40H=64,这个数据代表的是次数,
s: mov [bx],bx ;这个地方[bx],也可以用ds:[bx],即 s: mov ds:[bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
这段代码共13行,不知道还能不能再精简
boble
[第9楼]   [ 回复时间:2011-08-21 15:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12
关于第六行  mov cx,40h的问题,0~3fh=64没错,但是这个地方代表的是次数,没有0次,所以要从1次开始。
也就是1h~40h,1次~64次
boble
[第10楼]   [ 回复时间:2011-08-21 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12
第七行更改为: mov [bx],bl
xohome
[第11楼]   [ 回复时间:2011-09-07 23:19 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
;实验4:编程,向内存0:200~0:23F依次传送数据0~63(3F)  --代码只能使用9条指令

assume cs:codeseg

codeseg segment
        mov ax,20H
        mov ds,ax
        mov bx,0
        mov cx,63
s:        mov [bx],bl  ;这里必须是mov [bx],bl 因为如果用mov [bx],bx传送的将是两个字节,在最后的一次传送中会覆盖后面的一个字节
        inc bl
        loop s
        mov ax,4C00H
        int 21H
codeseg ends
end
xohome
[第12楼]   [ 回复时间:2011-09-07 23:21 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
回复:[第9楼]
------------------
loop循环类似于高级语言中的do while循环,不管条件与否都会执行第一次 所以cs的值应该是63
xohome
[第13楼]   [ 回复时间:2011-09-07 23:23 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
回复:[第12楼]
------------------
是cx的值是63 打错了
chinatree
[第14楼]   [ 回复时间:2011-09-07 23:23 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
是六十四,因为是先减1再比较的,当cx为1时遇到loop就跳出循环了。
xohome
[第15楼]   [ 回复时间:2011-09-14 22:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
回复:[第14楼]
------------------
准确的说法应该是,先执行,再减一,然后再判断cx
mov [bx],bl 
        inc bl 
        loop s
debug 加载的代码顺序与源码顺序相同,在执行到mov [bx],bl 时,是不知道loop这段代码的,也就说第一次执行到这里不会判断cx是否为0,当次执行到loop s 才会cx-1,所以程序的流程应该是:
不管cx值为多少,先执行一次循环体代码,执行到loop指令判断cx的值,所以cx为1时,第一次执行是有效的,所以cx的值应该是63,另外单步测试跟踪通过,63应该是正确的
hzhzwyd
[第16楼]   [ 回复时间:2011-09-28 07:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-27 01:02
0~3f一共有64个字节的内存块,默认情况下一个字节一个字节的复制应该要复制64次,即反过来思考,cx为1时也就是循环终止的时候执行的是第64次,反推得出cx为2 即执行第63次,cx为3 即执行第62次 依次类推,假设当前执行的是第N次 可以得出cx+N的和为65,即第1次执行的时候,cx等于64.
hzhzwyd
[第17楼]   [ 回复时间:2011-09-28 07:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-27 01:02
另外由于cx是在执行后才执行减一运算的,所以循环次数应该是1~N 即N次 即cx中的值就是循环次数  以上是个人学习成果,希望对大家有一定的帮助!
    ~至此 敬礼
mywtfmp3
[第18楼]   [ 回复时间:2011-10-05 01:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41
回复:[第17楼]
------------------
嗯,循环运行多少次,就设置多少个cx
atmbank
[第19楼]   [ 回复时间:2011-12-22 15:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-28 15:50
应该是
mov cx,64  或  MOV CX,40h
如果是63的话,看下面的debug实例:
AX=0020  BX=0000  CX=003F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0020  ES=0B62  SS=0B72  CS=0B72  IP=000D   NV UP EI PL NZ NA PO NC
0B72:000D FEC3          INC     BL
-t

AX=0020  BX=0001  CX=003F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0020  ES=0B62  SS=0B72  CS=0B72  IP=000F   NV UP EI PL NZ NA PO NC
0B72:000F E2FA          LOOP    000B
……
AX=0020  BX=002E  CX=0012  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0020  ES=0B62  SS=0B72  CS=0B72  IP=000F   NV UP EI PL NZ NA PE NC
0B72:000F E2FA          LOOP    000B
-p

AX=0020  BX=003F  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0020  ES=0B62  SS=0B72  CS=0B72  IP=0011   NV UP EI PL NZ NA PE NC
0B72:0011 B8004C        MOV     AX,4C00
初始时,BX=0,CX=003F ,最终BX=003F,CX=0, 此时看下条待执行命令是 MOV AX,4C00  已不再跳转去执行
MOV [BX],BL ,所以63就未被复制过去

----有错请指正
culone
[第20楼]   [ 回复时间:2012-01-03 09:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-21 23:06
回复11楼的"这里必须是mov [bx],bl 因为如果用mov [bx],bx传送的将是两个字节,在最后的一次传送中会覆盖后面的一个字节"
!!胡说!!,怎么会!!!最后一次向0:23f写入一个字,也就是把0023f改写成3f,把00240改写成00,这样也符合题意,
只是用bl看似比较符合常理
xiaoyao2012
[第21楼]   [ 回复时间:2012-10-31 16:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-10-17 22:10
回复15楼那位朋友 你不知道LOOP 指令执行的先执行的是 (cx)=(cx)-1,然后判断吗?
jy_fly_sky
[第22楼]   [ 回复时间:2013-01-17 19:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-20 20:25
cx=64,因为cpu在执行loop s的时候是 首先要将(cx)-1,判断(cx)是否为0,不为0,再转向mov [bx],bl,最后(cx)=1是跳出循环,传的数据时64字节,最后一次cx=1没有执行loop s,这样的话loop s 就应该执行63次,所以cx=63+1=64.
qjp945
[第23楼]   [ 回复时间:2013-06-15 21:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-06-05 22:16
小弟对这题是这样做的
assume cs:code
code segment
        mov ax,0000h
        mov ds,ax
        mov bx,0h

        mov cx,40h
s:        mov ds:[bx+200],bl
        inc bl
        loop s

        mov ax,4c00h
        int 21h
code ends
end
        忘大虾们指点下
linyu0723
[第24楼]   [ 回复时间:2013-06-16 17:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-07 21:54
cx=64,因为cpu在执行loop s的时候是 首先要将(cx)-1,判断(cx)是否为0,不为0,再转向mov [bx],bl,最后(cx)=1是跳出循环,传的数据时64字节,最后一次cx=1没有执行loop s,这样的话loop s 就应该执行63次,所以cx=63+1=64.
------------------
回复:这个想法是不对的。(CX)=1,代码是被执行的。不要忘了,LOOP是先执行一次代码,然后再CX-1,再去判断CX是否为0。
如有下面程序:

      mov cx,1 

s:   mov [bx],dl 

     inc dl 

     inc bx 

     loop s 

这个程序是要被执行一次的。这个就像是C语言里的DO....WHILE(条件)循环。
wildwind
[第25楼]   [ 回复时间:2014-03-10 13:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-04-07 16:06
回复:[第11楼]
------------------
严格来说第七行可以是 “mov [bx],bx”,会覆盖,但不会影响结果,因为bx的高八位一直是零,不足之处是效率较低。
jumpbird
[第26楼]   [ 回复时间:2014-08-29 20:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-08-29 19:48
应该是 mov cx,64  自己去试验下就知道了。
前面例5.8中ffff:0~ffff:b单元是12个字节,循环12次,这个题目是0~63,是64个字节,所以循环64次。
gyq
[第27楼]   [ 回复时间:2014-08-29 23:50 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2014-08-02 21:25
25,26楼说得对。

当cx为0H的时候,循环执行10000H次。
当cx为1H的时候,循环执行1H次。
当cx为2H的时候,循环执行2H次。
...
当cx为3FH的时候,循环执行3FH次。
当cx为40H的时候,循环执行40H次。
...
当cx为FFFFH的时候,循环执行FFFFH次。

以上归纳信息为:循环次数取值范围是1~10000H。可选择范围内任意次数的循环。
cx与循环次数的对相应关系为:
    当cx=0时,循环次数为10000H次。
    当cx在1~FFFFH范围内,循环次数等于cx的值。

这里正常的使用loop实现循环,不可能让循环代码执行零次。
要想执行零次可以这样,对应关系和实现代码如下:

归纳信息为:循环次数取值范围是0~FFFFH。可选择范围内任意次数的循环。
cx与循环次数的对相应关系为:    
    当cx在0~FFFFH范围内,循环次数等于cx的值。

代码:
mov cx,这里是循环次数
inc cx
jmp s1
s:
...
这里写循环代码
...
s1: loop s
kelamoyujuzhen
[第28楼]   [ 回复时间:2015-01-13 21:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-01-04 21:38
0~63,一个64个数,循环64次,所以mov cx,64
trxnb
[第29楼]   [ 回复时间:2022-10-11 11:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2022-10-09 11:54
实验四:
assume cs:code
code segment
       mov ax,0020h
       mov ds,ax

       mov bx,0
       mov cx,64

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

       mov ax,4c00h
       int 21h
code ends
end
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved