Assembly 如何在不使用标签的情况下跳转到特定行?

Assembly 如何在不使用标签的情况下跳转到特定行?,assembly,x86-16,Assembly,X86 16,假设我有一个返回的调用函数,我能使它返回到返回地址之前的x行吗?例如 call foo --> line 72 - calling bar will return here. mov ax,1 call bar --> line 74 bar: mov ax,2 ret (-2) 我的目标是创建一个可调用函数,该函数将始终返回到调用地址之前的两行,而不必使用十亿个标志和标签。你不能,x86指令是可变长度的。在调用之前,您无法知道要将您的回信地址减少多少,只需返回2条指令即可 即使

假设我有一个返回的调用函数,我能使它返回到返回地址之前的x行吗?例如

call foo --> line 72 - calling bar will return here.
mov ax,1
call bar --> line 74

bar:
mov ax,2
ret (-2)

我的目标是创建一个可调用函数,该函数将始终返回到调用地址之前的两行,而不必使用十亿个标志和标签。

你不能,x86指令是可变长度的。在调用
之前,您无法知道要将您的回信地址减少多少,只需返回2条指令即可

即使您愿意编写反汇编程序/解码器,也无法明确地向后解码x86指令。e、 g.如果返回一个字节,看到一个
0x90
,则不知道这是NOP还是
add dx,0x9000
的最后一个字节

像GDB这样的调试器所做的就是从已知的函数开始标签解码转发。但我认为,扫描一个符号表并进行分解对于你所做的任何事情来说都太重了


我唯一想到的是你的调用序列非常严格,所以总是固定的字节数;e、 g.在这里,您在调用条之前使用了两条3字节指令(
callrel16
mov-ax,imm16
)。调用栏本身也是3个字节

或者总是在返回地址之前返回一个固定的字节数,并让调用者选择在该窗口中放入哪个/多少指令


顺便说一句,这样做的方法是修改堆栈上的返回地址:

pop ax            ; could use any register that your function destroys
sub ax, 9
push ax
ret
或者相对于
BP
对其进行寻址,如果已将BP设置为帧指针,如
子字[BP+2],9


如果您想在调用前使用较短的指令,如
mov-cx,bx
,请参阅,了解在不添加更多指令的情况下延长指令长度的技术。e、 g.您可以改为使用
leacx、[byte 0+bx]
(NASM语法:
byte 0
强制执行
0
的disp8,因此编码为
8D 4F 00