以下命令之间有什么区别:LEA
,LDS
,LES
?我搜索了答案,但我不是很清楚。据我所知,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
...但是当我使用以下宏打印str1
和str1
时,第二个块不会返回预期的结果。
print MACRO param
lea DX, param
mov AH, 9
int 21h
ENDM
答案 0 :(得分:13)
lea
表示加载有效地址。因此lea SI, str1
将si
设置为str1
的偏移量。 lea
使用的正确内存寻址语法和其他指令取决于使用的汇编程序,某些汇编程序需要lea si,[str1]
。
lds
相比, les
和lea
执行的操作完全不同。 lds
表示使用DS加载指针,同样les
表示使用ES加载指针。在实践中,lds SI, ptr_str1
根据存储在内存地址ds
中的值设置si
和ds:ptr_str1
(某些汇编程序中的语法为[ds:ptr_str1]
)。
那么,这些说明在您的代码中的作用是什么:
lea SI, str1
将si
设置为指向str1
的地址。这似乎完全没问题。
lds SI, ptr_str1
将si
设置为'My'
(十六进制为0x794d),并将ds
设置为' f'
(十六进制为0x6620)。请注意,x86是一个小端架构。 ds
是使用lds
和les
读取指针值的默认细分。因此,不是将字符串地址加载到ds:si
,而是将字符串的前4个字节用作加载到ds:si
的地址。我认为这不是你想要做的。
les DI, ptr_str2
根据存储在0x6620中的值设置di
:ptr_str2(ds
是大多数x86指令的默认段,目前ds
具有值0x6620)并根据存储在0x6620:ptr_str2 + 2中的值设置es
。可能这不是你想要做的。