程序运行到某处,需要根据变量I(integer)型,让cpu指针跳转i个单位(因该理解成跳过i条指令?)继续执行。可能不可能的?给我源代码吧,我不会汇编。

解决方案 »

  1.   

    asm
        mov eax, n
        add eax, 8
        cmp eax, 000000ffh //比较
        jnz @@exit //不相等则跳转
        mov eax, 0a0b0c0dh
      @@exit:
        call xxxxx
      end;
      

  2.   

    call是调用指令,调用又分段内调用和段间调用!段间调用要考虑段寄存器!还分直接调用和间接调用!直接调用call后面是地址,间接调用要看使用何种寻址方式!调用前将后一条指令的地址存如堆栈,调用后遇到ret返回保存的地址!像BASIC中的call和return!使用当前地址加一数字就能实现你要的功能!当然也可以是直接地址寻址!jnz是条件跳转指令,因为cmp指令会影响零标志位寄存器ZF,而jnz(可理解为Jump not ZF),结合True,False的数字表示很好理解的!其他条件跳转指令自己去学习!汇编还是要学点的,现在大学计算机课程里都有汇编课程!如果一点不懂会在竞争时处于劣势!实际应用中,有时候分析程序中的问题也无法深入!
      

  3.   

    给出,一个类似实现你的要求的高级语言版本的例子,因为简单的地址相加是很难控制的,很可能编译器一修改,你的程序就会跳错地方,。因为指令长度会不一样。procedure TForm1.Button3Click(Sender: TObject);
    var
      I,L:Integer;
    Label l1,L2,L3,L4;
    begin
      I:=Random(3);
      case I of
        0:goto L1;
        1:goto L2;
        2:Goto L3;
        3:goto L4;
      end;
      L1:
      begin
        ShowMessage('0');
        Exit;
      end;
      L2:
      begin
        ShowMessage('1');
        Exit;
      end;
      L3:
      begin
        ShowMessage('2');
        Exit;
      end;
      L4:
      begin
        ShowMessage('3');
        Exit;
      end;
    end;
      

  4.   

    我也认为使用GoTo比较好,可以不出现越界
      

  5.   

    跳转很简单,难在跳到哪?
    当前IP+N,这个N很难。不知道N条指令是几个字节。