Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编无限循环(jmp-2)_Assembly_Nasm_Infinite Loop - Fatal编程技术网

Assembly 汇编无限循环(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

我听说用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
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
is
EB 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