数据传送指令

数据传送:负责把数据、地址或立即数传送到寄存器或存储单元中

数据传送指令可以分为四个类型:通用数据传送指令、地址传送指令、标志位传送指令、专用累加器传送指令(输入、输出指令)

一、通用数据传送指令

(一)传送字或字节指令 MOV

(1)重点掌握内容

  • 格式MOV DST,SRC

  • 执行的操作(DST) ← (SRC)

  • 标志位:不影响

功能:将源操作数传送到目的操作数
这里的传送实际上是复制,将 SRC 复制到DSTSRC 内容不变

注意

  • DSTSRC 必须类型一致(都是 8位 或者是 16位)
  • DST不能是立即数(立即数不能作为目的操作数)
  • SRC 是立即数时,DST不能是段寄存器,必须通过通用寄存器作中介
  • 两个操作数不能同时为存储器操作数,存储单元之间不能直接传送数据
  • 两个操作数不能同时为段寄存器操作数,段寄存器之间不能直接传送

(2)传送指令格式总结

在这里插入图片描述

  • SRC可以是:寄存器、存储单元、立即数、段寄存器
  • DST可以是:寄存器、存储单元(此时SRC不能是存储单元)、除CS以外的段寄存器(此时SRC不能是立即数和段寄存器)

(3)MOV指令使用的几种情况

  • 立即数传送给通用寄存器或存储器

    MOV AL,12H
    ;8位数据传送,将12H传送到寄存器AL中
    MOV AX,3456H
    ;16位数据传送,将3456H传送到寄存器AX中
    
  • 通用寄存器之间相互传送

    MOV AX,BX
    ;16位数据传送,将BX中的数据传送到寄存器AX中
    MOV CL,BH
    ;8位数据传送,将BH中的数据传送到寄存器CL中
    
  • 通用寄存器和存储器之间相互传送

    MOV AX,[BX]
    ;16位数据传送,将BX指定的连续2个字节中的数据传送到AX中
    MOV [SI],DH
    ;8位数据传送,将DH中的数据传送到由SI指定的内存单元中
    
  • 段寄存器与通用寄存器、存储器之间的相互传送

    MOV DS,AX
    MOV BX,ES
    MOV ES,[SI]
    MOV [DI],SS
    

注意MOV [BX],0 指令是错误的,因为述指令的源操作数是立即数,其长度是不确定的,目的操作数是主存单元,但以低地址访问主存单元时,[BX]并不能说明是字节单元还是字单元,因此长度也是不确定的

解决办法:在指令中指定内存单元的类型,将上述指令改写为下面两种形式

MOV BYTE PTR BX,0 	;BYTE PTR 说明是字节操作,写一个字节单元
MOV WORD PTR BX,0 	;WORD PTR 说明是字操作,写一个字单元

这样目的操作数长度就是明确的,指令是正确的

(二)堆栈操作指令 PUSH & POP

堆栈是一个“先进后出”的存储区,段地址存放在 SS 中,SP在任何时候都指向栈顶,进出栈后自动修改 SP

(1)重点掌握内容

PUSH 进栈指令
  • 格式PUSH SRC

  • 执行的操作(SP) ← (SP)-2
    ((SP)+1,(SP)) ← (SRC)

  • 标志位:不影响

功能:把通用寄存器,段寄存器,存储单元中的一个字入栈

POP出栈指令
  • 格式POP DST

  • 执行的操作(DST) ← ((SP)+1,(SP))
    (SP) ← (SP)+2

  • 标志位:不影响

功能:从堆栈顶部弹出一个字,到通用寄存器、段寄存器或存储单元

【附注执行操作的解释:因为堆栈指针SP总是指向已经存入数据的栈顶(不是空单元),所以PUSH指令是先将(SP)-2,后将内容压栈,(即先修改SP使之指向空单元,后压入数据),而POP是先从栈顶弹出一个字,后将堆栈指针(SP)+2

堆栈操作指令使用注意事项
  • 堆栈操作必须是以为单位
  • 堆栈操作不能用立即寻址方式
  • DST 不能是 CS ,即 POP CS 是不合法的

(2)应用实例

【例1】假设 (AX) = 2107H

在这里插入图片描述

在这里插入图片描述

【例2】DS=3000H,BX=2000H,SI=0002H,AX=1234H,CX=5678H,(32000H)=99H,(32001H)=88H,(32002H)=77H,(32003H)=66H,(32004H)=55H,(32005H)=44H …

程序如下:

PUSH AX
PUSH CX
POP [BX]
POP [BX+SI]

求执行上面程序后
(1)(32001H)=?
(2)(32002 H)=?,AX=?,BX=?,CX=?

【解】分析如下

在这里插入图片描述

在这里插入图片描述

(1)(32001H)=56H
(2)(32002H)=34H,AX=1234H,BX=2000H,CX=5678H

(三)交换指令 XCHG

(1)重点掌握内容

  • 格式XCHG OPR1,OPR2
  • 执行的操作(OPR1) ←→ (OPR2)
  • 标志位:不影响

功能:将OPR1OPR2 中的内容进行互换

注意

  • 不允许使用段寄存器
  • 可以用除立即数以外的所有寻址方式
  • 两个操作数必须有一个在寄存器中

(2)应用实例

【例】DS=3000H,BX=2000H,SI=0002H,AX=1234H,(32000H)=99H,(32001H)=88H,(32002H)=77H,(32003H)=66H,(32004H)=55H,(32005H)=44H …

程序如下:

XCHG AX,[BX]
XCHG DX,[BX+SI]

求执行上面程序后的结果(思路和堆栈指令例题相似)

二、累加器(AX)专用传送指令

只限使用AX或AD

(一)输入指令 IN(I/O → CPU)

(1)重点掌握内容

  • 长格式:直接在指令中指定端口号(0~FFH)

    IN AL, PORT (字节)
    IN AX, PORT (字)

    执行的操作
    (AL) ← (PORT) (字节)
    (AX) ← (PORT+1,PORT) (字)

  • 短格式:须先把端口号放在DX寄存器中(0000~FFFFH)

    IN AL, DX (字节)
    IN AX, DX (字)

    执行的操作
    (AL) ← ((DX)) (字节)
    (AX) ← ((DX)+1,(DX)) (字)

  • 标志位:不影响

(2)应用实例

【例1】

IN AX,28H
MOV DATA_WORD,AX
;把端口28的内容经过AX送到内存单元中

【例2】

MOV DX,3FCH
IN EAX,DX
;从端口送一个双字到EAX中

(二)输出指令 OUT(CPU → I/O)

(1)重点掌握内容

  • 长格式:直接在指令中指定端口号(0~FFH)

    OUT PORT,AL(字节)
    OUT PORT,AX (字)

    执行的操作
    (PORT) ← (AL) (字节)
    (PORT+1,PORT) ← (AX) (字)

  • 短格式:须先把端口号放在DX寄存器中(0000~FFFFH)

    OUT DX,AL (字节)
    OUT DX,AX (字)

    执行的操作
    (AL) ← ((DX)) (字节)
    (AX) ← ((DX)+1,(DX)) (字)

  • 标志位:不影响

(2)应用实例

【例】

OUT 5,AL
;把 AL 中的内容送到端口5

(三)换码指令 XLAT(了解)

(1)重点掌握内容

  • 格式XLATXLAT OPR(首地址)
  • 执行的操作(AL) ← ((BX)+(AL))
  • 标志位:不影响

功能:将AL与BX寄存器内容之和作为偏移地,将其所对应的存储单元的内容送入AL寄存器中

注意

  • 执行前:在内存建立一个字节表格(长度不超过256),内含要转换成的目的代码
    BX——存放表格首地址
    AL——存放相对表格首地址的偏移量
  • 执行后:将AL寄存器的内容转换为目标代码

(2)应用实例

【例】 (BX) = 0400H,(DS) = F000H

在这里插入图片描述

程序执行后 (AL) = 33H

三、地址传送指令

(一)有效地址EA送寄存器指令 LEA

(1)重点掌握内容

  • 格式LEA REG,SRC
  • 执行的操作(REG) ← SRC
  • 标志位:不影响

功能:该指令把存储单元内容的有效地址送到指定的寄存器中(用一个寄存器作内存单元的地址指针)

注意

  • REG不能是段寄存器
  • SRC 必须为存储器寻址方式(即不能使用立即数和寄存器寻址方式)

(2)MOV 和 LEA 的区别

LEA 指令可以用来将一个内存地址直接赋给目的操作数,例如:

LEA EAX,[EBX+8] 就是将 EBX+8 这个直接赋给 EAX

而 MOV 指令 MOV EAX,[EBX+8] 则是把内存地址为 EBX+8 处的数据赋给 EAX

【摘自:汇编语言中mov和lea的区别有哪些? 】

注意MOV EAX,EBX+8 看起来和 LEA EAX,[EBX+8] 作用相同,但是MOV 指令不支持这样的格式 【摘自:lea和mov指令的区别】

(二)指针传送指令 LDS & LES

(1)重点掌握内容

  • 格式

    LDS REG,SRC

    LES REG,SRC

  • 执行的操作

    (REG) ← (SRC) (DS)←(SRC+2) 相继二字 → 寄存器、DS

    (REG) ← (SRC) (ES)←(SRC+2) 相继二字 → 寄存器、ES

  • 标志位:不影响

注意

  • REG不能是段寄存器
  • SRC 必须为存储器寻址方式(即不能使用立即数和寄存器寻址方式)

(2)LEA & LDS & LES 综合应用实例

在这里插入图片描述

四、标志传送指令

在这里插入图片描述

(一)标志送AH指令 LAHF

(1)重点掌握内容

  • 格式LAHF
  • 执行的操作(AH) ← (Flag/PSW的低位字节)
  • 标志位:不影响

在这里插入图片描述

(二)AH送标志寄存器指令 SAHF

(1)重点掌握内容

  • 格式SAHF
  • 执行的操作(Flag/PSW的低位字节) ← (AH)
  • 标志位:影响

在这里插入图片描述

(三*)标志进栈指令 PUSHF

(1)重点掌握内容

  • 格式PUSHF
  • 执行的操作
    (SP) ← (SP)-2
    ((SP)+1,(SP)) ← (FLAGS)
  • 标志位:不影响

功能:保护标志

(四*)标志出栈指令 POPF

(1)重点掌握内容

  • 格式POPF
  • 执行的操作
    (FLAGS) ← ((SP)+1,(SP))
    (SP) ← (SP)+2
  • 标志位:影响

功能:恢复标志

五、类型转换指令

(一)字节扩展到双字 CBW

(1)重点掌握内容

  • 格式CBW
  • 执行的操作
    若(AL)的最高有效位为 0,则 (AH) = 00H
    若(AL)的最高有效位为 1,则 (AH) = FFH
  • 标志位:不影响

(二)字扩展到双字 CWD

(1)重点掌握内容

  • 格式CWD
  • 执行的操作
    若(AX)的最高有效位为 0,则 (DX) = 0000H
    若(AX)的最高有效位为 1,则 (DX) = FFFFH
  • 标志位:不影响

这篇 【汇编语言】cbw和cwd 博客讲解了具体方法


参考文章

数据传送指令

8086CPU指令系统——数据传送类指令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端框架-echarts

Echarts 项目中要使用到echarts框架&#xff0c;从零开始在csdn上记笔记。 这是一个基础的代码&#xff0c;小白入门看一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

刷题之找到字符串所有字母异位词

找到字符串所有字母异位词 滑动窗口。滑动窗口大小为待比较数组的大小。 class Solution { public:vector<int> findAnagrams(string s, string p) {//滑动窗口vector<int>result;if(s.size()<p.size())return result;vector<int>pnum(26,0);//记录p的字…

链表----带环链表快慢指针进阶版

1.带环链表及其拓展 &#xff08;1&#xff09;这个题目组要就是进行判断这个链表是否带环&#xff0c;使用的是布尔类型作为返回值&#xff1b; &#xff08;2&#xff09;我们这里的思路是使用的快慢指针&#xff0c;快指针一次走2步&#xff0c;慢指针一次走1步&#xff0c…

iOS Xcode 升级Xcode15报错: SDK does not contain ‘libarclite

一 iOS Xcode 升级Xcode15报错: SDK does not contain libarclite 1.1 报错信息 SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/ lib/arc/libarclite_iphonesimulator.a; try increasin…

Sass(Syntactically Awesome Stylesheets)是一种强大的CSS预处理器

Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种强大的CSS预处理器&#xff0c;它旨在简化CSS的编写&#xff0c;并增强其功能。它让开发者能够使用变量、嵌套规则、混入&#xff08;mixins&#xff09;、继承等高级功能&#xff0c;从而编写更加结构化和…

Linux基础知识面试题

1. 请描述Linux操作系统的安装过程&#xff0c;并说明其中的关键步骤。 Linux操作系统的安装过程通常涉及以下几个关键步骤&#xff1a; 准备安装介质&#xff1a;需要从官网或者其他可靠来源下载Linux发行版的ISO镜像文件&#xff0c;并制作一个启动U盘或者烧录到DVD中。现在…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (九)

LlaMA 3 系列博客 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四) 基于 LlaMA…

Java面向对象——多态

即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多&#xff08;父类&#xff0c;有关系的类&#xff09;。 多态存在的条件&#xff1a; 1. 有继承关系&#xff1b; 2. 子类重写父类…

linux 卸载Nginx

在Linux中卸载Nginx&#xff0c;通常涉及几个关键步骤&#xff0c;包括停止Nginx服务、卸载依赖库、删除文件和清理安装包。具体的命令可能因Linux发行版的不同而略有差异。以下是一个通用的卸载流程&#xff1a; 1、停止Nginx服务 在卸载Nginx之前&#xff0c;需要先停止Ngi…

思维导图软件哪个好?5个软件教你自己快速制作思维导图

思维导图软件哪个好&#xff1f;5个软件教你自己快速制作思维导图 思维导图软件在现代生活和工作中扮演着重要的角色&#xff0c;它们可以帮助人们整理思维、规划项目、记录笔记等。以下是五款值得推荐的思维导图软件&#xff0c;它们各有特色&#xff0c;可以帮助您快速制作思…

嵌入式Linux:编译和使用Protobuf库

目录 1、开发环境和工具 2、安装和编译Protobuf、Protobuf-C库 3、编写和编译proto文件 4、修改makefile文件 5、测试示例 6、参考资料 Protobuf&#xff08;Protocol Buffers&#xff09;是由 Google 开发的一种轻量级、高效的结构化数据序列化方式&#xff0c;用于在不同应用…

Java红黑树详解及示例

红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;它确保了在最坏情况下基本操作&#xff08;比如插入、删除、查找&#xff09;都能在O(log n)时间内完成。红黑树的关键在于它在每个节点上存储了…

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括&#xff1a; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理&#xff08;DPPM&#xff09; 前篇内容&#xff1a;①电池管理IC&#xff08;Charger&#xff09;了解一下&…

python中几种推导式简单样例

目录 一、python中几种推导式 1.1 列表推导式&#xff1a; 1.2 字典推导式 1.3 生成器表达式&#xff1a; 1.4 条件表达式&#xff1a; 二、简化对多个列表的并行迭代函数&#xff1a; 一、python中几种推导式 1.1 列表推导式&#xff1a; 使用列表推导式可以简化对列表…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程&#xff08;只是一种习惯&#xff0c;而不是强制&#xff09;中&#xff0c;变量的命名方式一般采用驼峰式命名。比如userName&#xff0c;userImage。但是在数据库中一般不会采用驼峰式&#xff…

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下&#xff0c;ChatGPT、Sora、Gemini、文言一心 等新技…

js sleep 实现方式

在JavaScript中&#xff0c;由于其单线程和事件驱动的特性&#xff0c;没有直接的sleep函数&#xff0c;但你可以通过一些方法模拟出类似的效果。最常见的方式是使用setTimeout或者setInterval&#xff0c;以及更现代的Promise和async/await语法来实现异步等待。下面是几种实现…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏&#xff0c;先jadx分析一波 没有什么关键信息&#xff0c;但找到了一个unity类&#xff0c;想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息&#xff0c;看wp&#xff1a; Asse…

知识付费系统开源方案,教育机构如何利用朋友圈做转介绍?

招生成本高&#xff0c;效果差让许多教育机构头疼不已。对于教育机构来说通过转介绍招生是一个非常有效的途径&#xff0c;那么教育机构如何利用朋友圈做转介绍呢?今天小编就来和大家分享一下。 利用朋友圈做转介绍&#xff0c;主要是通过做活动&#xff0c;来完成增加粉丝、扩…

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写&#xff0c;程序结构基本上都是这样的&#xff1a; // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…