MOV指令的格式为: MOV DST, SRC (MOV指令的实质是:把SRC的内容复制到DST中,执行操作后 SRC的内容不变!)
语法格式:MOV reg/mem/seg ,reg/mem/seg/imm
Reg:寄存器,mem:存储器,seg:段寄存器,imm立即数
对标志位的影响:除标志寄存器传送指令外,均不影响标志位
当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明
MOV [BX+SI], 255 ;非法指令,修正:
MOV BYTE PTR [BX+SI],255;BYTE PTR说明是字节操作
MOV WORD PTR [BX+SI],255;WORD PTR说明是字操作
问:将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中,若AREA1和AREA2都在当前数据段中,可以用带有循环控制的数据传送程序来实现。
MOV SI,OFFSETAREA1;(OFFSET是取地址
MOV DI,OFFSETAREA2; 偏移量,必须加上)
;SI DI作为指针指向两个内存的首地址
MOV CX,100; 循环次数为100
AGAIN:MOV AL,[SI];RD为低
MOV [DI],AL ;WR为低 通过中间寄存器,将SI指向的内容转移到DI指向的空间
INC SI
INC DI ;指针自加1
DEC CX ;计数器减1
JNZ AGAIN ;结果不为0转移 等效于LOOP
有关寻址方式的一些语法要求请看这里!!!
指令格式: LEA reg16 ,存储器寻址方式/地址标号
将源操作数指向的偏移地址送入寄存器中
LEA BX,[BX+SI+0F62H]
如指令执行前:
(BX)=0400H,(SI)=003CH
则指令执行后:
(BX)=0400H+003CH+ 0F62H
=139EH
;139EH是偏移地址!不是DS:139EH中的内容!
LEA 指令与MOV 指令的区别:
LEA SI,BUFF;将标号BUFF的偏移地址送入寄存器中
MOV SI,BUFF;将标号BUFF所指存储单元的内容送入SI
问:如指令执行前(SI)=3000H,(BX)=0400H,MEEM=12000H,DS=1000H,执行LEA BX,MEEM指令后BX的内容为
BX存储的是MEEM的偏移地址,BX=MEEM-DS*16H=2000H;
问:执行LEA BX,(SI)指令后BX的内容为
BX存储的是SI的偏移地址所以BX=(SI)=3000H;
LDS指令 (指针送寄存器和DS)
指令格式:LDS reg16 ,存储器寻址方式
语法格式:LDS reg16 ,reg16/mem/lable
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到DS中
问:LDS AX,(SI +20 ) (20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H,
执行的结果为:AX=???,DS=???
src存储单元地址=DS*16H + SI + 20H =20000+0030+0020=20050;
AX=(20050)=1234H;
DS=(20050+2)=5678H;
问:已知指令执行前(22000H~22005H)=12H、34H,56H、78H,9AH、BCH,AX=0000H,DS=2000H,BX=2000H,MEEM=22002H,执行指令LDS AX,MEEM和执行指令LDS AX,(BX)
LES指令 (指针送寄存器和ES)
指令格式:LES reg16 ,存储器寻址方式
语法格式: LES reg16 ,reg16/mem/lable ;
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到ES中
问:LES AX,20(SI)或 LES AX,(SI +20 ) 假设执行前为(20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H
执行的结果为:AX=???,ES=???
物理地址=20020+0030H=20050H
AX=(20050H)=1234H
ES=(20050+2H)=5678H
执行的操作:交换DST与SRC的内容 DST SRC
语法格式为: XCHG reg/mem,reg/mem
注意点:这种交换只能在通用寄存器之间、通用寄存器与存贮器之间进行,存储器与存储器之间不能交换段寄存器不能作为一个操作数。
例:XCHG BX ,[BP+SI]
如指令执行前:(BX)=6F30H,(BP)=0200H,2F246H=54H 2F247H=51H ,(SI)=0046H,(SS)=2F00H,(2F00H)=4254H,OPR2的物理地址=2F00×16+0200+0046=2F246H
则指令执行后:(BX)=5154H,(2F246H)=6F30H。
堆栈概念–存储器的一段区域,按“先进后出”的原则进行存取操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。
堆栈是一块特殊的存储区域,利用这块区域可以存储返回地址等信息,从而实现子程序的嵌套调用。
作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。
PUSH:
指令格式:进栈 PUSH SRC (堆栈压入指令,进栈指令)
操作:(SP) (SP)-2, 指针-2
((SP)+1,(SP)) SRC 把操作数压入栈中
功能:将16位寄存器,段寄存器,16位存储单元数据压入堆栈。
POP:
指令格式: 出栈 POP DST
操作:(DST) ((SP)+1,(SP)),
(SP) (SP)+2
过程:
压栈和出栈的流程:
MOV AX,8000H
MOV SS,AX ;设堆栈段地址 (SS)=8000H
MOV SP,2000H ;设堆栈指针
MOV DX,3E4AH
PUSH DX ;(先进) DX内容存入(SS×16+1FFEH=(SP-2))
PUSH AX ; AX内容存入(SS×16+1FFCH =(SP-2-2) )
PUSH (2000H);取数据段 (DS×16+2000H)内容进栈
;存入(SS×16+1FFAH =(SP-2-2-2) )
POP (2000H); (SS×16+1FFAH)到(DS×16+2000H)
POP AX ; (SS×16+1FFCH)到AX
POP DX ;(后出) (SS×16+1FFEH)到DX
1、交换DS 和 ES的内容
PUSH DS;
PUSH ES;
POP DS;
POP ES;
2、在子程序设计时,需要从子程序返回时保持通用寄存器不变,这时候可以利用堆栈把寄存器保护起来
PUSH AX;
PUSH BX;
PUSH CX;
PUSH DX;
//调用子程序;
//子程序返回;
POP DX;
POP CX;
POP BX;
POP AX;
注意事项:
PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;
·堆栈操作只能作字操作;
·SS:SP在任何时候都指向当前的栈顶