求助: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;
}
...全文
165 14 打赏 收藏 转发到动态 举报
写回复
用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 下就不能了。。
WIN-TC免费版是一个turbo C2 WINDOWS平台开发工具,最大特点是支持中文界面,支持鼠标操作,程序段复制,WIN-TC免费版为初学c语言、对高等编程环境不熟悉的同志们非常有帮助。 WIN-TC免费版使用turbo C2为内核,提供WINDOWS平台的开发界面,因此也就支持WINDOWS平台下的功能,例如剪切、复制、粘贴和查找替换等。而且在功能上也有它的独特特色例如语法加亮、C内嵌汇编、自定义扩展库的支持等。并提供一组相关辅助工具令你在编程过程中更加游刃有余,如虎添翼。WIN-TC简繁双语版可以正常运行于98及其以上的简体及繁体WINDOWS操作系统上。 主要功能: 1、在WINDOWS下编辑TC代码,可以充分利用WINDOWS的支持剪贴版和中文的特点;   2、Include和Lib路径自动定位,告别TC设置路径的历史;   3、编译错误捕捉功能,编译时不会出现烦人的DOS窗口;   4、支持C内嵌汇编从而实现C/ASM混合编程;   5、支持C扩展库(自定义LIB库);   6、错误警告定位功能、出现编译错误时双击输出框里的出错行信息可以自动寻找到错误的行,就像DOS的TC那样;   7、支持语法加亮功能,并可以自定义设置;   8、没有目录路径限制,你甚至可以安装到带有空格的路径文件夹里;   9、允许自定义设置输入风格,能够实现VC类似的输入风格;   10、可选择是否生成ASM、MAP或OBJ文件,你甚至可以指定只生成EXE文件;   11、稳定的文件操作功能,支持历史记录列表和使用模板;   12、撤消和重复功能,并可以按照自己内存情况设置最多撤消次数(最多允许999次);   13、具有行标计数的功能,并可以设置样式。

64,650

社区成员

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

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