Assembly 如何使用这些指令使用跳转汇编?

Assembly 如何使用这些指令使用跳转汇编?,assembly,x86,machine-code,Assembly,X86,Machine Code,我知道组装的跳跃基本上是从一个位置到另一个位置 说我们有 804828f: 74 05 je XXXXXXX 8048291: e8 1e 00 00 00 call 80482b4 根据这本书,我真正做的就是将0x05添加到8048291,这将产生8048291,但是我对这里的命令的要求感到困惑。根据这本书,操作数je是等于/0的je 然后我们有一个复杂的问题,我真的很难把我的头绕过去 8048357: 72 e7 jb

我知道组装的跳跃基本上是从一个位置到另一个位置

说我们有

804828f: 74 05            je XXXXXXX
8048291: e8 1e 00 00 00 call 80482b4 
根据这本书,我真正做的就是将0x05添加到8048291,这将产生8048291,但是我对这里的命令的要求感到困惑。根据这本书,操作数je是等于/0的je

然后我们有一个复杂的问题,我真的很难把我的头绕过去

8048357: 72 e7                        jb XXXXXXXX
8048359: c6 05 10 a0 04 08 01 movb $0x1,0x804a010
据此,由于e7是-25的1位签名代表, jb的地址是8048340

那。对我来说没有意义。完全首先,如果某个东西是有符号的,并且是1字节,那么它的最大值不应该是2吗?其次,如果某物是-25,那么为什么原点是8048340?如果没有19人参与,我们是如何从59人变成40人的

我认为答案是:

我想了一秒钟,但要从十六进制25中得到19,我是否应该将16除以25,取其余数9,然后将9与10相加,这在本例中是1的意思


不过,我真的对有符号单字节值感到迷茫。

0x05
+
0x8048291
0x8048296
。你好像加了零,不是5。它是对5字节
调用的有条件跳转,如果设置了ZF,则将执行该跳转。()

x86分支位移相对于分支指令的结束,即下一条指令的开始

地址是十六进制的,而不是十进制的,即使它们在反汇编输出中不是以
0x
开头。请注意,
804828f
包括作为数字的
f
。位移为1字节,而不是1位,因此其范围为-128到+127。在rel8超出范围的情况下,rel32跳转有不同的编码


英特尔的手册解释了编码(2的补码扩展相对位移)和范围:

汇编中的分支是灵活的,从某种意义上说,您可以按任何顺序排列代码块。也可以通过跳到同一块来合并分支。要将其存档,指令必须能够向前和向后跳转。下面的示例显示了向后跳跃的用法

073000:  bf 08 00 00 00          mov    edi, 0x8
073005:  31 c0                   xor    eax, eax
073007 <loop>:
073007:  01 f8                   add    eax, edi
073009:  83 ef 01                sub    edi, 0x1
07300c:  75 f9                   jne    073007 <loop>
07300e:
当第一个数字>=8时,最高位为1,因此数字为负数


65536是2^16。

但是等等,f9是07300摄氏度。“07300E如何适应这种情况?”参议院,见下面彼得的答案。该编号未添加到跳转指令的地址(07300C);它被添加到跳转指令(07300E)之后的地址中。这更有意义。
Unsigned numbers:
0x1234 =  1*16^3 +  2*16^2 + 3*16^1 +  4 = 4660 
0x3420 =  3*16^3 +  4*16^2 + 2*16^1 +  0 = 13344 
0x0A0B =  0*16^3 + 10*16^2 + 0*16^1 + 11 = 2571   (A is 10; B is 11)
0x8000 =  8*16^3 +  0*16^2 + 0*16^1 +  0 = 37268
0xFF7A = 15*16^3 + 15*16^2 + 7*16^1 + 10 = 65402  (F is 15)

Signed numbers:
0x1234 =   ; positive because 1 is smaller than 8
0x3420 =   ; positive because 3 is smaller than 8 
0x0A0B =   ; positive because 0 is smaller than 8
0x8000 =   ; negative because 8 is NOT smaller than 8
0xFF7A =   ; negative because F (15) is NOT smaller than 8

Signed numbers:
0x1234 = 4460  ; positive numbers are calculated like unsigned number
0x3420 = 13344 ; positive numbers are calculated like unsigned number
0x0A0B = 2571  ; positive numbers are calculated like unsigned number
0x8000 = 32768 - 65536 = -32768 ; a simple way to calculate negative number
0xFF7A = 65402 - 65536 = -134 ; a simple way to calculate negative number