当前位置: 首页 > article >正文

【汇编语言】寄存器(CPU工作原理)(二)—— 汇编指令的基础操作

在这里插入图片描述

文章目录

  • 前言
  • 正文——(一气呵成解决本文内容)
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

文章主要内容:几条基础的汇编指令的讲解,例如 MOVADD 等常用指令。

正文——(一气呵成解决本文内容)

通过汇编指令控制 CPU 进行工作,看一下下表中的几条指令。

在这里插入图片描述

注意:

在这里插入图片描述

如:mov ax,18和MOV AX,18的含义相同;bx和BX的含义相同:




接下来看一下CPU执行下表中的程序段的每条指令后,对寄存器中的数据进行的改变。

示例1

在这里插入图片描述

指令执行后 AX 中的数据为多少?思考后看下列分析。

分析
程序段中的最后一条指令 add ax,bx,在执行前 ax和bx中的数据都为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,ax中的数据为:044CH。

示例2

在这里插入图片描述

指令执行后 AX中的数据为多少?思考后看下列分析。

分析
程序段中的最后一条指令 add al,93H,在执行前,al中的数据为C5H,相加后所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。(这里的丢失,指的是进位值不能在8位寄存器中保存,但是CPU并不真的丢弃这个进位值,关于这个问题,我们将在之后的内容中讨论。)

📌注意

此时al是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行这条指令时认为 ah 和a是两个不相关的寄存器。不要错误地认为,诸如 add al,93H 的指令产生的进位会存储在 ah中,add al,93H进行的是8位运算。

如果执行 add ax,93H,低8位的进位会存储在ah中,CPU 在执行这条指令时认为只有一个16位寄存器ax,进行的是16位运算。指令 add ax,93H执行后,ax 中的值为:0158H。此时,使用的寄存器是16位寄存器ax,add ax,93H相当于将ax中的16位数据00c5H和另一个16位数据0093H相加,结果是16位的0158H。




在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

在这里插入图片描述

等都是正确的指令,而:

在这里插入图片描述

等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述


http://www.kler.cn/news/334983.html

相关文章:

  • JavaScript中的数组不改变原数组的方法
  • 论文翻译 | Language Models are Few-Shot Learners 语言模型是少样本学习者(中)
  • DNABERT: 一个基于 Transformer 双向编码器表征的预训练 DNA 语言模型
  • MySql数据引擎InnoDB引起的锁问题
  • 通信工程学习:什么是DQDB分布式队列双总线
  • Java体系中的异常
  • 新机配置Win11
  • Leetcode—139. 单词拆分【中等】
  • Qt源码阅读——事件循环
  • MQTTnet.Extensions.ManagedClient客户端连接
  • 【数据结构】双向链表(Doubly Linked List)
  • Spring Boot ⽇志
  • Stable Diffusion 常用大模型及其特点
  • 数据结构之树(3)
  • 简单认识 redis -3 -其他命令
  • HDU Sit sit sit (区间DP+组合数)
  • 打造自己的RAG解析大模型:Windows部署OCR服务(可商业应用)
  • springboot网上商城源码分享
  • Chromium 中JavaScript Console API接口c++代码实现
  • Goland 设置GOROOT报错 The selected directory is not a valid home for Go SDK