相关疑难解决方法(0)

如何阅读英特尔操作码表示法

我正在阅读一些关于英特尔操作码汇编指令的资料,但我无法理解它遵循操作码字节是什么意思.例如:"cw","cd","/ 2","cp","/ 3".请给我一个提示是什么意思或在哪里可以找到完整的参考?提前致谢!

E8 cw CALL rel16相对于下一条指令调用near,relative,displacement

E8 cd CALL rel32相对于下一条指令调用near,relative,displacement

FF / 2 CALL r/m16调用r/m16中给出的接近绝对间接地址

FF / 2 CALL r/m32调用r/m32中给出的接近绝对间接地址

9A cd CALL ptr16:16调用操作数中给出的far,absolute,address

9A cp CALL ptr16:32调用操作数中给出的far,absolute,address

FF / 3 CALL m16:16调用m16:16中给出的远,绝对间接地址

FF / 3 CALL m16:32调用m16:32中给出的远,绝对间接地址

x86 assembly intel machine-code opcode

15
推荐指数
3
解决办法
4909
查看次数

汇编为什么是“lea eax, [eax + eax*const]; shl eax, eax, const;” 根据 gcc -O2,组合速度比“imul eax, eax, const”更快?

我正在使用 godbolt 来组装以下程序:

\n
#include <stdio.h>\nvolatile int a = 5;\nvolatile int res = 0;\nint main() {\n    res = a * 36;\n    return 1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我使用-Os优化,生成的代码很自然:

\n
mov     eax, DWORD PTR a[rip]\nimul    eax, eax, 36\nmov     DWORD PTR res[rip], eax\n
Run Code Online (Sandbox Code Playgroud)\n

但如果我使用-O2,生成的代码是这样的:

\n
mov     eax, DWORD PTR a[rip]\nlea     eax, [rax+rax*8]\nsal     eax, 2\nmov     DWORD PTR res[rip], eax\n
Run Code Online (Sandbox Code Playgroud)\n

因此,它不是乘以 5*36,而是执行 5 -> 5+5*8=45 -> 45*4 = 180。我认为这是因为 1 imul 比 1 lea + 1 左移慢。

\n

但在 lea 指令中,需要计算rax+rax*8,其中包含 1 个加法 …

c optimization assembly x86-64 cpu-architecture

6
推荐指数
1
解决办法
711
查看次数

/ 4在FF/4中的含义是什么?

通常在x86文档中引用的一个站点有一些带有斜杠和数字的指令代码.例如,jmp接近绝对间接给出FF /4,而jmp远绝对间接给出FF /5.

什么的/4/5是什么意思?

为了运行一个快速的小测试,我附加了一个32位进程,分配了一点内存并插入了汇编程序jmp dword ptr[0x12345678]; 生成的字节码是FF 25 78563412.我理解地址的结尾,但是如何25/4/5

我的猜测是我生成了一个jmp远,并且/5意味着有五个字节作为参数(地址为4个字节+ 1个字节25).我仍然对它的来源感到困惑25.

x86 assembly

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

我怎样才能在运行时生成并执行机器代码?

我最接近组装的是构建我自己的Java类库,它加载类文件并允许您创建,编译和反编译类.在努力完成这个项目时,我想知道Java虚拟机在JIT优化期间如何在运行时实际生成本机机器代码.

它让我思考:如何生成机器代码并在运行时使用汇编执行它,作为奖励,没有JIT编译器库,或"手动"?

assembly code-generation execution instructions

-1
推荐指数
3
解决办法
1284
查看次数