|
主题 : : 一道检测题的问题 [已解决] |
回复[ 5次 ]
点击[ 670次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-11-02 00:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41 |
mov ax,2
mov cx,3
s: add ax,2
s1:loop s
mov di,offset s1
mov si,offset s3
mov ax,cs:[di]
mov cs:[si],ax
mov ax,1
mov cx,3
s2: add ax,2
s3: nop
nop
所有指令执行完后ax的值为_____。
先把这个 mov di,offset s1
mov si,offset s3
mov ax,cs:[di]
mov cs:[si],ax这些执行完后得出来的代码是
mov ax,2
mov cx,3
s: add ax,2
s1:loop s
mov di,offset s1
mov si,offset s3
mov ax,cs:[di]
mov cs:[si],ax
mov ax,1
mov cx,3
s2: add ax,2
s3: loop s
nop
这样的话在循环里有MOV CX,3 CX一直不会为零,不是死循环了吗?另外不明白AX的值为7了,望高手讲解一下 | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-11-02 12:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41 |
|
|
|
|
|
[第2楼]
[ 回复时间:2008-11-04 12:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:14
注册日期:2008-08-20 11:21 |
呵呵,楼主是loop指令没有弄清楚它的原理...
它只认偏移位移,是不认标志的...
首先,第一次出现loop时:
s: add ax,2
s1:loop s
这里loop s的作用是,先cx=cx-1,如果cx不为零,就返回到s处执行指令.但实际上,它并不是返回到s,而是根据他们之间的位移来跳转的...
所以,后面出现的loop:
s2: add ax,2
s3: loop s
这里的作用是,先cx=cx-1,如果cx不为零,就根据位移来跳转,但是这个位移和第一次出现loop时的位移是一样的...原因是,这个程序是直接复制指令,所以机器码都没变,转移的位移也就不会变,所以,它只会跳转到s2处执行.
我也说不清楚,书上讲解得很详细~ | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-11-05 19:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-09-29 18:48 |
mov ax,2
mov cx,3
s: add ax,2
s1:loop s
mov di,offset s1
mov si,offset s3
mov ax,cs:[di]
mov cs:[si],ax
mov ax,1
mov cx,3
s2: add ax,2
s3: nop
nop
所有指令执行完后ax的值为_____。
先把这个 mov di,offset s1
mov si,offset s3
mov ax,cs:[di]
mov cs:[si],ax这些执行完后得出来的代码是
mov ax,2
mov cx,3
s: add ax,2
s1:loop s
mov di,offset s1
mov si,offset s3
mov ax,cs:[di]
mov cs:[si],ax
mov ax,1
mov cx,3
s2: add ax,2
s3: loop s
nop
答案是 X=7
最后的 LOOP S表上向上2个字节单位的位移 只能到 S2到不了S 因此1+2+2+2=7 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-11-05 22:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41 |
|
|
|
|
|
[第5楼]
[ 回复时间:2008-11-28 10:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41 |
此贴由 贴主 于 [ 2008-11-28 10:17 ] 结贴。 结贴原因:问题已解决 | | |
|