求助:VC6 编译内嵌汇编不通过。

wenfh2020 2011-10-12 11:53:56
错误:error C2443: operand size conflict
求解决,或者转换下面代码,谢谢。


BOOL CSymEngine::GetCurrentThreadContext(PCONTEXT pContext)
{
#if defined _M_IX86
__asm
{
push eax
push edi

push es
push ecx

// EDI = pContext
mov edi, [pContext]
// ES = DS
push ds
pop es
// ECX = sizeof(*pContext)
mov ecx, size CONTEXT
// EAX = 0
xor eax, eax
// store EDI
push edi
// ZeroMemory(pContext, sizeof(*pContext))
cld
rep stosb
// restore EDI
pop edi

pop ecx
pop es

// fill pContext
mov dword ptr [edi] CONTEXT.ContextFlags, CONTEXT_FULL
mov dword ptr [edi] CONTEXT.Eax, eax
mov dword ptr [edi] CONTEXT.Ecx, ecx
mov dword ptr [edi] CONTEXT.Edx, edx
mov dword ptr [edi] CONTEXT.Ebx, ebx
mov dword ptr [edi] CONTEXT.Esi, esi
mov dword ptr [edi] CONTEXT.Edi, edi
mov word ptr [edi] CONTEXT.SegSs, ss
mov word ptr [edi] CONTEXT.SegCs, cs
mov word ptr [edi] CONTEXT.SegDs, ds
mov word ptr [edi] CONTEXT.SegEs, es
mov word ptr [edi] CONTEXT.SegFs, fs
mov word ptr [edi] CONTEXT.SegGs, gs
// pContext->EFlags = flags
pushfd
pop [edi] CONTEXT.EFlags
// extract caller's EBP, EIP (return address) and ESP
mov eax, [ebp]
mov dword ptr [edi] CONTEXT.Ebp, eax
mov eax, [ebp + 4]
mov dword ptr [edi] CONTEXT.Eip, eax
lea eax, [ebp + 8]
mov dword ptr [edi] CONTEXT.Esp, eax

pop edi
pop eax
}
#elif defined _M_X64
RtlCaptureContext(pContext);
#else
#error CPU architecture is not supported.
#endif
return TRUE;
}
...全文
175 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xunxun 2011-10-12
  • 打赏
  • 举报
回复
哪一行的错误?

反正是你操作数的size大小不一致
xunxun 2011-10-12
  • 打赏
  • 举报
回复
CONTEXT结构里都是DWORD的

不过我纳闷的是[edi] CONTEXT.SegSs这种写法
变址操作不应该是CONTEXT.SegSs [edi]或[CONTEXT.SegSs+edi]么?

那个是新写法?
zhanshen2891 2011-10-12
  • 打赏
  • 举报
回复
CONTEXT里面的你要赋值的都是DWORD的,你给它赋一个word就报错了呗

不过我怎么没看明白你这是在干什么,给临时变量赋值??
wenfh2020 2011-10-12
  • 打赏
  • 举报
回复
mov word ptr [edi] CONTEXT.SegSs, ss

==>

mov word ptr [edi+CONTEXT.SegSs], ss

可以编译通过,我验证后再给分吧。。谢谢。
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
把错误贴出来吧。


把下面几行注释起来看行不?

mov word ptr [edi] CONTEXT.SegSs, ss
mov word ptr [edi] CONTEXT.SegCs, cs
mov word ptr [edi] CONTEXT.SegDs, ds
mov word ptr [edi] CONTEXT.SegEs, es
mov word ptr [edi] CONTEXT.SegFs, fs
mov word ptr [edi] CONTEXT.SegGs, gs
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
有没搞错。。。。
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
表达的意思是一样的,只是VC 6不支持那种写法而已。CONTEXT.ContexFlags表示结构体成员的偏移量,edi代表是结构体首地址。两个相加代表成员的地址。
wenfh2020 2011-10-12
  • 打赏
  • 举报
回复
晕,刚才忘记开放注释的代码了。还是没有编译通过~~~
wenfh2020 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mingliang1212 的回复:]

mov dword ptr [edi + CONTEXT.ContextFlags], CONTEXT_FULL

或者
[/Quote]

这个可以编译通过了。谢谢。
请求原因,本人对汇编不懂,这样语句跟之前的有什么不同?
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
mov dword ptr [edi + CONTEXT.ContextFlags], CONTEXT_FULL

或者
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
楼主试试这样吧:


mov dword ptr CONTEXT.ContextFlags[edi] , CONTEXT_FULL
wenfh2020 2011-10-12
  • 打赏
  • 举报
回复
这些代码都是开源的代码,VC9 下的,应该都是合法的。可能是编译器的问题。
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
mov dword ptr [edi] CONTEXT.ContextFlags, CONTEXT_FULL


只学过8086,,没见过三个操作数的mov,可能如楼上所说。
wenfh2020 2011-10-12
  • 打赏
  • 举报
回复
mov word ptr [edi] CONTEXT.SegCs, cs
mov word ptr [edi] CONTEXT.SegDs, ds
mov word ptr [edi] CONTEXT.SegEs, es
mov word ptr [edi] CONTEXT.SegFs, fs
mov word ptr [edi] CONTEXT.SegGs, gs

上面几行。这些代码用 VS 2008 能通过,VC6 下就不能了。。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧