总结一下汇编中mov,lea指令的区别

最近在学习汇编语言,过程中遇到很多问题,对此在以后的随笔会逐渐更新,这次谈谈mov,lea指令的区别

一,关于有没有加上[]的问题

1,对于mov指令来说:

有没有[]对于变量是无所谓的,其结果都是取值

如: num dw 2

mov bx,num

mov cx,[num];bx=cx=2

对于寄存器而言,有[]表示取地址,没[]表示取值

如: num dw 2

mov ax,num

mov bx,ax;bx=2

mov bx,[ax];mov bx;DS:[ax],这里可能存在报错的情况,总之大体意思能理解就行

2,对于lea指令来说:

有没有[]对于变量是无所谓的,其结果都是取变量的地址,相当于指针(与mov相反)

如:num dw 2

lea  ebx,num;

lea  eax,[num];ebx=eax

对于寄存器而言,有[]表示取值,没[]表示取地址

如:mov eax,2

mov ebx,[eax];ebx=2

mov ebx,eax;eax=地址,随程序的不同而不同

时间: 2024-10-06 18:57:31

总结一下汇编中mov,lea指令的区别的相关文章

arm指令中mov和ldr的区别

ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中. 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方. x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中. 另外还有一个就是l

汇编中Enter与Leave指令

Enter的作用相当==push ebp和mov ebp,esp 这后面两句大家很熟悉吧?函数开始一般都是这两句 Leave的作用相当==mov esp,ebp和pop ebp 而这后面这两句也很常见,函数调用完后一般的用到 以上的Enter和leave的作用分别函数开始和结束 Win32汇编中局部变量的使用方法可以解释一个很有趣的现象:在DOS汇编的时候,如果在子程序中的push指令和pop指令不配对,那么返回的时候ret指令从堆栈里得到的肯定是错误的返回地址,程序也就死掉了.但在Win32汇

栈以及内存操作在汇编中的实现

一. 学习过程 要在计算机中用到一段存储空间,必须要知道两个信息:(1)存储空间在哪?(2)存储空间有多大.对于寄存器来说,只要给出寄存器的名字就可以了,因为每个寄存器在计算机中都是唯一的,而且寄存器大小是规定的.对于内存空间来说,就要给出地址和数据类型,数据类型就代表一个存储空间的大小. 以前学习C语言的时候,并没有仔细研究过,原来C语言中还可以以这种语法直接向内存单元中写入数据:*(char *)0x2000=’a’;向偏移地址为2000h的内存空间写入char型数据a.*(char far

汇编中中括号[]作用以及lea和mov指令的区别

现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令:对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:mov eax,2lea ebx,[eax];执行后ebx=2mov ebx,eax;等同于上句lea ebx,eax;编译器报错: error A2070: invalid instruction operands 对于变量来说加不加[]都是一样的效果,都是取变量的地址,相当于指针如:num dword 2lea ebx,numl

为什么X86汇编中的mov指令不支持内存到内存的寻址?

在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了???这个问题在stack overflow有个解释不错: The answer involves a fuller understanding of RAM. Simply stated, RAM can only be in two states, read mode or write mode.

汇编语言中LEA与MOV指令小结

 LEA指令的功能是取偏移地址,MOV指令的功能是传送数据  LEA AX,[1000H],作用是将内存单元[1000H]的偏移地址1000H送至AX: MOV AX,[1000H],作用是将内存单元[1000H]的内容1234H送给AX LEA AX,[SI],作用是将寄存器SI的内容4567H当做数据传送给AX: MOV AX,[SI],作用是将寄存器SI的内容4567H当做地址看待,将地址为4567H处的内容传送给AX: LEA AX,SI,作用是将寄存器SI的偏移地址1001H传送给AX

LEA指令与MOV指令的区别

一.汇编语言中PTR的含义及作用mov ax,bx ;是把BX寄存器"里"的值赋予AX,由于二者都是word型,所以没有必要加"WORD"mov ax,word ptr [bx];是把内存地址等于"BX寄存器的值"的地方所存放的数据,赋予ax.由于只是给出一个内存地址,不知道希望赋予ax的,是byte还是word,所以需要用word明确指出! 所以,当两个操作数的宽度不一样时,就要用到ptr.也就是说*p 用汇编表示就是:dword ptr [p

汇编总结:lea指令

lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先lea指令是mov指令的变种,据说,lea指令是x86体系结构中,是一条最古老但是从某个方面来讲又是最神奇的指令. 表面上看,它做的事情非常简单,根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中. 例如:leaq a(b, c, d), %rax 先计算地址a + b + c * d,然后把最终地址载到寄存器rax中. 最逗

汇编 LEA 指令

知识点: ? LEA指令 ? &与LEA ? OD里修改汇编代码 一.LEA指令格式 有效地址传送指令 LEA 格式: LEA 操作数A, 操作数B 功能: 将操作数B的有效地址传送到指定的的某个寄存器,操作数A必须是寄存器.(32位系统上就是32位寄存器) 二.C++代码测试 int i; int *p=&i; 三.OD里修改汇编代码 按下空格后 直接输入汇编代码 四.汇编代码测试 int i=0: char a[4]={0}; __asm { lea ebx,i // ebx=&