装配命令LEA / LDS / LES

时间:2013-12-06 22:01:19

标签: assembly x86 command

以下命令之间有什么区别:LEALDSLES?我搜索了答案,但我不是很清楚。据我所知,block1应该等同于block2

.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

...但是当我使用以下宏打印str1str1时,第二个块不会返回预期的结果。

print MACRO param
    lea DX, param
    mov AH, 9
    int 21h
ENDM

1 个答案:

答案 0 :(得分:13)

lea表示加载有效地址。因此lea SI, str1si设置为str1的偏移量。 lea使用的正确内存寻址语法和其他指令取决于使用的汇编程序,某些汇编程序需要lea si,[str1]

lds相比,

leslea执行的操作完全不同。 lds表示使用DS加载指针,同样les表示使用ES加载指针。在实践中,lds SI, ptr_str1根据存储在内存地址ds中的值设置sids:ptr_str1(某些汇编程序中的语法为[ds:ptr_str1])。

那么,这些说明在您的代码中的作用是什么:

  1. lea SI, str1si设置为指向str1的地址。这似乎完全没问题。

  2. lds SI, ptr_str1si设置为'My'(十六进制为0x794d),并将ds设置为' f'(十六进制为0x6620)。请注意,x86是一个小端架构。 ds是使用ldsles读取指针值的默认细分。因此,不是将字符串地址加载到ds:si,而是将字符串的前4个字节用作加载到ds:si的地址。我认为这不是你想要做的。

  3. les DI, ptr_str2根据存储在0x6620中的值设置di:ptr_str2(ds是大多数x86指令的默认段,目前ds具有值0x6620)并根据存储在0x6620:ptr_str2 + 2中的值设置es。可能这不是你想要做的。