汇编无限循环(jmp -2)

时间:2016-06-29 16:35:37

标签: assembly nasm infinite-loop

我听说使用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)。但我尝试了这个,结果是相同的(分段错误)。我怎样才能进行这种无限循环?

1 个答案:

答案 0 :(得分:5)

jmp -2将跳转到地址 -2(或0ff..fffeh),至少在NASM中。 据我所知,直接跳转的操作数始终是目标地址,将在操作码中编码的相对 immediate 的计算留给汇编程序。

简而言之,jmp SHORT -2如果放置在偏移0处,则汇编为EB FC,使用新语法可以看到jmp <-4>,因为2 +( - 4)= - 2。

如果要制作操作码,则需要恢复伪指令dbdw等。

如果您只想循环而没有标签,则可以始终使用$符号,该符号指向当前指令/符号的偏移量/地址/计数器。
因此,jmp <-2>只是jmp $,对于位于零的跳转,相当于jmp 0,并按预期汇编为EB FE

作为$符号,您可以对其执行普通算术:jmp $-2EB FCjmp <-4>