我正在搞乱一些逆向工程,但我不知道如何用十六进制编辑器将jnz更改为jz.我知道它会因系统而异,但我不知道在哪里可以找到这些信息.我正在使用Mac OS X 64位,我用IDA Pro反汇编代码.
我发现flush_dcache_page()在x86架构上的linux内核中没有执行任何操作,如下所示
Line 17 #define flush_dcache_page(page) do {} while (0)
Run Code Online (Sandbox Code Playgroud)
我认为 x86 arch 上有缓存刷新指令“CLFLUSH”,它可以用于此页面刷新。
然而,flush_dcache_page() 并不像上面的源代码那样运行任何 CPU 指令。
特定于类型的Java字节码指令具有单字符前缀以指定该指令所涉及的类型。
在每种情况下,前缀选择都是有意义的,它由该类型的第一个字母组成(布尔型除外,布尔型没有指令前缀)。但是,对象引用前缀似乎不合逻辑,因为o和和r(两个第一字母)都是免费的。相反,对象引用指令a用作其前缀。
对象引用字节码指令为什么前缀a,而不是貌似更合适o还是r?
我目前正在尝试使用汇编来加快Cortex-M0(Freescale KL25Z)上的某些C函数的速度。我对这个最小的测试程序有疑问:
@.syntax unified
.cpu cortex-m0
.text
.global test
.code 16
test:
mov r0, #0
adds r0, r0, #1
bx lr
Run Code Online (Sandbox Code Playgroud)
当我尝试将.s文件汇编为.o文件时,出现此错误
$ arm-none-eabi-as test.s -o test.o
test.s: Assembler messages:
test.s:8: Error: instruction not supported in Thumb16 mode -- `adds r0,r0,#1'
Run Code Online (Sandbox Code Playgroud)
该错误消息对我而言没有任何意义,根据该文档,ADDS是有效的说明。我在stackoverflow上找到了一个可能的答案,并在程序的开头添加了这一行(“ .syntax Unified”有效,就像建议的第二个答案一样)。这样就解决了这个问题,我现在可以使用ADDS和ADCS之类的指令,但是我确实收到了一个新错误:
$ arm-none-eabi-as test.s -o test.o
test.s: Assembler messages:
test.s:7: Error: cannot honor width suffix -- `mov r0,#0'
Run Code Online (Sandbox Code Playgroud)
一些使用立即值的指令会出现此错误。我正在Mac OS 10.9.5上编译。我无法通过Google或Stackoverflow找到解决方案,也不知道如何解决这些错误。
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) …Run Code Online (Sandbox Code Playgroud) 我相对较不熟悉使用英特尔Pin工具进行代码检测,并且正在尝试研究分支预测。具体来说,我想生成所有分支的列表,它们的分支目标以及是否采用它们。我知道SimpleExamples中有用于生成内存地址跟踪的pintool,例如“ pinatrace.cpp”工具,但是我看不到任何适合列出分支的需求的工具。
我可以在示例中使用的某个地方存在现有的pintool,还是需要编写一个新的pintool?
我在Linux计算机上使用pin-2.14。
谢谢!
我们有一个任务,给出了一个2寻址机器的汇编指令:
Run Code Online (Sandbox Code Playgroud)mov 202, 100[r1+]记下最小的汇编程序指令序列,它取代了这条指令(见上文)
哪里
n[rx+]:寄存器增量索引; n是索引值,rx是寄存器x
单个数值:直接寻址/存储
我们应该使用的地址是:
rx - 注册直接寻址[rx] - 注册间接寻址#n - 直接寻址 我们只允许使用add,sub,mov.
我特别不明白#代表什么,为什么我们需要减法,实际上我真的不懂任何东西......任务已经解决,所以我不是在寻找解决方案.我需要解释它是如何完成的,试图自己理解但它不起作用.我希望有人能帮助我,对你这么好!
解:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
Run Code Online (Sandbox Code Playgroud) 我最近遇到了一个错误,其中python库使用某个CPU指令,该指令存在于一个x86处理器上而不存在于另一个x86处理器上,导致程序(非法指令)在一个系统上意外崩溃,但在另一个系统上没有.这让我想到了容器化的好处,为我的软件创建了一个明确定义的运行时环境.但是当我意识到这种情况有多低时,我的大脑停滞不前,而且我无法从推理或互联网阅读中找出解决方案,比如像docker这样的软件隔离程度.
所以我的问题是:请问一个集装箱软件,如码头工人或LXC,能够模拟不上的物理硬件中存在的指令?如果一个容器不能,那么一个完整的虚拟机是否能够处理它?
我以为我会填补空白,因为人们很好奇.
我遇到的具体情况是在尝试将Reed-Solomon擦除编码应用于数据对象时.我正在使用PyECLib库,它通过库实现Vandermonde Reed-Solomon liberasurecode(我相信它反过来使用了jerasure).
这段代码在兼容处理器上运行时没有错误,但Illegal instruction在一些较旧的处理器上产生异常:
from pyeclib.ec_iface import ECDriver
ec_driver = ECDriver(k=1, m=5, ec_type='liberasurecode_rs_vand')
ec_driver.encode(b'foo')
Run Code Online (Sandbox Code Playgroud)
我在多个Linux平台上使用Python 3.6.事情肆虐的一个值得注意的案例是在下面指定的处理器上运行Fedora 25的LXC容器中,但我敢打赌LXC和Fedora几乎没有关系.
我已经尝试了pyeclib 1.4和1.1,并且发生了同样的事情.
这些处理器使我的程序崩溃:
以下是一些工作正常的处理器:
我打印了一个简单java程序的执行字节码,并注意到一些java指令是fast_xxxx而不是普通指令。
我在 JVM 规范中找不到任何相关内容。那么这些指令之间到底有什么区别,口译员何时/为何选择使用这些指令呢?
编辑:字节码是用-XX:TraceBytecodes选项打印的。
我注意到条件移动指令的可扩展性比普通的mov. 例如,它不支持立即数,也不支持寄存器的低字节。
出于好奇,为什么该Cmov命令比一般mov命令的限制性要大得多?例如,为什么两者不允许这样的事情:
mov $2, %rbx # allowed
cmovcc $1, %rbx # I suppose setcc %bl could be used for the '1' immediate case
Run Code Online (Sandbox Code Playgroud)
附带说明一下,我注意到在使用 Compiler Explorer 时, 的使用量比和cmovcc少得多。通常是这种情况吗?如果是,为什么它的使用频率低于其他条件句?jmpccsetcc