JVM规范的某些部分建议操作JSR(Jump SubRoutine),JSR_W(Jump SubRoutine Wide)和RET(从子例程返回)仅可用于类文件版本50.0(JDK 1.6):
(本节假设编译器生成版本号为50.0或更低版本的类文件,以便可以使用jsr指令.另请参见§4.10.2.5.)
然后:
要实现
try-finallyconstruct,生成class版本号为50.0或更低版本的文件的Java编程语言的编译器可以使用异常处理工具和两个特殊指令:jsr("跳转到子例程")和ret("从子例程返回" ").
另一方面,操作码描述本身并未说明这些功能的弃用.引用的文本只说明过去50.0版本中的版本如何,但在此之后并没有明确说明事态.
这个评论(对于询问这种弃用或删除背后的动机的问题)表明了类似的混淆程度,所以显然我并不是唯一一个寻找此问题的人.
在学校,我们一直使用引导程序来运行没有操作系统的独立程序.我一直在研究这个程序,当启用保护模式时,通过直接将操作码和操作数组合为程序中的数据来执行远程跳转.这是为GNU汇编程序:
/* this code immediately follows the setting of the PE flag in CR0 */
.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
Run Code Online (Sandbox Code Playgroud)
首先,为什么要这样做(而不是指令助记符)?
我一直在看英特尔的手册,但我仍然对代码感到困惑.特别是在第2A卷第3-549页,有一个操作码表.相关条目:
EA *cp* JMP ptr16:32 Inv. Valid Jump far, absolute, address given in
operand
实际的操作码是显而易见的,但是第一个字节0x66让我感到困惑.参考英特尔手册中的表格,cp显然意味着将遵循一个6字节的操作数.显然,在接下来的两行中会有6个字节.0x66编码'操作数大小覆盖前缀'.这与表中的cp有什么关系?我原以为cp会有一些十六进制值,而是有这个覆盖前缀.有人可以帮我清楚一下吗?
这是od的转储:
c022 **ea66 0000 0001 0010** ba52 03f2 c030
TARGET_ADDRESS定义为0x00010000.
我也对最后两个字节的重要性感到困惑.然而,这似乎是另一个问题.现在已经很晚了,我一直盯着代码和英特尔手册几个小时,所以我希望我明白我的观点.
谢谢你的期待!
专家,我不知道intel x86 machineCode/assemblyCode转换是singleSide还是BothSide?
意思是:assemblyCode ---> machineCode和machineCode ---> assemblyCode都可用.
由于x86 machineCode的大小不同(1-15字节),并且操作码在(1-3字节)中变化,如何确定一个操作码是1byte还是2byte还是3byte?
我从来没有找到x86指令前缀的例子,如果这里是1byte前缀,如何确定它是前缀还是操作码?
当然,assemblyCode ---> machineCode,助记符+ oprand [w/b]的标识可以通过maping某些MappingTable来确定响应machineCode是什么.
但是,当过程逆转时:
{bbbbbbbb,bbbbbbbb,bbbbbbbb,// instruction1 bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,// instruction2 bbbbbbbb,bbbbbbbb // instruction3}
----> {bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb}
我不知道确定一条指令的长度(大小)的重要位或字节.
任何人都会告诉我如何确定?(操作码的大小,前缀示例.)感谢您的帮助.
我希望有人可以帮我解决这个问题.我最近在我的一些服务器上运行APC,这些服务器只托管一个应用程序,并且它运行良好.不幸的是,我今晚在我的主力网络服务器上运行它,一旦我打开它,我开始从我的wordpress博客"混合".第一个加载的博客会缓存数据库信息,然后加载的每个博客都会收到数据库错误.
我想知道的是,是否有办法以某种方式为缓存添加前缀,以便我可以避免这个问题.我假设缓存会尊重文件之间绝对路径的差异,而不是在多个站点上使用相同的缓存副本... FAIL
提前致谢!
更新
这里要求的是我在/etc/php.d/中使用的apc.ini文件的副本来覆盖默认设置:
/etc/php.d/apc.ini
extension=apc.so
apc.shm_size = 64M
apc.max_file_size = 8M
apc.include_once_override = 1
apc.stat_ctime = 1
Run Code Online (Sandbox Code Playgroud) 我正在开发一个业余的JVM实现,我正在努力确保我对规范中的所有操作码都有测试覆盖率.我已经得到它倒在过去的几年,但nop和swap已经躲避我.例如,这是一个可能使用的简单函数swap:
static int do_swap() {
int a = 56;
int b = 32;
return b%a;
}
Run Code Online (Sandbox Code Playgroud)
但是生成的字节码javac 1.6避免了交换代替本地存储:
static int do_swap();
Code:
0: bipush 56
2: istore_0
3: bipush 32
5: istore_1
6: iload_1
7: iload_0
8: irem
9: ireturn
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在尝试理解一个简单代码的操作码.
代码是:
<?php
$a = TRUE;
$b = FALSE;
if($a && $b) {
echo 'done';
}
Run Code Online (Sandbox Code Playgroud)
上述代码的操作码是:
php -dvld.active=1 test.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 3, Position 2 = 4
Branch analysis from position: 3
Jump found. Position 1 = 5, Position 2 = 7
Branch analysis from position: 5
Jump found. Position 1 = 7
Branch analysis from position: 7
Return found
Branch analysis from position: 7
Branch analysis from position: …Run Code Online (Sandbox Code Playgroud) 我一直工作在一个游戏机模拟器,和我注意到,有一定的操作码存在是永远不会改变的任何值,如LD A, A,LD B, B等,并且还AND A.第一个显然不会改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于将AND与A寄存器进行比较,因此AND A将始终返回A.这些操作有什么用途,或者与NOP每个循环后的操作基本相同?
我和我的教练/实验室助理一样难以理解.
出于某种原因,以下HLSL代码在输出窗口中返回:
error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Invalid operand type for operand #1 of opcode #86 (counts are 1-based).
Run Code Online (Sandbox Code Playgroud)
这是导致问题的HLSL中的函数:
// Projects a sphere diameter large in screen space to calculate desired tesselation factor
float SphereToScreenSpaceTessellation(float3 p0, float3 p1, float diameter)
{
float3 centerPoint = (p0 + p1) * 0.5f;
float4 point0 = mul( float4(centerPoint,1.0f) , gTileWorldView);
float4 point1 = point0;
point1.x += diameter;
float4 point0ClipSpace = mul(point0, gTileProj);
float4 point1ClipSpace = mul(point1, gTileProj);
point0ClipSpace …Run Code Online (Sandbox Code Playgroud) 我在x86-x64中查找了维基百科的x86向后兼容性,它说:
x86-64完全向后兼容16位和32位x86代码.因为完整的x86 16位和32位指令集仍然在硬件中实现而没有任何干预仿真,现有的x86可执行文件运行时没有兼容性或性能损失而重新编码以利用处理器设计的新功能的现有应用程序可以实现性能改进.
所以我测试了一些指令,看看有些指令实际上产生完全不同的操作码(而不仅仅是应用前缀),例如:INC/DEC.看(x86):
\ x40 inc eax
\x48 dec eax
在x86-x64中组装相同的产品时:
\ xff\xc0 inc eax
\ xff\xc8 dec eax
我试图弄清楚其他指令的原因和更多例子,这些指令具有产生不同操作码的相同症状.我熟悉x86-x64中的push,pop,call,ret,enter和leave不可用32位.