以下命令: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
复制相似问题