. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一道检测题的问题  [已解决] 回复[ 5次 ]   点击[ 670次 ]  
borisyue
[帖 主]   [ 发表时间: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了,望高手讲解一下
borisyue
[第1楼]   [ 回复时间:2008-11-02 12:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41
顶!~没人答复啊.....救命9999~
musicvs
[第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处执行.

我也说不清楚,书上讲解得很详细~
xue4485355
[第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
borisyue
[第4楼]   [ 回复时间:2008-11-05 22:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41
明白.谢谢!~原来只搞位移的.而不是冲着标号去的
borisyue
[第5楼]   [ 回复时间:2008-11-28 10:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-10-16 23:41
此贴由 贴主 于 [ 2008-11-28 10:17 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(musicvs):8分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved