|
主题 : : P289 【屏幕向上滚动一行】子程序有疑问 [已解决] |
回复[ 7次 ]
点击[ 537次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-06-21 13:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:18
注册日期:2008-03-14 14:07 |
书上的程序是:
sub4s: push cx
mov cx,160
rep movsb
pop cx
loop sub4s
程序的目的是将第n+1行的数据或指令复制到第n行,但是【我认为】这个程序执行的内容实际上是【始终】将屏幕第二行的数据复制到第一行,我认为程序应该这样写:
sub4s: push cx
mov cx,160
rep movsb
add di,160
add si,160
pop cx
loop sub4s
我错到哪了? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-06-21 15:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
rep movsb 的执行过程中已经有了给di和si相加的操作了。你可以运行你的代码试试看,观察一下现象,应该会出现内容差行的吧。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-06-21 21:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:18
注册日期:2008-03-14 14:07 |
rep movsb 的执行过程中已经有了给di和si相加的操作了。你可以运行你的代码试试看,观察一下现象,应该会出现内容差行的吧。
------------------
回复:"rep movsb 的执行过程中已经有了给di和si相加的操作了",这个是在哪里体现的? | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-06-22 15:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34 |
:"rep movsb 的执行过程中已经有了给di和si相加的操作了",这个是在哪里体现的?
--------------
查rep movsb指令的操作步骤就有了。就如同loop指令,知道了操作的步骤,指令也就明晰了~ | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-06-22 20:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:18
注册日期:2008-03-14 14:07 |
|
|
|
|
|
[第5楼]
[ 回复时间:2008-06-23 00:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:44
信誉值:0
注册日期:2008-04-11 13:33 |
呵呵,我明白楼主的疑惑所在,因为我以前像楼主一样迷惑过。
movsb的功能是从ds:si复制一个字节到es:di所指向的地方。rep是重复前缀,加上这个重复以后,rep movsb就会根据CX中的值,决定进行多少次movsb的操作,并且会自动调整si,di的值,如果设置方向为正的话(即用CLD设定),那么每次复制完一个字节之后,si,di的值都会自动加1,即相当于inc si;inc di,然后继续执行movsb操作,直到cx的值为0停止。
好,现在回来看这个题目,执行160次movsb后(rep决定了要执行movsb重复操作,CX的值决定了执行重复的次数),因为每次movsb之后,si,di都会自动加1,那么160次之后,si,di值就已经加了160了。现在应该明白了吧?如果不明白的话,可以自己上机调试一下,debug查看一下si,di的值。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-06-23 05:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:18
注册日期:2008-03-14 14:07 |
|
|
|
|
|
[第7楼]
[ 回复时间:2008-06-23 05:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:18
注册日期:2008-03-14 14:07 |
此贴由 贴主 于 [ 2008-06-23 05:16 ] 结贴。 结贴原因:问题已解决 | | |