微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

article/2025/11/6 9:40:05

博主联系方式:
QQ:1540984562
QQ交流群:892023501
群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176

传送类指令

      • 1.通用传送类指令:MOV指令
        • MOV例题讲解:
      • 2.取有效指令LEA指令:
        • LEA例题讲解:
      • 3.取地址指针指令:LDS、LES
        • LDS例题讲解:
        • LES例题讲解:
      • 4.标志传送指令:LAHF、SAHF
      • 5.数据交换指令:XCHG
      • 6.字节转换指令:XLAT
      • 7.堆栈操作指令:PUSH、POP、PUSHF、POPF
        • 栈操作例题讲解:

指令分类
功能:把数据、地址、或立即数传送到寄存器或存储单元中 。

1.通用传送类指令:MOV指令

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说明是字操作
传输方向

MOV例题讲解:

问:将以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	;指针自加1DEC   CX		;计数器减1JNZ  AGAIN 	;结果不为0转移		等效于LOOP

有关寻址方式的一些语法要求请看这里!!!

2.取有效指令LEA指令:

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

LEA例题讲解:

问:如指令执行前(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;

3.取地址指针指令:LDS、LES

LDS指令 (指针送寄存器和DS)
指令格式:LDS reg16 ,存储器寻址方式
语法格式:LDS reg16 ,reg16/mem/lable
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到DS

LDS例题讲解:

问: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例题讲解:

问: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

4.标志传送指令:LAHF、SAHF

LAHF SAHF

5.数据交换指令:XCHG

执行的操作:交换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。

6.字节转换指令:XLAT

XLAT

7.堆栈操作指令:PUSH、POP、PUSHF、POPF

堆栈概念–存储器的一段区域,按“先进后出”的原则进行存取操作。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
过程:
1
压栈和出栈的流程:

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

流程
PUSHF和POPF:
在这里插入图片描述
在这里插入图片描述

栈操作例题讲解:

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在任何时候都指向当前的栈顶

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176


http://chatgpt.dhexx.cn/article/uSMT9Mru.shtml

相关文章

汇编指令lea 和 mov 区别

刚开始学汇编都会接触到指令lea 和mov,但是这两个指令用法看起来很像,会经常误以为两者其实没有很大区别,甚至会误认为两者就是相等的,笔者本人也是很迷,而且书上对lea的讲解又十分有限,但是通过不懈的知识…

x86 LEA 指令

友链 参考链接: https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction 在使用OllyDBG反汇编一个exe的时候,看到了这样的代码 这部分对应的源代码应该是: return 2*xy;明明是一个乘法和加法运算&#x…

数据传送类指令(PUSH,POP,LEA)

目录 数据传送类指令 堆栈的概念: 进栈指令 (PUSH) 出栈指令(POP) 练习 LEA取偏移地址(有效地址EA)指令(去括号) LEA和OFFSET区别: 用法注意 LEA和MO…

汇编:lea指令学习

加载有效地址(load effective address)指令就是lea,他的指令形式就是从内存读取数据到寄存器,但是实际上他没有引用内存,而是将有效地址写入到目的的操作数,就像是C语言地址操作符&一样的功能,可以获取…

汇编中的lea指令的作用,简单清晰明了不废话!

首先看一下intel开发手册上对lea的官方解释: lea,官方解释Load Effective Address,即装入有效地址的意思,它的操作数就是地址; 常见的几种用法: 1、lea eax,[addr] 就是将表达式addr的值放入…

设计模式

简介 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式可以提高代码的可复用性、可维护性、可读性、稳健性以及安全性。 项目中合理地运用设计模式可以完美地解决很多问题,但滥用设计模式不但不会带来任何好处&#x…

设计模式选择题复习

1.在UML提供的图中,( )用于描述系统与外部系统及用户之间的交互 A.用例图 B.类图 C.对象图 D.部署图 2.在UML提供的图中,( )用于按时间顺序描述对象之间的交…

单例设计模式

一.何为单例设计模式 如其名字,单例设计模式就是指的是一个类中只允许存在一个对象实例。 在java中,我们存在两种创建单例模式的思路:饿汉式和懒汉式 ①饿汉式:在创建类时直接创建对象实例 public class SingleHungryMan {//建立类…

设计模式在程序中的使用

OO设计的主要目的,在于分割责任,将每个模块的责任降低到合理的程度,并对各个模块进行封装以及降低两个模块之间的耦合度,达到修改一处不影响另外一处的目的。 这个原则其实并不仅仅局限于OO设计,只是OO设计提供了更好…

设计模式之命令模式

命令模式 命令模式的定义非命令模式实现:命令模式的实现: 命令模式的定义 说实话这个模式挺令人纠结的,但从这个模式的定义上来看,有点让人摸不到什么头脑,而且查看资料以后会发现还是有点稀里糊涂的,说懂…

《C++ 设计模式》

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 设计模式(Design Pattern)代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处: 可重用代码保…

设计模式课程设计

文章目录 题目要求: 具体作业如下:一、设计思路二、所用模式介绍1.简单工厂模式2.装饰模式3.观察者模式 具体实现过程程序分为三个部分: PS.代码写的比较敷衍,主要是应付作业用,请大家自行斟酌抄袭 又到了一年两度的课程设计时间&…

23种设计模式总结

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢…

设计模式之——桥接模式

设计模式: 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性…

面向对象程序设计

之前复习面向对象的时候整理的,丢出来一起分享一下。因为复习得很赶,只是大致的整理,且大部分图片来自老师的ppt,可能不是很准确。如果要详细了解其中的某个知识点请另外搜索。 但是老师不讲武德啊,明明提纲给了不按提…

MVC设计模式

MVC的全名是Model View Controller,是模型(Model)-视图(view)-控制器(controller)的缩写,是一种设计模式。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在…

设计模式考题复习

一.定义 设计模式六大基本原则: 单一职责原则:一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;里氏替换原则:能出现子类的地方都应该可以允许父类出现,也就是子类可以扩展父类的…

一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、设计模式是什么? 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应…

设计模式之策略模式详解

设计模式之策略模式详解 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多&#xff0c…

设计模式——桥接模式

定义 桥接模式(Bridge Pattern),也叫做桥梁模式,结构型设计模式的一种,这个模式相对来说有些难理解。桥接,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥。 …