我正在阅读一些关于英特尔操作码汇编指令的资料,但我无法理解它遵循操作码字节是什么意思.例如:"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中给出的远,绝对间接地址
我正在使用 godbolt 来组装以下程序:
\n#include <stdio.h>\nvolatile int a = 5;\nvolatile int res = 0;\nint main() {\n res = a * 36;\n return 1;\n}\nRun Code Online (Sandbox Code Playgroud)\n如果我使用-Os优化,生成的代码很自然:
\nmov eax, DWORD PTR a[rip]\nimul eax, eax, 36\nmov DWORD PTR res[rip], eax\nRun Code Online (Sandbox Code Playgroud)\n但如果我使用-O2,生成的代码是这样的:
\nmov eax, DWORD PTR a[rip]\nlea eax, [rax+rax*8]\nsal eax, 2\nmov DWORD PTR res[rip], eax\nRun 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 个加法 …
我最接近组装的是构建我自己的Java类库,它加载类文件并允许您创建,编译和反编译类.在努力完成这个项目时,我想知道Java虚拟机在JIT优化期间如何在运行时实际生成本机机器代码.
它让我思考:如何生成机器代码并在运行时使用汇编执行它,作为奖励,没有JIT编译器库,或"手动"?
assembly ×4
x86 ×2
c ×1
execution ×1
instructions ×1
intel ×1
machine-code ×1
opcode ×1
optimization ×1
x86-64 ×1