假设我想使用以下操作码进行短跳:
EB CB或JMP rel8
“短跳转,RIP=RIP 8位位移符号扩展到64位”
(其中CB是一个字节有符号值,表示EIP寄存器中与方向相关的相对偏移)
也许总是偏移量将偏移量2,因为在这个短跳转中执行时间(参考方向)中的EIP是twobyte指令的基础,但加数总是发生
eb 30=jmp 0x00000032(30)
eb e2=jmp 0xffffffe4(-30)
然后EIP可以是故意相同的方向,因为fe 2是00或EIP。
eb fe=jmp 0x00000000
我发现令人惊讶的是,尽管数字是负数,但过度偏移发生了分叉。但在英特尔我没有发现任何提及(可能是因为3000页)。
英特尔®64和IA-32体系结构软件开发人员手册:第2A卷3-423
一种接近跳跃,其中跳跃范围从当前EIP值限制为-128到127。
然后我考虑了三种可能性:
短跳转采用相对于跳转指令末尾的EIP(两个字节长),并采用单字节操作数,该操作数经过符号扩展并添加到EIP。
rel8与下一条指令的内存地址有关,通过创建两个可执行文件并对其进行反汇编可以很容易地确认这一点:
@label:
jmp @label
nop
它反汇编为(对于ndisasm,在16位、32位和64位代码中是相同的):
EBFE jmp short 0x0
90 nop
然后,另一个可执行文件:
jmp @label
@label:
nop
EB00 jmp short 0x2
90 nop
因此,rel8
总是相对于jmp
之后的下一条指令进行编码。然而,反汇编程序(至少ndisash
和udcli
)相对于jmp
指令本身显示它。这可能会导致一些混乱。
无论是跳转还是跳转,它始终是目标-(source sizeof(instruction))。
dst-end_of_jmp代码
在您的情况下(短跳转),sizeof(指令)
是2。
这一添加背后的原因是因为一旦cpu执行了指令获取阶段,指令指针就已经指向分支之后的指令。rel8或rel32分支位移相对于该EIP/愿逝者安息值。
我在使用Spring Batch时遇到问题,似乎找不到解决方案。 所以,我有一个批量处理一些项目在块(大小10)。我还有一个事务管理器,该批处理使用它来在每个块之后保存处理过的项目。 但是我还想实时保存这些项目的一些进展状态。所以在处理一个项目之前,我想保存一个状态,表明这个项目正在进行中。 我似乎找不到实现这一目标的解决方案。我尝试了以下解决方案: 如果我只是用事务性注释来注释我的状态管理器服务
问题内容: 在java中如何比较两个对象是否相等?何时使用equals和hashcode? 问题答案: 理论(针对语言律师和数学倾向者): (javadoc)必须定义一个等价关系(它必须是自反的,对称的和可传递的)。另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。此外,必须始终返回false。 (javadoc)也必须是一致的(如果未根据修改对象equals(),则它必须保持返回
问题内容: 我想分解一下我拥有的可引导x86磁盘的MBR(前512个字节)。我已将MBR复制到使用 对可以反汇编文件的Linux实用程序有何建议? 问题答案: 您可以使用objdump。根据本文的语法为:
我有一个短代码(outputURL),用于将值输出到URL中。该值从短代码(valueURL)中检索。valueURL输出是文本包装在div中: 我只需要textForURL值,不包括div标记。到目前为止,我只能输出div标记和文本,而不能输出纯文本的干净版本。 这是我的简码函数: 我进行了研究,并能够将其整合在一起,但我不确定我是否朝着正确执行的方向前进。任何能帮助我实现目标的人都将不胜感激。
我所要知道的就是如何将这段代码写得更短(如果可能的话)。有人能看看吗? 我找不到如何以更短的方式编写它,但也许有人知道一种方法来做到这一点。也许我可以将所有这些代码只放在1个If-语句或其他什么中?
问题内容: 我正在学习数组,基本上我有一个可以收集姓氏,名字和分数的数组。 我需要编写一个将姓氏与名字进行比较的方法,以便可以按姓氏开头的字母顺序对列表进行排序,然后,如果两个人的姓氏相同,则将对姓氏进行排序。 我很困惑,因为我书中的所有信息都是在比较数字,而不是对象和字符串。 到目前为止,这是我编写的代码。我知道这是错误的,但至少可以解释我在做什么: 我知道和符号是错误的,但是就像我说的那样,我