首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装配无限回路(jmp -2)

装配无限回路(jmp -2)
EN

Stack Overflow用户
提问于 2016-06-29 16:35:37
回答 1查看 12.1K关注 0票数 3

我听说用jmp -2我们可以做一个无限的循环。这听起来很奇怪,但是在解释了一个相对跳转需要一个字节之后,下一个指令地址(eip)将比jmp地址少两个字节。所以,我决定实现它,但我无法使它发挥作用。

这是我的源代码:

代码语言:javascript
复制
SECTION .text

global main
main:
   push   ebp
   mov    esp, ebp
   jmp    0x-2
   leave
   ret

并将其用于编译:

代码语言:javascript
复制
nasm -f elf asmloop.asm -o objasmloop.o 

代码语言:javascript
复制
 ld -m elf_i386 -o execasmloop -e main objasmloop.o  

我也尝试使用十六进制值-2 (FE),但仍然得到分割错误。毕竟,我看了一下GDB的反汇编:

代码语言:javascript
复制
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)。但是我尝试了这个,结果是一样的(分割错误)。我怎么能做那种无限循环呢?

EN

回答 1

Stack Overflow用户

发布于 2016-06-29 17:07:57

jmp -2将跳到地址 -2 (或0ff..fffeh),至少在NASM中是这样的.

据我所知,直接跳转的操作数始终是目标地址,将相对直接(在操作码中编码)的计算留给汇编程序处理。

简而言之,如果将jmp SHORT -2放在偏移量为0,则将其组装为EB FC,使用新的语法,可以看到2+(-4) = -2中的jmp <-4>

如果要手工编写操作码,则需要恢复到伪指令dbdw等。

如果您只想在没有标签的情况下循环,则可以始终使用$符号,该符号引用当前指令/符号的偏移量/地址/计数器。

因此,jmp <-2>就是一个简单的jmp $,对于位于零的跳转,它等同于jmp 0,并如您所期望的那样组装为EB FE

$是一个符号,您可以在其上执行普通算术:jmp $-2EB FCjmp <-4>

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38105432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档