首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >汇编命令LEA/LDS/LES

汇编命令LEA/LDS/LES
EN

Stack Overflow用户
提问于 2013-12-07 06:01:19
回答 1查看 24.2K关注 0票数 9

以下命令:LEALDSLES有什么区别?我一直在寻找答案,但我不是很清楚。据我所知,block1应该等同于block2

代码语言:javascript
运行
复制
.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时,第二个代码块没有返回预期的结果。

代码语言:javascript
运行
复制
print MACRO param
    lea DX, param
    mov AH, 9
    int 21h
ENDM
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-07 07:23:21

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

lea相比,ldsles做的事情完全不同。lds表示使用DS的加载指针,同样,les表示使用ES加载指针。实际上,lds SI, ptr_str1根据存储在内存地址ds:ptr_str1中的值来设置dssi (在某些汇编程序中,语法是[ds:ptr_str1] )。

那么,这些指令在您的代码中做了什么:

  1. lea SI, str1si设置为指向str1的地址。这看起来很完美,OK.
  2. lds SI, ptr_str1si设置为'My' (十六进制为0x794d),并将ds设置为' f' (十六进制为0x6620)。请注意,x86是一种小端体系结构。ds是使用ldsles读取指针值的默认段。因此,字符串的前4个字节被用作加载到ds:si中的地址,而不是将字符串地址加载到ds:si。我假设这不是您想要的do.
  3. les DI, ptr_str2根据存储在0x6620:ptr_str2中的值设置di (ds是大多数x86指令的默认段,目前ds的值为0x6620),并且还根据存储在0x6620:ptr_str2+2中的值设置es。这可能不是您想要做的。
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20434360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档