我听说用jmp -2我们可以做一个无限的循环。这听起来很奇怪,但是在解释了一个相对跳转需要一个字节之后,下一个指令地址(eip)将比jmp地址少两个字节。所以,我决定实现它,但我无法使它发挥作用。
这是我的源代码:
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)。但是我尝试了这个,结果是一样的(分割错误)。我怎么能做那种无限循环呢?
发布于 2016-06-29 17:07:57
jmp -2将跳到地址 -2 (或0ff..fffeh),至少在NASM中是这样的.
据我所知,直接跳转的操作数始终是目标地址,将相对直接(在操作码中编码)的计算留给汇编程序处理。
简而言之,如果将jmp SHORT -2放在偏移量为0,则将其组装为EB FC,使用新的语法,可以看到2+(-4) = -2中的jmp <-4>。
如果要手工编写操作码,则需要恢复到伪指令db、dw等。
如果您只想在没有标签的情况下循环,则可以始终使用$符号,该符号引用当前指令/符号的偏移量/地址/计数器。
因此,jmp <-2>就是一个简单的jmp $,对于位于零的跳转,它等同于jmp 0,并如您所期望的那样组装为EB FE。
$是一个符号,您可以在其上执行普通算术:jmp $-2是EB FC或jmp <-4>。
https://stackoverflow.com/questions/38105432
复制相似问题