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