C++ 不知道如何访问C++;汇编代码中的变量
在visualstudio中使用_asm命令完成汇编类和所有编程。这是我正在处理的作业的模板:C++ 不知道如何访问C++;汇编代码中的变量,c++,visual-studio,assembly,inline-assembly,C++,Visual Studio,Assembly,Inline Assembly,在visualstudio中使用_asm命令完成汇编类和所有编程。这是我正在处理的作业的模板: void main () { const unsigned char c1 (0x11); const unsigned char c2 (0x22); const unsigned char c3 (0x33); const unsigned char c4 (0x44); unsigned long i1 (0); _asm
void main ()
{
const unsigned char c1 (0x11);
const unsigned char c2 (0x22);
const unsigned char c3 (0x33);
const unsigned char c4 (0x44);
unsigned long i1 (0);
_asm
{
**CODE HERE**
}
cout << "result is " << hex << i1 << endl;
}
void main()
{
常量无符号字符c1(0x11);
常量无符号字符c2(0x22);
常量无符号字符c3(0x33);
常量无符号字符c4(0x44);
无符号长i1(0);
_asm
{
**代码在这里**
}
cout使用Visual Studio添加这些数字的示例
#include <iostream>
int main( )
{
const unsigned char c1 (0x11);
const unsigned char c2 (0x22);
const unsigned char c3 (0x33);
const unsigned char c4 (0x44);
unsigned long i1 (0);
_asm
{
xor eax,eax
xor ecx,ecx ;xor and mov could be replaced with movzx ecx,c1
mov cl,c1
add eax,ecx
mov cl,c2
add eax,ecx
mov cl,c3
add eax,ecx
mov cl,c4
add eax,ecx
mov i1,eax
}
std::cout << "result is " << std::hex << i1 << std::endl;
return 0;
}
#包括
int main()
{
常量无符号字符c1(0x11);
常量无符号字符c2(0x22);
常量无符号字符c3(0x33);
常量无符号字符c4(0x44);
无符号长i1(0);
_asm
{
异或eax,eax
xor ecx,ecx;xor和mov可替换为movzx ecx,c1
mov cl,c1
添加eax、ecx
mov cl,c2
添加eax、ecx
mov-cl,c3
添加eax、ecx
mov氯,c4
添加eax、ecx
movi1,eax
}
std::你能不能就这样。你不是在写纯汇编,你是在写MSVC嵌入式汇编。你的asm能不能利用它们是常量的事实,做mov-eax,(c1换一种方式:这计算c1+c2+c3+c4
,而不是将这些字节打包成一个dword作为c1:c2:c3:c4
。这是一个如何访问变量的示例,而不必为它们做OP的功课。(您可以使用movzx ecx,c1
来避免先将ecx进行异或归零)@彼得科德斯-关于| xor ecx | mov cl,c1 | vesus | movzx ecx,c1 |的时钟或uop的数量如何?丢失了描述代码的编辑,现在已修复。movzx r32,m8
是单uop,甚至没有微熔合(完全由加载端口处理)很长一段时间以来,在Intel上。根据Zen 1和Zen 2上的情况相同。与32位mov
加载的延迟相同。每个加载需要额外1字节的代码大小,但使每个加载写入完整寄存器将消除加载之间的串行依赖性,并且任何合并uop.Xor-zeroing的需要都将避免任何部分寄存器惩罚(例如P6系列或早期SnB)用于写入cl
和读取ecx
(除非在归零和mov r8之间出现中断,否则m8
,因此reg的保存/恢复会破坏该功能。)但在现代Intel(HSW和更高版本不会将cl与ecx分开重命名)mov cl,mem
需要1个微融合加载+合并uop。它作为单个uop通过前端,但在后端,必须执行ALU uop将加载结果合并到ECX中,然后才能add
读取。因此,它在RS中占用更多空间,并增加延迟(在一个短的独立链中)经验法则:如果您特别想合并到上一个值的低字节,则仅使用mov r8,…
。否则,使用类似RISC的零扩展或符号扩展加载样式。(某些CPU(如AMD推土机可能?)需要一个额外的uop来扩展字节或字加载;最近的Intel/AMD也在加载端口中加载movsx。)在某些情况下,节省1字节的代码大小更有用,例如,在自身性能不重要的冷代码中,或者如果您知道对于您的目标CPU来说,部分reg内容可以正常工作。