好久没碰了,但是你猜也猜得出来呀。
一般是把数据的值赋给地址,所以一般来说F346H、0A90H是数据,12450H、12452H是地址。
你看12450H与12452H挨着呢,这也证明了他们是地址。
DS为1200H,左移4位,加上[450H]不正好是12450H吗。
我忘了LDS的意思了,但你根据书中讲到的LDS的意思,应该能看懂这条指令。
查了一下:
LDS是传送分段地址的指令,比如。
LDSSI,BUF2
它要求BUF2有四个字节,高字存入DS,低字存入SI。
但哪个算高字,我弄不清了,有查了一下:
指令形式:LDSDEST.SRC。
所执行的操作:
DEST=WORDPTR[SRC];
DS=WORDPTR[SRC+2];
特别说明:WORD的意思是字,PTR的意思是指针,合起来的意思就是字指针。也就是说WORDPTR[SRC]意思是SRC所指向的内存地址为2个字节(一个字就是2个字节)。
所以结果应该为:DS=0A90H,SI=F346H。
你这样想,这条指令格式是LDS reg,mem。
这条指令的功能是把mem指向的地址,高位存放在DS中,低位存放在reg中.。
下面说的是16位的.
比如当前DS=1000H,BX=0100H.。
当前内存:
1000:0100 01
1000:0101 02
1000:0102 03
1000:0103 04
而有一条指令:LDS BX,[BX]。
[BX]指向1000:0100,执行后BX存低位的内容,也就是BX=0201H,。
而DS则存高位的内容,也就是[BX+2]的内容,DS=0403H。
这样你是不是就理解了为什么要加2,因为[BX+2]才能指向高位.想清楚了16位的,你也就想通了32位的。
BUF2
DD
那么,BUF2占用四个字节,高字存放T的段地址,低字存放T的偏移地址。
而T定义在DAT2段里,所以它的段地址就是DAT2。
BUF高字的地址不就是用BUF+2表示吗,所以BUF+2=DAT2。
其实这个和LDS指令没有关系,只要有BUF2。
DD
T这样的定义,那么BUF2+2的字单元里存放的就是T的段地址,也就是DAT2了。
LDS是传送分段地址的指令,比如。
LDS
SI,BUF2
它要求BUF2有四个字节,高字存入DS,低字存入SI。
通常DS与DX或BX或SI配合使用,ES与BX或DI配合便用。LDS或LES指令是将双字的内存单元的值同时装载到段地址:段偏移寄存器中,低字值装入偏移、高字值装入段地址。
例如:
LDS BX, addr1
结果是正确的。两个指令的功能如下:
LDS reg,src ; 功能:(reg)<--(src),(DS)<--(src+2)。
LES reg,src ; 功能:(reg)<--(src),(ES)<--(src+2)。
都是把连续2个地址下的内容作为地址传送给SI和DS、DI和ES,就是“传地址”
原文地址:http://www.qianchusai.com/lds%E6%8C%87%E4%BB%A4%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D.html