2009-11-09 9 views
83

나는이 지침의 차이가 무엇인지 알고 싶습니다 : 당신은 단지 문자를 지정하는 경우MOV와 LEA의 차이점은 무엇입니까?

MOV AX, [TABLE-ADDR] 

LEA AX, [TABLE-ADDR] 
+2

중복 : http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction –

+4

감사 닉을. 우선,이 링크를 살펴보면이 질문에 대한 답을 찾지 못했을 것입니다. 특정 정보를 찾고 있었는데 제공 한 링크의 토론은 본질적으로 더 일반적인 것입니다. – naveen

+2

나는 옛날에 @ Nick 's dup을 upvoted했으나 지금은 vtc했다. 반성 할 때, 나는 너무 성급했고 이제는 하인에게 a) 다른 질문은 "차이점은 무엇인가"에 대답하지 않고 b) 이것은 유용한 질문이다. 사과는 내 실수에 대한 나빈하기 - 나만 VTC을 취소 할 수 있다면 ... 추가 대 –

답변

107
  • LEA는 MOV는 한마디로 부하 값

는 LEA가로드 의미

  • 로드 유효 주소를 의미합니다 MOV가 해당 주소에서 실제 값을로드하는 반면 주소 지정중인 항목에 대한 포인터입니다.

    LEA의 목적은 어셈블러의 정수 계산으로 MOV를 (a 비 단순 어드레스 계산을 수행하고 [이후 사용량] 단지 상수가 관여

    LEA ax, [BP+SI+5] ; Compute address of value 
    
    MOV ax, [BP+SI+5] ; Load value at that address 
    

    을, 결과를 저장하기 위해 하나를 허용하는 것이다)는 때때로 LEA 사용의 가장 단순한 경우와 겹치는 것처럼 보일 수 있습니다. 어디 그 유용한 것은 여러 기본 주소를 여러 부분으로 계산이있는 경우 등등

  • +3

    한 덕분에 table_addr' OFFSET'이다 [답] (http://stackoverflow.com/a/25824111/183120) 또 다른 질문 저를 도왔다. – legends2k

    +0

    그것은 나를 혼란 그 레아는 이름에 "부하"를 가지고 있으며, 모든 입력은 메모리 위치를 계산 즉시 값 또는 레지스터 중 하나입니다 있기 때문에 사람들은 그것을 "로드"레지스터로 계산 된 주소를 말한다. AFAICT lea는 계산 만 수행하고, 아무것도로드하지 않으며, 로딩은 메모리를 만지는 것을 의미합니까? –

    +1

    @josephGarvin IIRC 용어 인 fetch가 해당 측면에 적용됩니다. 로드는 레지스터의 값을 처음부터 무언가로 대체하는 방법입니다. 예 : 'LAHF'는 다음과 같습니다 : _ 플래그를 AH 레지스터에 _로드하십시오. CLR의 CIL (더 높은 수준의 스택 기반 추상 기계에서 용어 _load_은 개념적 스택에 값을 넣는 것을 말하며 일반적으로 'l' ...이고's' ... 등가물은 역함수를 수행합니다) . 이 노트들 : https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/load.html)은 귀하의 구별이 적용되는 아키텍처가 실제로 있음을 시사합니다. –

    10

    는 차이가 없다. LEA는하지만, 더 많은 능력을 가지고 있으며, 당신은 여기에 대해 읽을 수 있습니다

    http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136

    +0

    나는이 라벨에 관해서 GNU에 사실이 아닙니다 어셈블러 것을 제외하고, 생각 .bss 세그먼트에서? AFAIR 당신은 정말로 TextLabel, LabelFromBssSegment'을 쓸 수 없습니다. 같은' \t .lcomm의 LabelFromBssSegment .bss라고, 4', 당신이'의 movl $ textLabel라는, LabelFromBssSegment' 할 것입니다, 그렇지? – JSmyth

    +0

    @JSmyth : 'lea'에는 레지스터 대상이 필요하지만 'mov'에는 'imm32'소스와 메모리 대상이있을 수 있기 때문입니다. 물론이 제한은 GNU 어셈블러에만 국한되지는 않습니다. –

    +0

    또한,이 질문에 대한 질문은 'MOV AX, [TABLE-ADDR]'에 대한 질문이기 때문에이 대답은 기본적으로 잘못되었습니다. 그래서 큰 차이가 있습니다. 등가 명령은 mov 인 도끼, 명확한 설명은 –

    10

    그것은 사용 어셈블러에 따라, MASM에서

    mov ax,table_addr 
    

    그래서 그것을

    mov ax,word ptr[table_addr] 
    

    로 작동하기 때문에 첫 번째 바이트를 table_addr에서로드하고 오프셋을 table_addr으로로드하지 않습니다. 당신은 사용해야하는 대신

    mov ax,offset table_addr 
    

    또는 동일하게 작동

    lea ax,table_addr 
    

    .

    lea 버전도 table_addr이 로컬 변수 인 경우 잘 작동합니다.

    some_procedure proc 
    
    local table_addr[64]:word 
    
    lea ax,table_addr 
    
    +0

    덕분에 많은 답변을들을 수 없었습니다. ( – naveen

    +4

    x86 명령어와 MOV의 차이점 LEA는 어셈블러에 의존하지 않습니다. –

    0

    차이점은 미묘하지만 중요합니다. MOV 명령은 사실상 TABLE-ADDR 레이블의 약어 인 MOVe입니다. LEA 명령은 간접 명령 인 'Load Effective Address'입니다. 즉, TABLE-ADDR은로드 할 주소가있는 메모리 위치를 가리 킵니다.

    LEA를 효과적으로 사용하는 것은 C와 같은 언어로 된 포인터를 사용하는 것과 동일하므로 강력한 명령어입니다.

    +6

    이 대답은 혼란 스럽습니다. "LEA 명령은 간접 명령 인 'Load Effective Address'입니다. 즉, TABLE-ADDR은 로드 할 주소가 있습니다. "실제로 LEA는 주소의 내용이 아닌 주소를로드합니다. 실제로 상황에 따라 질문자가 MOV와 LEA가 겹칠 수 있으며 정확하게 동일한 작업을 수행해야한다는 것을 확신해야한다고 생각합니다. –

    21

    명령 MOV reg, addr은 주소 addr에 저장된 변수를 레지스터 reg에 읽는 것을 의미합니다. 명령어 LEA reg, addr은 레지스터에 레지스터에 저장된 변수가 아닌 주소를 읽는 것을 의미합니다.

    MOV 명령의 또 다른 형태는 MOV reg, immdata입니다.상수) immdata 레지스터에 reg. LEA 레지스터의 addr, 즉 addr이 단지 상수 (즉, 고정 오프셋) 인 경우, LEA 명령은 본질적으로 동등한 MOV 레지스터 인 즉치 데이터와 동일한 상수를로드하는 immdata 명령과 정확히 동일하다는 점에 유의하십시오. NASM 구문에서

    31

    : MASM 구문에서

    mov eax, var  == lea eax, [var] ; i.e. mov r32, imm32 
    lea eax, [var+16] == mov eax, var+16 
    lea eax, [eax*4] == shl eax, 2  ; but without setting flags 
    

    하는 MOV-즉시 대신 부하를 얻을 수 OFFSET var를 사용합니다. 기본적으로

    +1

    NASM 문법 만 .MASM 문법에서'mov eax, var'는'mov eax, [var]'와 같은로드이고,'mov eax, OFFSET var'를 사용하여 레이블을 즉치 상수로 사용해야합니다 –

    +0

    명확하고 단순하며 내가 확인하려고했던 것을 보여줍니다. 감사. – JayArby

    2

    ... "...을 계산 한 후 ... REG으로 이동은" 당신이 단지 값이 포인터 것을 잊어 버린 경우뿐만 아니라 다른 목적 :

    에 대한 좋은 것 같다

    : 당신은

    MOV EBX , 1 
    MOV ECX , 2 
    
    ;//with 1 instruction you got result of 2 registers in 3rd one ... 
    LEA EAX , [EBX+ECX+5] 
    

    EAX = 8

    이 될 것 originaly .. 코드 최적화/최소화 ... 지금 무엇을 사용할 수 있습니다

    +0

    메모리 피연산자 머신 인코딩과 구문을 사용하는 ['lea'는 shift-and-add 명령입니다.] (https://stackoverflow.com/questions/46597055/address-computation-instruction-leaq/46597375#46597375) 하드웨어가 이미 ModR/M + SIB + disp0/8/32을 디코딩하는 방법을 알고 있기 때문입니다. –