标签: instructions

如何使用十六进制编辑器更改指令?

我正在搞乱一些逆向工程,但我不知道如何用十六进制编辑器将jnz更改为jz.我知道它会因系统而异,但我不知道在哪里可以找到这些信息.我正在使用Mac OS X 64位,我用IDA Pro反汇编代码.

assembly hex reverse-engineering ida instructions

5
推荐指数
1
解决办法
8989
查看次数

为什么flush_dcache_page()在linux内核中什么都不做?

我发现flush_dcache_page()在x86架构上的linux内核中没有执行任何操作,如下所示

包括/asm-generic/cacheflush.h

Line 17    #define flush_dcache_page(page) do {} while (0)
Run Code Online (Sandbox Code Playgroud)

我认为 x86 arch 上有缓存刷新指令“CLFLUSH”,它可以用于此页面刷新。

然而,flush_dcache_page() 并不像上面的源代码那样运行任何 CPU 指令。

为什么flush_dcache_page()不在x86架构上运行任何指令?

它是否保证将 dcache 中的页面写入主内存?

linux cpu caching kernel instructions

5
推荐指数
1
解决办法
2226
查看次数

为什么“ a”是对象引用的Java字节码前缀?

特定于类型的Java字节码指令具有单字符前缀以指定该指令所涉及的类型。

在此处输入图片说明 摘自Wikipedia关于Java字节码的条目

在每种情况下,前缀选择都是有意义的,它由该类型的第一个字母组成(布尔型除外,布尔型没有指令前缀)。但是,对象引用前缀似乎不合逻辑,因为o和和r(两个第一字母)都是免费的。相反,对象引用指令a用作其前缀。

对象引用字节码指令为什么前缀a,而不是貌似更合适o还是r

java bytecode instructions

5
推荐指数
1
解决办法
251
查看次数

ARM程序集不能同时使用立即值和ADDS / ADCS

我目前正在尝试使用汇编来加快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)

assembly gcc arm instructions

5
推荐指数
2
解决办法
3957
查看次数

如何使用Intel Pin工具生成分支机构列表?

我相对较不熟悉使用英特尔Pin工具进行代码检测,并且正在尝试研究分支预测。具体来说,我想生成所有分支的列表,它们的分支目标以及是否采用它们。我知道SimpleExamples中有用于生成内存地址跟踪的pintool,例如“ pinatrace.cpp”工具,但是我看不到任何适合列出分支的需求的工具。

我可以在示例中使用的某个地方存在现有的pintool,还是需要编写一个新的pintool?

我在Linux计算机上使用pin-2.14。

谢谢!

linux cpu-architecture instructions intel-pin

5
推荐指数
1
解决办法
1149
查看次数

试图理解这个简短的汇编程序指令,但我不明白

我们有一个任务,给出了一个2寻址机器的汇编指令:

mov 202, 100[r1+]
Run Code Online (Sandbox Code Playgroud)

记下最小的汇编程序指令序列,它取代了这条指令(见上文)

哪里

  • n[rx+]:寄存器增量索引; n是索引值,rx是寄存器x

  • 单个数值:直接寻址/存储

我们应该使用的地址是:

  1. rx - 注册直接寻址
  2. [rx] - 注册间接寻址
  3. #n - 直接寻址

我们只允许使用add,sub,mov.

我特别不明白#代表什么,为什么我们需要减法,实际上我真的不懂任何东西......任务已经解决,所以我不是在寻找解决方案.我需要解释它是如何完成的,试图自己理解但它不起作用.我希望有人能帮助我,对你这么好!

解:

add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
Run Code Online (Sandbox Code Playgroud)

assembly instructions addressing-mode

5
推荐指数
1
解决办法
140
查看次数

像Docker这样的集装箱化软件如何转换CPU指令?

我最近遇到了一个错误,其中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,并且发生了同样的事情.

这些处理器使我的程序崩溃:

  • 英特尔至强X5660
  • 英特尔至强X3363
  • 英特尔至强E5405
  • 英特尔至强X3430
  • 英特尔至强E3110

以下是一些工作正常的处理器:

  • 英特尔至强E31220
  • 英特尔酷睿i7-7500U

emulation virtual-machine instructions docker

5
推荐指数
1
解决办法
223
查看次数

为什么riscv的JAL指令中的立即偏移位顺序改变了?

位域如下图所示

J格式

我不明白对位字段进行重新排序有什么意义。

RISC-V处理器执行该指令时是否有特殊的操作?

encoding instructions riscv

5
推荐指数
1
解决办法
1127
查看次数

java中的普通指令和快速指令有什么区别(例如aload和fast_aload)

我打印了一个简单java程序的执行字节码,并注意到一些java指令是fast_xxxx而不是普通指令。

我在 JVM 规范中找不到任何相关内容。那么这些指令之间到底有什么区别,口译员何时/为何选择使用这些指令呢?

编辑:字节码是用-XX:TraceBytecodes选项打印的。

java jvm bytecode instructions java-11

5
推荐指数
1
解决办法
335
查看次数

为什么 x86 只有 1 种形式的条件移动,而不是立即或 8 位?

我注意到条件移动指令的可扩展性比普通的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

x86 assembly cpu-architecture instructions conditional-move

5
推荐指数
1
解决办法
2024
查看次数