我听说使用jmp -2我们可以进行无限循环。这听起来很奇怪,但在解释相对跳转需要一个字节后,下一个指令地址(eip)将比jmp地址小2个字节。所以,我决定实施这个,但我不能让它发挥作用 这是我的源代码:
SECTION .text
global main
main:
push ebp
mov esp, ebp
jmp 0x-2
leave
ret
用它来编译:
nasm -f elf asmloop.asm -o objasmloop.o
ld -m elf_i386 -o execasmloop -e main objasmloop.o
我也尝试使用-2(FE)的十六进制值,但仍然会出现分段错误。 毕竟,我看了一下GDB的反汇编:
Dump of assembler code for function main:
0x08048060 <+0>: push %ebp
0x08048061 <+1>: mov %ebp,%esp
0x08048063 <+3>: jmp 0xfffffffe
0x08048068 <+8>: leave
0x08048069 <+9>: ret
我能够在这个转储上看到jmp地址和离开地址之间的实际差异实际上是5个字节(它没有使用短引用jmp)。但我尝试了这个,结果是相同的(分段错误)。我怎样才能进行这种无限循环?
答案 0 :(得分:5)
jmp -2
将跳转到地址 -2(或0ff..fffeh
),至少在NASM中。
据我所知,直接跳转的操作数始终是目标地址,将在操作码中编码的相对 immediate 的计算留给汇编程序。
简而言之,jmp SHORT -2
如果放置在偏移0处,则汇编为EB FC
,使用新语法可以看到jmp <-4>
,因为2 +( - 4)= - 2。
如果要制作操作码,则需要恢复伪指令db
,dw
等。
如果您只想循环而没有标签,则可以始终使用$
符号,该符号指向当前指令/符号的偏移量/地址/计数器。
因此,jmp <-2>
只是jmp $
,对于位于零的跳转,相当于jmp 0
,并按预期汇编为EB FE
。
作为$
符号,您可以对其执行普通算术:jmp $-2
为EB FC
或jmp <-4>
。