所以我无法理解跳跃的实际效果,
让我举个例子, 我想要的是循环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 ?
答案 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指令依赖于相对偏移而不是绝对值,则汇编器会为您计算出多少正或负线偏移量。地址。如果该偏移量太大,汇编器将在汇编时生成错误消息。