以下命令: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
发布于 2013-12-07 07:23:21
lea
是负载有效地址的意思。因此,lea SI, str1
将si
设置为str1
的偏移量。lea
和其他指令使用的正确内存寻址语法取决于所使用的汇编程序,有些汇编程序需要lea si,[str1]
。
与lea
相比,lds
和les
做的事情完全不同。lds
表示使用DS的加载指针,同样,les
表示使用ES的加载指针。实际上,lds SI, ptr_str1
根据存储在内存地址ds:ptr_str1
中的值来设置ds
和si
(在某些汇编程序中,语法是[ds:ptr_str1]
)。
那么,这些指令在您的代码中做了什么:
lea SI, str1
将si
设置为指向str1
的地址。这看起来很完美,OK.lds SI, ptr_str1
将si
设置为'My'
(十六进制为0x794d),并将ds
设置为' f'
(十六进制为0x6620)。请注意,x86是一种小端体系结构。ds
是使用lds
和les
读取指针值的默认段。因此,字符串的前4个字节被用作加载到ds:si
中的地址,而不是将字符串地址加载到ds:si
。我假设这不是您想要的do.les DI, ptr_str2
根据存储在0x6620:ptr_str2中的值设置di
(ds
是大多数x86指令的默认段,目前ds
的值为0x6620),并且还根据存储在0x6620:ptr_str2+2中的值设置es
。这可能不是您想要做的。https://stackoverflow.com/questions/20434360
复制相似问题