0

所以我很难理解跳跃的实际工作原理,

让我举个例子,如果DX的值> 5,我想要循环L1并跳转到L2,所以我这样做了,但是代码如何知道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

如果我想执行多个操作,即 A、B、C,在跳转到 L2 之后,如何在第三次操作后终止 L2?

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

3 回答 3

2

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

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

于 2012-09-21T16:55:03.017 回答
2

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

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

但是,如果您想转到示例的 L1 标签,您可以JMP L1在 L2 的末尾添加一条指令。

于 2012-09-21T16:56:34.837 回答
1

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

  • 如果 L2 代码是一个函数,即如果您想在执行完 L2 后返回调用 L2 的函数(调用者函数),您希望使用 CALL 到达 L2 的第一条指令。L2 中的最后一条指令将是返回。

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

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

于 2012-09-21T17:04:52.423 回答