gpt4 book ai didi

visual-studio-2010 - 内联汇编代码修改的帧指针寄存器 0x​​104567910

转载 作者:行者123 更新时间:2023-12-04 04:43:43 24 4
gpt4 key购买 nike

不幸的是,我不得不重新镜像我的笔记本电脑以安装 Visual Studio 2012。我的项目构建但有上述警告。以前我有 Visual Studio 2010,但从未收到上述警告。代码如下:

__asm
{
//Initialize pointers on matrices
mov eax, dword ptr [this]

mov ebx, dword ptr [eax+UPkk]
mov dword ptr [UPkk_ptr],ebx

mov ebx, dword ptr [eax+UPk1k]
mov dword ptr [UPk1k_ptr],ebx

mov ebx, dword ptr [eax+DPk1k]
mov dword ptr [DPk1k_ptr],ebx

mov ebx, dword ptr [eax+DPkk]
mov dword ptr [DPkk_ptr],ebx

mov ebx, dword ptr [eax+mat_A]
mov dword ptr [mat_A_ptr],ebx

mov ebx, dword ptr [eax+vec_a]
mov dword ptr [vec_a_ptr],ebx

mov ebx, dword ptr [eax+vec_b]
mov dword ptr [vec_b_ptr],ebx
}

我需要更改项目中的任何设置吗?

最好的祝福

金丹

编辑:在上面的代码中,当我用 ecx 替换 ebx 时,警告消失并且代码工作正常。但是,还有一段代码我使用了 ebx 和 ecx,在这种情况下我的程序崩溃了。这是代码:
__asm
{
//Initialize UPk1k[idx_4] pointer
mov eax, dword ptr [UPk1k_ptr]
mov ebx, dword ptr [idx_4]
imul ebx,8
add eax,ebx
mov dword ptr [UPk1k_id4_ptr],eax

//Initialize UPkk[idx_4] pointer
mov eax, dword ptr [UPkk_ptr]
mov ebx, dword ptr [idx_4]
imul ebx,8
add eax,ebx
mov dword ptr [UPkk_id4_ptr],eax

//Initialize UPk1k[idx_4] pointer
mov eax, dword ptr [vec_b_ptr]
mov ebx, dword ptr [idx_1]
imul ebx,8
add eax,ebx
mov dword ptr [vec_b_id1_ptr],eax

mov edi, dword ptr [idx_1] //Load idx_1 in edi
mov esi, 0 //initialize loop counter
jmp start_proc11

start_for11:inc esi //idx_2++

start_proc11:cmp esi, edi //idx_2<idx_1 ?
jge end_for11 //If yes so end of the loop

mov eax, UPk1k_id4_ptr //load UPk1k[idx_4] adress
mov ebx, vec_b_ptr //load vec_b adress
mov ecx, esi
imul ecx,8
add eax, ecx //UPk1k[idx_4+idx_2] in eax
add ebx, ecx //vec_b[idx_2] in eax

fld qword ptr [eax]//push UPk1k[idx_4+idx_2]
fld qword ptr [ebx] //push vec_b[idx_2]
mov edx,dword ptr [Sd_ptr]
fmul qword ptr [edx] //vec_b[idx_2]*Sd
fadd //pop UPk1k[idx_4+idx_2]+vec_b[idx_2]*Sd
mov edx,dword ptr [UPkk_id4_ptr]
fstp qword ptr [edx+esi*8] //pop UPkk[idx_4+idx_2]=UPk1k[idx_4+idx_2]+vec_b[idx_2]*Sd
fld qword ptr [ebx] //push vec_b[idx_2]
mov edx,dword ptr [vec_b_id1_ptr]
fld qword ptr [edx] //push vec_b[idx_2]
fmul qword ptr [eax]
fadd
fstp qword ptr [ebx]
jmp start_for11 //end of the loop
end_for11:
}

非常感谢

最好的祝福

CS

最佳答案

见 MSDN about registers还有那个warning .他们解释了为什么会产生警告:它强制编译器保留 EBX 的值,这可能会对性能产生反作用,这是使用内联 asm 的通常原因。相关报价:

In addition, by using EBX, ESI or EDI in inline assembly code, you force the compiler to save and restore those registers in the function prologue and epilogue.



要禁用警告,我认为语法是

#pragma warning ( disable : 4731 )
但是,我会尝试使用其他寄存器代替,因为警告是有充分理由的,真的,就像大多数警告一样。

事实上,看看你的汇编代码, 只需替换 ebxecx ,应该可以解决问题。

关于visual-studio-2010 - 内联汇编代码修改的帧指针寄存器 0x​​104567910,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com