Rox*_*anu 9 x86 assembly command
什么是下面的命令的区别是: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
Run Code Online (Sandbox Code Playgroud)
...但是当我打印str1
并str1
使用以下宏时,第二个块不会返回预期的结果.
print MACRO param
lea DX, param
mov AH, 9
int 21h
ENDM
Run Code Online (Sandbox Code Playgroud)
nrz*_*nrz 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
集di
根据存储在0x6620的值:ptr_str2(ds
是大多数x86指令缺省段,和目前ds
的值为0x6620),并且还设置es
根据存储在0x6620的值:ptr_str2 + 2.可能这不是你想要做的.