title: Assembly commands LEA/LDS/LES
body: <p>What is the difference between the following commands: <code>LEA</code>, <code>LDS</code>, <code>LES</code>? I searched for the answer but I'm not very clear on it. From what I understood <code>block1</code> should be equivalent to <code>block2</code>.</p>
  
  <pre><code>.data
    str1 db 'My first string. $'
    str2 db 'My second string. $'
    ptr_str1 dd str1 
    ptr_str2 dd str2
  .code
    _block1:
    mov AX, @data
    mov DS, AX
    mov ES, AX
    lea SI, str1
    lea DI, str2
  
    _block2:
    lds SI, ptr_str1
    les DI, ptr_str2
  </code></pre>
  
  <p>... but when I print <code>str1</code> and <code>str1</code> using the following macro, the second block doesn't return the expected results. </p>
  
  <pre><code>print MACRO param
      lea DX, param
      mov AH, 9
      int 21h
  ENDM
  </code></pre>