Assembly 汇编无限循环(jmp-2)
我听说用jmp-2我们可以做一个无限循环。这听起来很奇怪,但在解释了相对跳转需要一个字节后,下一个指令地址(eip)将比jmp地址少2个字节。因此,我决定实施这一计划,但我无法让它发挥作用。Assembly 汇编无限循环(jmp-2),assembly,nasm,infinite-loop,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
这是我的源代码:
SECTION .text
global main
main:
push ebp
mov esp, ebp
jmp 0x-2
leave
ret
并用它来编译:
nasm -f elf asmloop.asm -o objasmloop.o
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
主函数的汇编程序代码转储:
0x08048060:推送%ebp
0x08048061:mov%ebp,%esp
0x08048063:jmp 0xfffffffe
0x08048068:离开
0x08048069:ret
我能够在这个转储中看到jmp地址和leave地址之间的实际差异实际上是5个字节(它没有使用短引用jmp)。但是我试着用这个来做,结果是一样的(分割错误)。如何执行这种无限循环?
jmp-2
将跳转到地址-2(或0ff..fffeh
),至少在NASM中是这样。据我所知,直接跳转的操作数始终是目标地址,将编码在操作码中的相对立即数的计算留给汇编程序 简而言之,
jmp short-2
如果放置在偏移量0处,则组装为EB FC
,可以看到,由于2+(-4)=-2,因此具有新语法,如jmp
如果您想手工编写操作码,则需要恢复到伪指令db
、dw
等
如果您只想在没有标签的情况下循环,则始终可以使用$
符号,该符号表示当前指令/符号的偏移量/地址/计数器。因此,
jmp
只是一个jmp$
,对于放置在零处的跳转而言,等于jmp 0
,并按照您的预期组装为EB-FE
作为
$
符号,您可以对其执行普通算术:jmp$-2
是EB FC
或jmp
jmp-2
将跳转到地址-2(或0ff..fffeh
),至少在NASM中是这样。据我所知,直接跳转的操作数始终是目标地址,将编码在操作码中的相对立即数的计算留给汇编程序 简而言之,
jmp short-2
如果放置在偏移量0处,则组装为EB FC
,可以看到,由于2+(-4)=-2,因此具有新语法,如jmp
如果您想手工编写操作码,则需要恢复到伪指令db
、dw
等
如果您只想在没有标签的情况下循环,则始终可以使用$
符号,该符号表示当前指令/符号的偏移量/地址/计数器。因此,
jmp
只是一个jmp$
,对于放置在零处的跳转而言,等于jmp 0
,并按照您的预期组装为EB-FE
作为
$
符号,您可以对其执行普通算术:jmp$-2
isEB FC
或jmp
您使用的是什么汇编程序?其中一些要求您明确指示短跳转,而不是近跳转。您的反汇编没有显示代码字节,因此我无法判断,除了jmp short-2
应该只有2个字节(EB-FE
)。除此之外,还不清楚您为什么要这样做。一个绝对不执行任何操作、永远无法摆脱困境的无限循环有什么好处?@CodyGray:从OPs问题来看,他使用的是NASMDoes NASM支持0x-2
?这太奇怪了。是的,我相信0x
和0x0
是一样的,所以0x-2
应该是0x0-2
或者干脆是-2
@MichaelPetch啊,这至少有点道理。让我进一步认为OP有点困惑,因为这似乎是一种非常复杂的编写-2
的方式。您使用的是什么汇编程序?其中一些要求您明确指示短跳转,而不是近跳转。您的反汇编没有显示代码字节,因此我无法判断,除了jmp short-2
应该只有2个字节(EB-FE
)。除此之外,还不清楚您为什么要这样做。一个绝对不执行任何操作、永远无法摆脱困境的无限循环有什么好处?@CodyGray:从OPs问题来看,他使用的是NASMDoes NASM支持0x-2
?这太奇怪了。是的,我相信0x
和0x0
是一样的,所以0x-2
应该是0x0-2
或者干脆是-2
@MichaelPetch啊,这至少有点道理。让我进一步认为OP有点困惑,因为这似乎是一种非常复杂的编写-2
的方式。谢谢@Margaret,这非常有帮助;)。谢谢你@Margaret,这很有帮助;)。
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