社区
汇编语言
帖子详情
请问这句话什么意思?“mov ecx, DWORD PTR _this$[ebp]”
wtller
2008-02-21 02:49:28
谢谢!
...全文
885
11
打赏
收藏
请问这句话什么意思?“mov ecx, DWORD PTR _this$[ebp]”
谢谢!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
超度逗比
2009-05-19
打赏
举报
回复
[Quote=引用 4 楼 wtller 的回复:]
请问,“ebp+XXX”,这个XXX是什么?_this$?好像太大了吧?
现在我已经知道大概意思了,是在操作ebp,只是俺想不通_this$+ebp偏移也太大了吧。
[/Quote]
在栈里,地址不大(高)才怪撒。
meiZiNick
2008-05-01
打赏
举报
回复
好像没那么简单,呵呵.
BMCRNET
2008-02-25
打赏
举报
回复
学习了!!!!!!!!!!
alan001
2008-02-23
打赏
举报
回复
this 就是运行中 类在内存中的指针
pig4210
2008-02-23
打赏
举报
回复
同意。
_this$其实是反汇编器给出的一个名称罢了,命名了一个局部变量。其实它可以叫arg0,arg1,叫XXX都一样。
反汇编器认为这个变量被当作一个this使用,那它就这么命名喽。当然,你人为地修改它的名称也可以。
就VC程序默认情况来说,this指针靠ecx传递进成员函数,因为ecx在函数体中可能需要使用而发生变化,所以一般在函数初始时就把ecx赋给一个局部变量(这个局部变量不是我们写程序时定义的,而是编译器定义的),那么这个局部变量在这个函数作用范围内就被当作this来用。
因为局部变量一般都用ebp来做基址。所以[ebp+XXX]便指向了某局部变量。
mov ecx, DWORD PTR _this$[ebp] 与mov ecx, DWORD PTR [ebp+_this$]等价,
如果你觉得_this$混淆了你的视觉,那你改成mov ecx, DWORD PTR [ebp+argX]好了。
另外,楼主用的什么反汇编器?我的IDA从来也不会识别出this指针来啊。。。从来都是我自己N命名。
cnzdgs
2008-02-22
打赏
举报
回复
“ebp+XXX”的意思是ebp加上一个数,这个数是编译器根据程序中函数的参数传递规则和函数的参数个数及次序来确定的。
例如void __cdecl TestClass::TestFunction(void),这个函数没有其它参数,只有一个this指针,那么这个xxx就应该是8。(ebp+0是原ebp,ebp+4是函数返回地址,ebp+8是第1参数)
rularys
2008-02-22
打赏
举报
回复
这个是反汇编出来的么?读一下反汇编器的帮助啊
wtller
2008-02-22
打赏
举报
回复
请问,“ebp+XXX”,这个XXX是什么?_this$?好像太大了吧?
现在我已经知道大概意思了,是在操作ebp,只是俺想不通_this$+ebp偏移也太大了吧。
cnzdgs
2008-02-21
打赏
举报
回复
_this$[ebp]和_this$这两种写法都可以,意思一样,编译出来都是[ebp+XXX]。ebp专门用来访问栈中的数据,访问参数用ebp+偏移量,访问局部变量用ebp-偏移量。
wtller
2008-02-21
打赏
举报
回复
谢谢LS!
我主要就是_this&[ebp]想不通。
如果_this&代表一个32bit的线性空间的逻辑地址,ebp是frame point,也是一个32bit的线性空间的逻辑地址。
那么_this&[ebp]是什么意思?用ebp来做index,来偏移_this$.....这也偏得太大了吧!!
cnzdgs
2008-02-21
打赏
举报
回复
函数中定义了_this$参数,这条指令的意思是把这个参数读到ecx里面。
这是一个类的成员函数,this是类的实例指针,指令的意思是将类的实例指针装入ecx。后面会使用[ecx+XXX]的形式访问类成员。
相关推荐
e语言-易语言汇编替换字节集
易语言汇编替换字节集源码
mov
eax, d
word
ptr
[
ebp
08h]
mov
eax, d
word
ptr
[eax] 取出
ebp
08h地址(eax值加8后才是真实地址)add eax, 07h eax的值为:
ebp
08h真实地址减去1( 08H是真实地址,此时 07H),少1是修正后边加替换位置超出的1字节add eax, d
word
ptr
[
ebp
0Ch]
ebp
0Ch结合
ebp
08h确定替换位置,并存放到通用寄存器eax
mov
edi, eax eax作为内存指针存放于寄存器edi------------------------------------------------------------------------------------------------------------------------------------------
mov
eax, d
word
ptr
[
ebp
10h] 计算
ebp
10h字节集指针
mov
eax, d
word
ptr
[eax] 计算
ebp
10h字节集指针add eax, 08h 计算
ebp
10h字节集指针
mov
esi, eax
ebp
10h字节集指针存放于esi------------------------------------------------------------------------------------------------------------------------------------------
mov
ecx
, d
word
ptr
[
ebp
10h] 计算
ebp
10h字节集长度
mov
ecx
, d
word
ptr
[
ecx
] 计算
ebp
10h字节集长度
mov
ecx
, d
word
ptr
[
ecx
04h]
ebp
10h字节集长度值存放到计数存储器
ecx
rep
mov
sb 重复操作,重复次数为
ecx
值,也就是用作替换的字节集长度值
关于两个对象交换的扩展
前面一节,我讲到了两个对象交换的四种方法,今天,通过调试,来比较下这四种方法的汇编代码,测试环境为vc6.0 temp = a;
mov
eax, d
word
ptr
[
ebp
+ 8] //
ptr
[
ebp
+ 8]为a的地址
mov
ecx
, d
word
ptr
[eax] //在
ecx
中暂存a中的内容
mov
d
word
ptr
[
ebp
-4],
ecx
//
ebp
-4为c的地址,将a的值赋
VS2017的DEBUG版本的main函数地址模板
push
ebp
mov
ebp
,esp call 0x00000000//获取环境变量 push eax call 0x00000000//获取命令行参数指针
mov
eax,d
word
ptr
ds:[eax] push eax call 0x00000000//获取命令行个数
mov
ecx
,d
word
ptr
ds:[eax] push
ecx
call main//调用main函数...
8. ESP寻址
EBP
寻址
寄存器传参和堆栈传参 寄存器传参
MOV
ECX
,1
MOV
EBX,2 CALL XX
MOV
EAX,
ECX
ADD EAX,EBX RETN 堆栈传参 --ESP寻址 PUSH 1 PUSH 2 CALL XXX
MOV
EAX,D
WORD
PTR
SS:[ESP+8] //当内存中括号中包含ESP或者
EBP
的
话
用SS ADD EAX,D
WORD
PTR
SS:[ESP+4...
MOV
EAX,D
WORD
PTR
SS:[
EBP
+8]
nasm来写可以写成
mov
eax,d
word
ptr
[
ebp
+ 8]理由:
ebp
和esp默认是ss段,所以根本不用显式说明。 eax,ebx,
ecx
,edx,edi,esi默认是ds段, eip默认是cs段。 补充:上面给的是masm用法nasm是
mov
eax,d
word
[
ebp
+ 8]我自己用的nasm,经常说nasm语法说习惯了。...
发帖
汇编语言
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
2.1w+
社区成员
4.1w+
社区内容
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
帖子事件
创建了帖子
2008-02-21 02:49
社区公告
暂无公告