Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不知道如何访问C++;汇编代码中的变量_C++_Visual Studio_Assembly_Inline Assembly - Fatal编程技术网

C++ 不知道如何访问C++;汇编代码中的变量

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

在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
        {
        **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内容可以正常工作。