汇编语言理解指针

有空自己也写一个学习笔记,先把参考文章记下了:

http://www.cnblogs.com/aguncn/archive/2012/11/14/2769989.html
http://www.cnblogs.com/aguncn/archive/2012/11/14/2769814.html

http://segmentfault.com/q/1010000000627497

http://blog.csdn.net/herecles/article/details/6080226

我的理解:指针就是使用mov方法的间接寻址。想要明白指针,必须懂得LEA和MOV指令的区别。然后就觉得已经豁然开朗。

mov 和 lea 的区别

mov ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,以这个结果为地址找一个ecx长度的内存数赋给ecx
lea ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,把这个结果(mov时地址)赋给ecx
效果为ecx=eax+0x30 (这里eax参与了运算却没有改变值)
dword 双字 就是四个字节
ptr pointer缩写 即指针
[]里的数据是一个地址值,这个地址指向一个双字型数据
比如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax

----------------------------------------------------
MOV与LEA的区别
可以说,mov 这个汇编指令在 汇编语言程序中是 非常 非常常见的一个指令. 打个最简单的比方,就好比我
们人要每天 说话一样..在汇编语言中,Mov 指令就好比 我们人要每天说话一样。 每一个程序都离不开 Mov
指令。
Mov指令:
传送指令,可以用于传送寄存器,也可以用于传送内存地址.
lea指令:
传送指令。

如果是刚刚学习 汇编语言的朋友,看到上面的解释一定会很疑惑,Mov 和 Lea都是传送指令,那么它们直
接的区别在哪里?
下面详细 解释 Mov 与Lea 汇编指令的区别.
先作举一个生活中的例子, 比如你要坐车去电影院,你可以告诉司机电影院的地址,然后司机根据地址将你送
到电影院. 你还可以,告诉司机电影院的名字,司机通过名字 将你送到电影院. 我们用这两种方式都可以 顺
利的到达 自己想到底的电影院.
Mov 和lea 的作用就是像上面例子说的一样.用不同的方式(传送方式),达到同一个目的(传送数据).换句话
说,Mov 指令传送方式,是将存放内存数据的地址进行传送. 而Lea则是恰恰相反,Lea是直接将内存数据进行传
递.
下面用一个例子说明 lea与mov 的区别:
mov ecx,30
add ecx,eax
====================================================
lea ecx,[eax+30]
====================================================
mov ecx,[eax+30]表示先运算eax+30得到一个结果,以这个结果为地址传递到一个ecx长度的内存地址存放ecx
lea ecx,[eax+30]表示先运算eax+30得到一个结果,把这个结果传递到ecx中。相当于ecx=eax+30

希望这篇文章 能够帮助正在 为mov 和lea区别而烦恼的朋友们. 这篇文章花费 2个晚上,完成排版,整理。

1 . MOV 的右值必须是常量,而不能是表达式,比如 可以写MOV EAX, EBP,但不能写MOV EAX, EBP + 8
这是因为EBP + 8本身也需要一条指令来计算,所以不能跟MOV写在一条指令里。

2 . 注意到在汇编指令的内存地址符 [ ] 内可以做算术运算,那是因为内存地址的计算在CPU里是由专门的处理单元AGU来处理的,并不占用算术运算单元ALU的时钟周期。但如果用MOV 接内存地址符号[]的话,会把[]里的地址指向的内存的内容取出来放入寄存器。 比如 mov eax,[ebx+ecx*4h-20h],会把ebx+ecx*4h-20h计算的结果当成一个内存地址,然后去内存把该地址的内容取出送往eax。

3 . 如果我们只是想得到算术运算结果怎么办呢?这时候就可以用到LEA指令了。因为LEA后面接内存地址符[]会把地址,而不是地址里的内容送入寄存器。比如,我们想计算ebx+ecx*4h-20h的结果,就可以这样写: lea eax,[ebx+ecx*4h-20h]。当然如果不用lea指令也可以达到目的,不过那样写起来就麻烦多了: imul ecx, 4 add ebx, ecx sub ebx, 20h mov eax, ebx

时间: 2024-10-13 11:11:25

汇编语言理解指针的相关文章

C/C++心得-理解指针

上一篇笔者用那不是怎么好理解的逻辑介绍了内存和C中的基本数据类型,现在笔者再根据自己重新所学来说说C语言中的指针. 理解指针才能真正的算C语言入门.也许是我大学期间太关注前端UE,也许是当初开始学C语言的时候没怎么认真:直到毕业后的某一天我才“懂”指针,才算理解C语言的伟大.如果早点理解它,可能我毕业时就会选择一份不一样的工作.如果有初学C语言的同行对指针有困惑,希望我这浅薄的认识能帮助你. 1.简介 指针在原英文中为pointer,个人觉得翻译过来后针的含义不如指的含义好理解,pointer还

【C语言天天练(十一)】深入理解指针

引言:在C语言中,指针的地位是不言而喻的,要想很好的掌握C语言,掌握指针是必须的,这也是C语言不同于其他语言的地方. (一)指针的指针 例子: int i; int *pi;/*把pi初始化为指向变量i,pi = &i*/ int **ppi;/*把ppi初始化为指向变量pi,ppi = &pi*/ 初始化指针后,就可以使用它们了.例如i = 'a'; *pi = 'a'; **ppi = 'a';具有相同的效果. 在一条简单的对i赋值的语句可以完成的任务情况下,为什么还要使用更为复杂的涉

理解指针

如题:理解指针 VS如何看汇编代码(DEBUG状态) Debug->Windows->DisAssambly即可看到汇编窗口 先看看C++代码 int _tmain(int argc, _TCHAR* argv[]) { /* char temp[100] = "c:\abc\bcd\cde \n"; char temp2[100] = "c:/abc/bcd/cde \n"; char temp3[100] = "c:\\abc\\bcd\\

关于理解指针数组,数组指针,数组名,二维数组的一些技巧。

/*************关于数组名***************/ int a[3] = {1, 2, 3} 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址.比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte) cout << a << endl;会输出数组第一个元素地址. 2.取址符号&. &a是数组的地址,注意

深入理解指针和引用的区别及引用与原值的区别

用法上的基本区别(包括sizeof和typeid)就不多说了,相信大家都了然于心,不清楚随便google一下也有一大堆. 下面从对象模型的角度去深入的谈谈指针和引用的区别,亦我们有了指针,为什么还要用引用. 1) 形式 这里所说的形式指的是运算符重载时的形式一致,事实上,在c++中,只有运算符有形式上确定的规定,因此,在重载[]运算符时,为了保持形式的一致性,就必须使用引用. 2) 临时变量 可以用const A&来引用一个临时变量(这同时证明了临时变量是有地址的,只不过该地址不能通过&取

你好,C++(40)7.1 一切指针都是纸老虎:彻底理解指针

第7章 C++世界的奇人异事 在武侠小说中,初入武林的毛头小子总是要遇到几位奇人,发生几件异事,经过高人的指点,经历一番磨炼,方能武功精进,从新手成长为高手.在C++世界,同样有诸多的奇人异事.在C++世界中游历学习的我们,是否也同样期望着遇到几位奇人,经历几件异事,而后从一个C++新手成长为C++高手呢? 武林中的奇人异事可遇而不可求,但是C++世界中的奇人异事却可以为你一一引见. 7.1  一切指针都是纸老虎:彻底理解指针 C++世界中什么最难?指针!C++世界中什么最强?指针! 指针作为C

深入理解指针—&gt;指针函数与函数指针的区别

一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: f

理解指针,和指针的指针

理解一个事物的最好方式,就是知道它的用途. 我对指针的理解总结起来就是一句话:如果你调用函数的时候,改变一个变量的值(包括基本变量.结构体.类,指针),那么你就需要它的指针. 由于C/C++ 调用函数的时候,永远都会拷贝一份参数,所以,你怎么折腾都无法改变原来的东西(java对于对象是传引用).所以,你就需要一个指针,直接改变那个变量的内存内容.贴代码: #include "stdio.h" void changeValue(int a, int b); void changeValu

如何保存指针地址 理解指针的指针

有这样一个问题就是如何使用一个整数保存一个结构体或类以及其他类型的指针,这种需求在不同语言之间调用是存在的,例如有一个结构体A: struct A { char item1; int item2 }; 需要使用一个整数b,需要用b保存这个结构体指针的地址(struct A* a = new A),使得b的值就是a的指向的地址,你可能会想直接b = a就可以了,但是编译器都不会答应.因为类型不同,一个是整数一个是指向struct A的指针. 正确的方式如下: unsigned int b = 0;