请问vc6下的内嵌汇编里怎么做到直接寻址?

coolshinji 2010-01-21 01:47:55
int main()
{
_asm{
mov eax,[0x00400001] //1
mov eax,0x00400001 //2
}
return 0;
}



上面这段代码我放在vc6里进行调试,发现vc6把行1里的400001当作了立即数:
mov eax,[0x00400001]
0040D45A B8 01 00 40 00 mov eax,400001h
mov eax,0x00400001
0040D45F B8 01 00 40 00 mov eax,400001h

而且不光是vc6,vc2008也是这样。



当然我知道可以这样:
mov ecx,00400001
mov eax,[ecx]
但我就是想用直接寻址的方式来实现


请问在vc6下怎么做到直接寻址?
...全文
158 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_anthony 2010-01-22
  • 打赏
  • 举报
回复
有人问过的,似乎是这样,有点忘了
mov eax,ds:dword ptr[0x00400001]
coolshinji 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangk 的回复:]
我没有VC6
不过可以建议你用转弯一点的方式:

Assembly codemov eax, 400001hmov eax,dword ptr[eax]
[/Quote]

呵呵,你说的方法我知道,不过还是谢谢你了

vc6、vc2008都是这样,唉,巨硬这是啥语法啊.....
wangk 2010-01-22
  • 打赏
  • 举报
回复
我没有VC6
不过可以建议你用转弯一点的方式:


mov eax, 400001h
mov eax,dword ptr[eax]
coolshinji 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangk 的回复:]
Assembly codemov eax, dword ptr[0x00400001]
[/Quote]


说过了,不行。你这样写在vc6里会被认为是立即数

8: mov eax, dword ptr[0x00400001]
0040D464 B8 01 00 40 00 mov eax,400001h
9: mov eax, 0x00400001
0040D469 B8 01 00 40 00 mov eax,400001h


反汇编出来的结果和mov eax,400001h一样的
wangk 2010-01-22
  • 打赏
  • 举报
回复

mov eax, dword ptr[0x00400001]
柯本 2010-01-22
  • 打赏
  • 举报
回复
跟优化无关,VC、MASM、BCB、TASM都不支持
mov eax,[0x00400001]
这种格式。正如我 10楼所说,ollygdb也是直接在头上加上了ds:dword ptr

coolshinji 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wangk 的回复:]
莫不是内嵌汇编指令优化翻译的原因?


[/Quote]
应该不是,我把优化关掉的
coolshinji 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 keiy 的回复:]
如果你不要前缀的话:可以这样:
_emit  0xa1
_emit  01
_emit 00
_emit 0x40
_emit 00

如果还觉得繁,可作一个宏

[/Quote]

呵呵,直接写二进制我倒是没想到呢,感谢!
wangk 2010-01-22
  • 打赏
  • 举报
回复
莫不是内嵌汇编指令优化翻译的原因?

柯本 2010-01-22
  • 打赏
  • 举报
回复
如果你不要前缀的话:可以这样:
_emit 0xa1
_emit 01
_emit 00
_emit 0x40
_emit 00

如果还觉得繁,可作一个宏
柯本 2010-01-22
  • 打赏
  • 举报
回复
我试了下,不光是VC,BCB也有这个问题.
后来用ollygdb看一下,
mov eax,[0x00400001]
就为
mov eax,ds:dword ptr[0x00400001]
结果是一样的
coolshinji 2010-01-22
  • 打赏
  • 举报
回复
刚刚又试了一下,没有崩溃,我在8楼说的不对,看来崩溃不是段前缀造成的。


7楼强制指定段前缀的确是可以的。但是加了段前缀的话,会在opcode里多出一个3E前缀,我希望没有这个前缀,也就是使用默认段。
coolshinji 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 w_anthony 的回复:]
有人问过的,似乎是这样,有点忘了
mov eax,ds:dword ptr[0x00400001]

[/Quote]

不能加段前缀的,ring3级别下运行这样的代码会崩溃的,不信你试试,我昨天才试过的O(∩_∩)O~
coolshinji 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 long999999999 的回复:]
借助用WINIO.DLL

InitializeWinIo();

SetPortVal(0x443, 5, 1);

ShutdownWinIo();
[/Quote]


这个复杂了点吧......
我其实只是问了个语法的问题,就是想知道vc6下直接寻址的语法,还是说vc6不支持直接寻址?
long999999999 2010-01-21
  • 打赏
  • 举报
回复
借助用WINIO.DLL

InitializeWinIo();

SetPortVal(0x443, 5, 1);

ShutdownWinIo();

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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