现在的处理器大多是 32 位或 64 位。这意味着它们处理的指令具有这个大小。
我们经常听说 32 位操作系统的 RAM 限制为 4GB=(2^32 位),因为 RAM 地址的长度需要保存在 32 位内。
但事实上,当我们查看指令的外观时,您通常需要不到 32 位来加载一个字。
以 x86mov
指令为例,您有一个操作码、一个源地址和一个目标地址。
我的问题是,我们如何才能从 32 位长的地址加载某些内容?
我们是否总是需要在内存中某个位置有一个指向该地址的指针,该位置具有可在指令中使用的较小地址?
谢谢
所以我一直在阅读一些用于学习目的的汇编代码,并且遇到了这两个指令:
add register, value
add register, 'value' ; Where the value is now in single quotes
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别?
在我被发现之前,如果这恰好是重复的话.我在这里问过,因为我不确切知道Google应该回答这个问题.
在 RISC-V 手册中写了这个指令:
C.LUI 将非零的 6 位立即数字段加载到目标寄存器的第 17-12 位,清除低 12 位,并将第 17 位符号扩展到目标的所有高位
由此我得出结论,立即数应该是 6 位,但是后来我正在编译一些东西,可以编译这一行,但是立即数的宽度超过 6 位,所以我很困惑
c.lui x14,0xffff8
想象以下代码:
uint64_t x = 0x81C6E3292A71F955ULL;
uint32_t y = (uint32_t) (x >> 32);
Run Code Online (Sandbox Code Playgroud)
y
接收 64 位整数的较高 32 位部分。我的问题是是否存在任何内在函数或任何 CPU 指令可以在不进行移动和移位的情况下在单个操作中执行此操作?
至少铛(在上面挂尝试,它-在线)创建两个指令mov rax, rdi
,并shr rax, 32
对于这一点,所以无论是铛不会做这样的优化,或不存在这样的特殊指令。
如果存在像movhi dst_reg, src_reg
.
我最接近组装的是构建我自己的Java类库,它加载类文件并允许您创建,编译和反编译类.在努力完成这个项目时,我想知道Java虚拟机在JIT优化期间如何在运行时实际生成本机机器代码.
它让我思考:如何生成机器代码并在运行时使用汇编执行它,作为奖励,没有JIT编译器库,或"手动"?
由于操作系统是扩展或虚拟机,同学们提出问题,编译器在生成C程序的汇编代码时需要知道寄存器的数量或处理器的指令.
我花了一段时间在互联网上搜索,这就是我的想法......
它不需要知道寄存器的数量,因为作为虚拟机,它在内存中具有无限的资源.
但是,它确实需要知道处理器的指令,以了解它何时能够在特定时间执行特定功能.
我想知道是否有人可以为我澄清这一点,因为我对我的答案不太自信.
正如我已经注意到0xF3
二进制前缀被用作:
1)重复和减小ecx
直至ecx
等于0
在INS
,OUTS
,MOVS
,LODS
,STOS
指令和称为rep
2)重复和减小ecx
直至ecx
等于0
或ZF
在设置CMPS
,SCAS
指令和称为repz
或repe
该0xF3
二进制前缀被用作:
1)重复和减小ecx
直至ecx
等于0
或ZF
不在集合中CMPS
,SCAS
指令和称为repnz
或repne
最近注意到XACQUIRE
/ XRELEASE
前缀也有相同的二进制值(0xF2
,0xF3
)
那是什么XACQUIRE
/ XRELEASE
正在做什么(我读了一些关于锁定内存地址的东西,但它们不是工作线lock
(我相信))?
还会怎么0xF3 mov byte ptr [ecx],0x0
做?(将停在ZF …
汇编语言中“and”指令的作用是什么?有人告诉我,它会检查操作数的位顺序,并将 1 设置为 true,将其他设置为 false,但我不知道它实际上做了什么,也不知道它对代码有什么影响。
举个例子,我想确切地知道哪个x86处理器系列支持该fisttp
指令.我很确定它在奔腾4及更高版本上得到了支持,但我想对此进行一些官方验证.更重要的是,我想知道它是否得到了进一步的支持:它是否可以在Pentium III上使用?
我尝试了所有明显的谷歌搜索术语,但在网上几乎没有关于这个特定指令的任何内容.即使有,这也不是一个好的通用解决方案.
我了解英特尔IA-32架构的手册,可在网上点击这里.查看指令集参考,A-Z,我可以找到我感兴趣的指令以及有关它的大量有趣信息.但是在那本手册中没有任何地方告诉我哪些处理器系列支持每条指令,甚至是第一次引入时.
我试图找到本手册的旧版本(即奔腾III系列),但我空了 - 所有链接都指向上面链接的页面,并附有当前版本的手册.此外,为每个家庭挖掘手册是很多工作,看看我关心的指令是否存在.
当然,这些信息是其他人经常查看的信息......他们使用什么资源?
注意:对于粗心的读者,请注意我不会询问如何在运行时以编程方式确定此信息.我想坐在我的办公桌前.
instructions ×9
assembly ×8
c ×2
x86 ×2
32-bit ×1
64-bit ×1
binary ×1
bitwise-and ×1
c++ ×1
compilation ×1
cpu ×1
execution ×1
intel ×1
intrinsics ×1
memory ×1
riscv ×1