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

现在总结一下:其中牵扯到lea指令,mov指令,[]

一.lea指令:
对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:
mov eax,2
lea ebx,[eax];执行后ebx=2
mov ebx,eax;等同于上句
lea ebx,eax;编译器报错: error A2070: invalid instruction operands

对于变量来说加不加[]都是一样的效果,都是取变量的地址,相当于指针
如:
num dword 2
lea ebx,num
lea eax,[num]; eax为num的地址,如eax=4206598,随程序不同不同,这时ebx==eax

二.mov指令:
对于变量来说
num dword 2
mov eax,2
mov ebx,num
mov ecx,[num];执行完ebx==ecx==2

对寄存器
mov ebx,eax;ebx==2
mov ecx,[eax];可能会报错,因为这里翻译成汇编是mov ecx,DS:[eax]

总的说来加不加中括号[]的区别就是:
lea对变量没有影响是取地址,对寄存器来说加[]时取值,第二操作数不加[]非法

mov对变量来说没有影响是取值,对寄存器来说是加[]时取地址,第二操作数不加[]是取值

还有一点这里顺便说下,看有的教程说mov指令不支持mov ebx,[eax+2*eax......什么乱七八糟的表达式]归根结底就是对于mov来说当第二个操作数是寄存器的时候如果加上[]就是寻址了....

https://blog.csdn.net/spygg/article/details/8760310

原文地址:https://www.cnblogs.com/findumars/p/9404390.html

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

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

汇编语言中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指令与MOV指令区别

Tips: LEA指令与MOV指令的区别: ① MOV指令是 数据        传送指令-------传送数据 LEA指令是   有效地址 传送指令-------取偏移地址 ② MOV OPRD1 OPRD2 OPRD1: 目的操作数(寄存器,存储器,累加器) OPRD2: 源操作数(寄存器,存储器,累加器,立即数) 例如: 1 MOV DI,BX ;寄存器到寄存器之间传数 1 MOV AL,23H ;将立即数"复制"到寄存器 1 MOV [2000H],02H ;直接地址 注意:

总结一下汇编中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],这里可能存在报错的情况,总之

为什么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 指令

比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:     push   ebp     mov   esp,   ebp     sub   esp,   4     现在栈上就有了4各字节的空间,这就是你的局部变量.     接下来,你执行mov   LocalVar,   4,那么实际的指令又是什么?是这样:     mov   dword   ptr   [ebp-4],   4     于是,这个局部变量的“地址”就是ebp

16位汇编中的伪指令

汇编中的伪指令(基于汇编编译器MASM讲解) 一丶什么是伪指令,以及作用 首先我们用汇编开发效率低,如何才能开发效率高,甚至开发速度比C语言或这个高级语言快 答案: 伪指令 什么是伪指令 伪指令是汇编编译器提供的,比如昨天我们写的汇编代码,假设调用一个Call我们每次都要手工处理 保存栈底,开辟就变量空间,保存寄存器环境....每次都要做,特别麻烦,所以编译器帮我们提供了伪指令,只要我们 按照汇编编译器的语法去写,那么这些汇编编译器则会自动帮我们补全 比如昨天的代码: ;调用开始,把参数压栈 m

基于8086CPU微处理器的汇编学习之MOV指令

汇编指令:MOV的作用是往某个寄存器中存入数值. 格式:mov  寄存器名,数值                数值-->寄存器 mov  寄存器A,存器寄B          B-->A PS:必须前后位数匹配,如: mov   ah,bx     ;error   ah is 8 bit,bx is 16 bit mov   ah, bh    ;right    ah and bh all is 8  bit mov   cx,dx     ;right     cx and dx al

ARM汇编中LDR伪指令和LDR指令

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