|
主题 : : 实验4 第一小题正解 [待解决] |
回复[ 31次 ]
点击[ 2274次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-04-26 20:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-03-25 22:45 |
|
|
|
|
|
[第2楼]
[ 回复时间:2011-05-04 19:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-04-28 17:19 |
|
|
|
|
|
[第3楼]
[ 回复时间:2011-05-19 10:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-03-08 09:53 |
|
|
|
|
|
[第4楼]
[ 回复时间:2011-05-26 05:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-05-26 05:26 |
0-3fh 你们算算是不是40嘛 呵呵 也就是 0~63嘛 不是64个数吗? | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-08-17 17:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-08-07 15:14 |
|
|
|
|
|
[第6楼]
[ 回复时间:2011-08-17 18:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
除了两头必不可省的四行,楼主想想能不能精简到7行以内? | | |
|
|
|
|
[第7楼]
[ 回复时间:2011-08-17 18:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
|
|
|
|
|
[第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行,不知道还能不能再精简 | | |
|
|
|
|
[第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次 | | |
|
|
|
|
[第10楼]
[ 回复时间:2011-08-21 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-08-06 18:12 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第12楼]
[ 回复时间:2011-09-07 23:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04 |
回复:[第9楼]
------------------
loop循环类似于高级语言中的do while循环,不管条件与否都会执行第一次 所以cs的值应该是63 | | |
|
|
|
|
[第13楼]
[ 回复时间:2011-09-07 23:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04 |
回复:[第12楼]
------------------
是cx的值是63 打错了 | | |
|
|
|
|
[第14楼]
[ 回复时间:2011-09-07 23:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
是六十四,因为是先减1再比较的,当cx为1时遇到loop就跳出循环了。 | | |
|
|
|
|
[第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应该是正确的 | | |
|
|
|
|
[第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. | | |
|
|
|
|
[第17楼]
[ 回复时间:2011-09-28 07:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-09-27 01:02 |
另外由于cx是在执行后才执行减一运算的,所以循环次数应该是1~N 即N次 即cx中的值就是循环次数 以上是个人学习成果,希望对大家有一定的帮助!
~至此 敬礼 | | |
|
|
|
|
[第18楼]
[ 回复时间:2011-10-05 01:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41 |
回复:[第17楼]
------------------
嗯,循环运行多少次,就设置多少个cx | | |
|
|
|
|
[第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就未被复制过去
----有错请指正 | | |
|
|
|
|
[第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看似比较符合常理 | | |
|
|
|
|
[第21楼]
[ 回复时间:2012-10-31 16:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-17 22:10 |
回复15楼那位朋友 你不知道LOOP 指令执行的先执行的是 (cx)=(cx)-1,然后判断吗? | | |
|
|
|
|
[第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. | | |
|
|
|
|
[第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
忘大虾们指点下 | | |
|
|
|
|
[第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(条件)循环。 | | |
|
|
|
|
[第25楼]
[ 回复时间:2014-03-10 13:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-04-07 16:06 |
回复:[第11楼]
------------------
严格来说第七行可以是 “mov [bx],bx”,会覆盖,但不会影响结果,因为bx的高八位一直是零,不足之处是效率较低。 | | |
|
|
|
|
[第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次。 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第28楼]
[ 回复时间:2015-01-13 21:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2015-01-04 21:38 |
0~63,一个64个数,循环64次,所以mov cx,64 | | |
|
|
|
|
[第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 | | |