汇编语言mov [ebx+18],edi什么意思???大侠解释下。。
1个回答
展开全部
1。将ebx的值拿出来加上18,结果记为X
2。将edi的值复制给内存地址为X的空间
比如ebx = 2, ebx+18 = 20(这里姑且理解18为十进制), edi = 6
假设内存数据全是0,
内存地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
内存数据 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
因为edi是32位寄存器,所以edi=0x00000006,而Intel或AMD的CPU都是little endian的,little endian理解起来就是把32位按8位分组,再颠倒,比如0x12345678在内存里就是78 56 34 12,所以存入内存地址20的空间就是(占用20 21 22 23,因为一个字节8位):
内存地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |20 21 22 23| 24 25
内存数据 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |06 00 00 00| 00 00
mov [ebx+18],edi在反汇编里一般就是将一个对象的成员值改为edi
相当于c++里的:
obj->shift18 = edi;
或者c里的:
arr[shift18] = edi;
2。将edi的值复制给内存地址为X的空间
比如ebx = 2, ebx+18 = 20(这里姑且理解18为十进制), edi = 6
假设内存数据全是0,
内存地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
内存数据 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
因为edi是32位寄存器,所以edi=0x00000006,而Intel或AMD的CPU都是little endian的,little endian理解起来就是把32位按8位分组,再颠倒,比如0x12345678在内存里就是78 56 34 12,所以存入内存地址20的空间就是(占用20 21 22 23,因为一个字节8位):
内存地址 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |20 21 22 23| 24 25
内存数据 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |06 00 00 00| 00 00
mov [ebx+18],edi在反汇编里一般就是将一个对象的成员值改为edi
相当于c++里的:
obj->shift18 = edi;
或者c里的:
arr[shift18] = edi;
追问
lea edx,[ebp-04]
这句呢????
谢谢大侠的精彩回答啊!!
追答
lea edx,[ebp-04]有两种解释:
因为lea比sub运算的快,所以很多时候用来算减法:edx = ebp-4;
还有一种是edx是一个指针变量,ebp相当于一个数组, edx = ebp[-4]
而ebp在c++的汇编里,函数开头都有:
push ebp
mov ebp,esp
所以ebp+8一般是函数的第一个实参
ebp-4是第一个临时变量的地址……
就是有函数func(a,b,c,d),
ebp+8就是a的地址,相当于&a: edx=&a;
而ebp+4,呃,是得到函数的地址,相当于edx=(void *func)();
ebp-4是一个局部变量,func(a,b,c,d) { int e;}, 则edx=&e;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询