地址传送指令LEA,LDS,LES;

指令形式:LEA DEST,SRC;

指令格式:LEA REG,MEM

 所执行的操作:DEST=OFFSET SRC;将DEST赋值为SRC的偏移地址

例:
进入MS-DOS,
DEBUG
-A100
LEA BX,[10F8];这里缺省的段是DS;这时BX被赋值为10F8
MOV BX,1000;
MOV SI,1234;在DEBUG里,使用的是16进制。此1234非彼1234
LEA DX,[BX+SI];
到这里指令输入完了。再一次回车ENTER退出汇编模式
然后输入R再回车,查看寄存器里现在的内容

前面输了好几次都输入错误-_-
第一个错误:LEA BX,10F8
SRC不能为立即数。
第二个错误:LEA BX,DS:10F8;在DEBUG里要指定段存储器的话不是直接加SEG:的。
后面的错误也跟前面的两个一样。
这里可以说一下如果我一定要LEA BX,SS:[10F8]那怎么办呢?
可以这样:
SS:;加一个回车
LEA BX,[10F8];
这时候调试的话,可以发现指令顺利执行了^_^

为什么这样呢?如果你随便拿一个程序反汇编看看它的汇编码,可以发现在用到了段跨越的地方,它是先指定段,再后跟操作指令。(或者可以以后写一个很短的汇编程序验证一下)

回到前面,查看了寄存器的内容,再反汇编检查一下代码

代码没错,然后就慢慢的用DEBUG的T指令去跟踪。用P指令也行。
后面的略过了。时间不早了。我还要忙其它事呢。

————————————————

指令形式:LDS DEST.SRC

所执行的操作:
DEST=WORD PTR [SRC];
DS=WORD PTR [SRC+2];
特别说明:WORD的意思是字,PTR的意思是指针,合起来的意思就是字指针。也就是说WORD PTR[SRC]意思是SRC所指向的内存地址为2个字节(一个字就是2个字节)。

指令格式:LDS REG,MEM

显而易见:DEST需要两个字节,DS也要两个字节,那么MEM肯定是指向4个字节的内存了。4个字节就是双字(Double Word)

假定1000:10F0开始存放了4个字节(可以用DEBUG的E指令写内存)
1000:10F0   78
1000:10F1   56
1000:10F2   34
1000:10F3   12
它们是倒着存放的-_-
(可以用DEBUG的E指令写内存)
(E1000:10F0回车,78空格56空格34空格12空格回车。然后可以U1000:10F0看看写对了没)
然后用DEBUG的A指令写入汇编指令(如果是前面先执行过跟踪,别忘了RIP回车再100回车,将指令指针复原)
MOV AX,1000
MOV DS,AX     ;段寄存器不可以直接写的,有点麻烦-_-)
LDS BX,[10F0]
跟踪可以发现,最后DS=1234;BX=5678

MOV AX,1000
MOV DS,AX
LDS BX,[10F0]
这些指令可以换成
MOV AX,1000
MOV ES,AX
ES:
LDS BX,[10F0]
效果一样。

不过我调试了一下,先写了1000:10F0的内存再写汇编指令的话老是汇编出错。不知道哪里的毛病。

如MOV AX,1000的机器码是B80010;可是写好了再用U反汇编看一下机器码变成了C70A1000。

懒的去调了。就先写了汇编指令然后写内存。跟踪一下。当前学习的是LDS指令

————————————————————————————————————————

LES 指令

指令形式:LES DSET,SRC

指令格式:LES REG,MEM

所执行的操作:
DEST=WORD PTR[SRC]
ES=WORD PTR[SRC+2]

————————————————————————————————————————
————————————————————————————————————————
做个广告:要买书不?到我店里看看http://shop34783094.taobao.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值