指令形式: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