了解汇编语言中的跳转(TASM)

时间:2012-09-21 16:48:46

标签: assembly tasm

所以我无法理解跳跃的实际效果,

让我举个例子, 我想要的是循环L1并跳转到L2,如果DX的值>五 所以我这样做,但代码如何知道在L2中必须读取多少行代码?

MOV DX,0
    MOV CX,10
L1:
    ADD DX,30H
    MOV AH,02H
    INT 21H
    SUB DX,30H
    ADD DX,1        
    CMP DX,5
    JA L2

LOOP L1

跳过L2之后如果我想执行多个操作,即A,B,C,我怎样才能在第三次操作后终止L2?

L2:
   A
   B
   C
   ;Go back into the Loop L1 , How can i terminate L2 here ?

3 个答案:

答案 0 :(得分:2)

我的80x86汇编存储器有点旧(20年),但我想如果你不修改CX,你可以从L2调用一个LOOP L1:代码。

如果您处于LOOP的末尾(因为LOOP减少了CX),如果您的JA到L2是第10次,它将不会返回到L1。

答案 1 :(得分:2)

CPU将一次读取并执行每条指令。控制流将是线性的,除非它遇到修改流程的指令(例如你的跳转指令)。

如果你想改变流程然后返回到原来的位置,你必须使用CALL指令而不是跳转,然后在CPU执行RET时返回指令。

但是,如果你想转到你的例子的L1标签,你可以在L2的末尾加上JMP L1指令。

答案 2 :(得分:1)

我不知道这种语言的细节,但所有汇编语言基本上都是一样的:

  • 如果L2代码是一个函数,即如果要在执行完L2后返回到调用L2的函数(调用函数),则需要使用一个L2来获取L2的第一条指令呼叫。 L2中的最后一条指令就是返回。

  • 相反,如果在L2之后你总是想回到L1的开头,那么你必须使用无条件的JUMP到L2代码最后的标签L1。

    < / LI>

通常,在大多数汇编语言中,只有JUMP或CALL到标签:如果您使用的JUMP或CALL指令依赖于相对偏移而不是绝对值,则汇编器会为您计算出多少正或负线偏移量。地址。如果该偏移量太大,汇编器将在汇编时生成错误消息。