汇编语言程序设计-1-绪论

news2024/11/19 20:40:03

1. 绪论

文章目录

  • 1. 绪论
    • 1.1 导学
    • 1.2 为什么要学汇编语言
    • 1.3 由机器语言到汇编语言
    • 1.4 计算机的组成
    • 1.5 内存的读写与地址空间
    • 1.6 汇编语言实践环境搭建

  • 参考视频:烟台大学贺利坚老师的网课《汇编语言程序设计系列专题》,或者是B站《汇编语言程序设计 贺利坚主讲》,大家一起看比较热闹。
  • 中文教材:《汇编语言-第3版-王爽》(课程使用)、《汇编语言-第4版-王爽》(最新版)。
  • 老师的博客:《迂者-贺利坚的专栏-汇编语言》

本篇笔记对应课程第一章(下图倾斜),章节划分和教材对应关系如下。


1.1 导学

课程总共分为7个章节:

  1. 绪论:简单介绍汇编程序基本概念,并配置汇编环境。
  2. 访问寄存器和内存:介绍汇编基础机制。
  3. 汇编语言程序:介绍汇编语言程序的结构。
  4. 内存寻址方式:编写程序时需要频繁的与访问内存,介绍汇编语言提供的非常多的寻址方式。
  5. 流程转移与子程序:程序执行过程中会有流程上的转移,也就是程序的模块化设计。
  6. 中断及其应用:在解决实际问题时,汇编程序需要频繁用到中断,包括内中断、外中断。
  7. 高级汇编语言技术:补充教材中没有的“宏汇编”相关知识。

学习过程中建议先看教材对应章节,再看视频,最后完成教材中的检测点、实验。

1.2 为什么要学汇编语言

图1-1 程序设计语言发展概况

  只有机器语言可以直接在计算机上运行,而 “汇编语言(Assembly Language)”就是使用简单的助记符来表示“机器语言”。所有的高级语言都是在“汇编语言”之后产生的,是所有程序设计语言的鼻祖(如上图)。虽然汇编语言是一门古老的语言,但是其在某些领域是不可替代的,所以即使在2024年,汇编语言在“TIOBE排行榜”仍然位列第12、“TIOBE指数”整体也是上升趋势,并且随着嵌入式、物联网的普及而经常使用。汇编语言之所以仍在发挥不可替代的作用,主要是因为以下两点:

  1. 效率:汇编语言常用于开发软件的核心部件,可以被快速执行和实时响应,运行效率高。进行底层驱动开发时,汇编语言的开发效率很高,但开发高级功能的效率非常低。
  2. 底层:最底层的程序设计只能使用汇编语言,如计算机及外围设备的驱动程序、操作系统的内核、物联网设备等。

而我们通过学习汇编语言,则可以直击计算机系统的核心。不仅可以感知、体会和理解机器的逻辑功能,学会底层的程序调试和错误分析方法,还能够加深对计算机原理和操作系统等课程的理解。简单来说,学习汇编语言 向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础

  本课程《汇编语言程序设计》目的在于,理解硬件结构,掌握指令集,理解程序的运行过程。内容上以较为古老的 8088、8086 指令集 为模板,介绍汇编语言程序设计。不直接学习现代处理器(如80x86),是因为现在的计算机系统非常复杂,直接学习会非常混乱,不利于掌握基础知识,本课程结束后,还有兴趣的同学可以继续延伸学习 Intel 80x86汇编、Linux 汇编、ARM 汇编 等。
本课程采用 贯穿实践的方法 讲解知识,并会详细介绍对debug工具的使用帮助同学们观察机器的内部状态。希望同学们结合教材和视频学习知识点后,一定要完成教材上对应的“检测点”、“实验”(如下图)。另外,老师也会设计一些实践性的内容,公布到老师的博客里。实践出真知

图1-2 课程的学习方法

1.3 由机器语言到汇编语言

图1-3 将电平脉冲转换成打孔纸带 —— 1打孔、0不打孔

  “机器指令”是一台机器可以正确执行的命令,由一串二进制数表示(比如01010000),一条或几条“机器指令”就构成一条“机器语言”。早期程序员们需要将 0/1 数字编程的程序代码直接打在纸带或卡片上,再通过纸带机或卡片机输入计算机,来完成程序的运行。显然,这样的机器语言程序很难debug。为了解决“机器指令”难以记忆和debug的问题,人们很容易就想到使用一些特定意义的单次表示特定的指令,于是就诞生的“汇编指令”。“汇编指令”是机器指令便于记忆的书写格式,汇编指令是机器指令的助记符。如下:

【例】使用 8086CPU 完成运算 S = 768 + 12288 - 1280,机器码如下:

101100000000000000000011
000001010000000000110000
001011010000000000000101

【例】对于操作——“将寄存器BX的内容送到AX中”,比较机器指令和汇编指令。
机器指令:1000100111011000
汇编指令:MOV AX, BX

图1-4 计算机的逻辑结构

  汇编语言是直接针对机器进行编程的,比如上面的例子中就是对于寄存器的移动。计算机的各个主要部件都有自己的寄存器,下图给出了计算机的物理实物,在编写汇编程序时我们 无需关心这些器件的电气特性,只需要知晓“逻辑结构”即可,比如CPU寄存器、总线结构等(如上图)。后面我们还会详细介绍各个部件内部的寄存器。用汇编语言编写程序的工作过程如下:

  1. 编写程序:汇编程序包括汇编指令、伪指令、其他符号,如下图。其中,“伪指令”并不是由计算机直接执行的指令,而是帮助编译器完成“编译”的符号。
  2. 编译:将汇编程序转换成机器码。
  3. 计算机执行。
图1-5 汇编语言程序示例

1.4 计算机的组成

计算机组成

图1-6 计算机主板

  首先将这个计算机由表到内的简单介绍一下计算机组成。上图给出了计算机主板的示意图。主板上几个非常重要的部件:

  • CPU:中央处理器。
  • 总线:运行过程中传输数据、指令,也就是主板上的PCB排线和接口。
  • 内存(条):工作过程中保存数据。
  • 扩展槽:主要用于链连接外部设备,如打印机、显示器等。

上一小节提到,我们只需关心计算机的逻辑结构即可,实际上我们只关心 “CPU”如何和“内存储器”进行交互。因为没有内存,再强大的CPU也无法工作,所以我们要了解这个交互过程。下左图给出的CPU内部结构后续章节会详细介绍;下右图则主要给出了各主要部件的存储结构

图1-7 计算机主板的逻辑组成
  • 【CPU】CPU 是计算机的核心部件,它控制整个计算机的运作并进行运算。要想让一个CPU工作,就必须向它提供指令和数据。
  • 【RAM】随机存储器,能读能写,掉电易失,存储计算机运行过程中动态变化的数据。上图中包括“RAM(主存储器)”(直接焊在主板上)、“RAM(主存储器)”(内存条)、“RAM(显存)”(显卡)。
  • 【ROM】只读存储器,只能读不能写,存储无需改变的数据,如计算机启动时需要用到的数据。上图中包括“ROM(装有系统BIOS)”(直接焊在主板上)、“RAM(装有显卡BIOS)”(显卡)、“ROM(装有网卡BIOS)”(网卡)。

指令和数据的表示

  计算机中的数据和指令,都是以二进制的形式存储在内存或磁盘上。平常用不到的信息或较大的文件都是存储在“机械硬盘”、“固态硬盘”中,而计算机运行的中间数据则是存储在“内存条”中。那对于如何区分数据和指令呢?主要是看CPU如何使用,比如对于相同的二进制数,其作为“数据”、“指令”的含义是不一样的。下面给出一个例子,并介绍不同进制的表示:

  • 数据:1000100111011000─> 89D8H
  • 指令:1000100111011000─> MOV AX,BX

数据表示:使用后缀区分进制,单位常用“字节(Byte)”——B、KB、MB、GB、TB等。

二进制:1000100111011000B
八进制:104730O,汇编语言几乎不用。
十进制:35288D,有时不写后缀默认十进制。
十六进制:89D8H,汇编语言中使用最多。

计算机中的存储单元

  那数据或者指令是如何保存在内存之中呢?很简单,存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号。如下图所示,该存储器有128个存储单元,编号从0~127,如下左图所示。但实际上内存空间很“大”,比如8086有20根地址线,寻址空间为 220= 1MB,使用十六进制表示,如下右图所示:

图1-8 存储器的存储单元划分

计算机中的总线

  上段中提到了“地址线”的概念,其是“总线”的一种。“总线(Bus)”就是在计算机中专门连接CPU和其他芯片的导线,物理上是多根导线的集合,在逻辑上主要分为以下三种:

图1-9 计算机中的总线
  • 地址总线:CPU是通过地址总线来指定存储单元的。地址总线宽度,决定了可寻址的存储单元大小,比如位宽为 N 的地址总线对应的可寻址空间为 2N
  • 数据总线:CPU与内存或其它器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度,也就是一次性能传输多少数据。例:向内存中写入数据89D8H时的数据传送。
  • 控制总线:CPU通过控制总线对外部器件进行控制。控制总线是一些不同控制线的集合,控制总线宽度决定了CPU对外部器件的控制能力。

显然,数据总线宽度越大,单次传输的数据越多,相同的时钟周期也就能传输更多数据,CPU性能越高,如下表:

表1-1 x86CPU性能一览
CPU地址总线宽度寻址能力数据总线宽度一次传送数据读取1KB数据所需次数
808016640KB81B1024
8088201MB81B1024
8086201MB162B512
802862416MB162B512
80386324GB324B256

1.5 内存的读写与地址空间

CPU对存储器的读写

  汇编语言是直接和内存打交道的,所以了解内存的读写过程和地址空间非常重要。CPU要想进行数据的读写,必须和外部器件进行三类信息的交互——地址信息(存储单元的地址)、控制信息(器件的选择、读或写命令)、数据信息(读或写的数据)。比如下面给出汇编指令 MOV AL,[3]的操作过程,其含义是从3号单元读取数据送入寄存器 AL,读写过程如下:

图1-10 CPU从内存中3号单元处读取数据的过程
注:视频中2:05\~是动态演示
  1. 发送地址:CPU通过地址线将“地址信息”发送给内存。
  2. 发送命令:CPU通过“控制线”发出读命令。
  3. 读取数据:内存接收到地址信息和读命令之后,将相应单元的数据通过“数据线”发送给CPU。

内存地址空间

  那内存是如何根据地址找到数据的呢?就需要涉及到“内存地址空间”的概念,也就是在“1.4节-计算机的组成”中提到的“存储单元划分”。从CPU角度来说,可以将各类存储器看作一个逻辑存储器,也就是 统一编址,优势是无需区分各个设备,便于统一管理。比如 8086CPU 的地址总线宽度为20,那么可以寻址1MB个内存单元,其内存地址空间为1MB。

于是按照“1.4节-计算机的组成”中提到的“计算机主板的逻辑组成”,我们就可以将所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器;看成一个整体。每个物理存储器在这个逻辑存储器中占有一个“地址段”,即一段地址空间;CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。如下图所示:

图1-11 统一编制示意图、8086地址空间
  • 主存储器地址空间:占用空间较大,包括主板上直接焊接的RAM、内存条。
  • 显存地址空间:主要是显卡的RAM。
  • 各类ROM地址空间:ROM通常相对较小,所以可以直接放在一起。

1.6 汇编语言实践环境搭建

  再次强调一下,本课程选择 8086 作为教学模型。这是因为 8086 虽然“高龄”,但其引脚数量、指令系统、寻址方式等都比较丰富,且又不像 Intel Pentium 系列处理器那么复杂。学习 8086 便于初学者快速掌握理解计算机底层工作原理,并且也可以作为未来继续学习 80x86汇编、Linux汇编、ARM汇编 的基础。

本课程会搭配一系列实践教程进行学习,DOS系统(桌面操作系统)很经典,要配置 DOS环境 主要有以下三种方式:

  1. 物理机:由于系统太古老了,现在很难找到能实际运行的物理机。
  2. 虚拟机:DOS虚拟机配置环境太麻烦,很可能消减学习欲望。
  3. 模拟程序:直接使用免费的“DOS模拟器”,可以安装在任意常见的操作系统上,其官网如下图所示。
  • 官网下载安装包:如下图,后续要注册。
  • 老师提供安装包:“8086汇编语言工作环境”,或者直接看我的百度网盘“8086汇编工作环境.zip(1.76MB)”。
图?DOSbox官网

最后介绍 DOS Box 的安装步骤:

安装步骤:教学视频-6汇编语言环境搭建—4:40~最后

  1. 拷贝命令文件:将整个 MASM 拷贝到已知路径(建议路径尽量简单),作为工作目录。内容介绍如下图。

  2. 安装DOSBox:直接运行安装文件。

  3. 启动DOSBox并挂接工作目录:安装完成后会在桌面看到DOSBox图标,双击即可运行。可以发现 DOSBox 的当前目录默认在Z盘,需要将刚才的 MASM 文件夹作为DOS系统的C盘挂载上来,然后将DOS系统的C盘作为工作目录,如下命令。注意这个C盘不是本机的C盘,而是对应的MASM文件夹。

mount c d:\masm
c:
dir

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

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

相关文章

MybatisPlus实现数据权限隔离

引言 Mybatis Plus对Mybatis做了无侵入的增强,非常的好用,今天就给大家介绍它的其中一个实用功能:数据权限插件。 数据权限插件的应用场景和多租户的动态拦截拼接SQL一样。建议点赞收藏关注,方便以后复习查阅。 依赖 首先导入M…

c/c++普通for循环学习

学习一下 for 循环的几种不同方式,了解一下原理及差异 完整的测试代码参考 GitHub :for 循环测试代码 1 常用形态 对于 for 循环来说,最常用的形态如下 for (表达式1; 表达式2; 表达式3) {// code }流程图如下: 编写测试代码…

【随笔】Git 高级篇 -- 项目里程碑 git tag(二十)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

12 Php学习:魔术常量

PHP魔术常量 PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。 有八个魔术常量它们的值随着它们在代码中的位置改…

Java——类和对象

目录 一.类定义和使用 1.简单认识类 2.类的定义格式 3.注意事项 二.课堂练习 1.定义一个狗类 2.定义一个学生类 3.注意事项: 三.类的实例化 1.什么是实例化 2.注意事项 3.类和对象的说明 四.this引用 1.为什么要有this引用 2.什么是this引用 五.对…

MySQL进阶二

目录 1.使用环境 2.排序窗口函数 3.聚合窗口函数 1.使用环境 数据库:MySQL 8.0.30 客户端:Navicat 15.0.12 接续MySQL进阶一: MySQL进阶一-CSDN博客文章浏览阅读452次,点赞9次,收藏4次。MySQL进阶操作一。https…

ThignsBoard通过服务端订阅共享属性

MQTT基础 客户端 MQTT连接 通过服务端订阅属性 案例 1、首先需要创建整个设备的信息,并复制访问令牌 ​​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、在MQTT上订阅对应的Topic 5、在客户端添加共享属性信息 6、查看整个设备的遥测数据 M…

Qt 窗⼝

Qt 窗⼝ 菜单栏创建菜单栏在菜单栏中添加菜单创建菜单项在菜单项之间添加分割线综合⽰例 ⼯具栏创建⼯具栏设置停靠位置设置浮动属性设置移动属性综合⽰例状态栏状态栏的创建在状态栏中显⽰实时消息在状态栏中显⽰永久消息 浮动窗⼝浮动窗⼝的创建设置停靠的位置 对话框对话框介…

Spring声明式事务控制

文章目录 1.编程式事务控制相关对象(了解即可)1.1PlarformTransactionManager1.2 TransactionDefinition 2.基于XML的声明式事务控制2.1声明式事务控制的实现 3.基于注解的声明式事务控制 1.编程式事务控制相关对象(了解即可) 1.1PlarformTransactionManager PlatformTransac…

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2):主流大模型…

LLM应用开发框架LangChain

1、LangChain简介 1.1、LangChain发展史 LangChain 的作者是 Harrison Chase,最初是于 2022 年 10 月开源的一个项目,在 GitHub 上获得大量关注之后迅速转变为一家初创公司。2017 年 Harrison Chase 还在哈佛上大学,如今已是硅谷的一家热门…

314_C++_QT表格的撤销、恢复,可对多行、多item进行撤销、恢复操作

行–删除后的,撤销、恢复图示: 原图示 删除后 撤销操作 恢复操作 item修改后的撤销、恢复 原item 撤销修改 恢复修改 代码: --</

vue快速入门(二十四)输入停顿再进行响应

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用侦听器监视数据变化情况使用clearTimeout与定时器实现停顿一段时间再操作内容 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"view…

Chatgpt掘金之旅—有爱AI商业实战篇|播客剧本写作|(十三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业播客剧本写作服务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。…

代码随想录算法训练营第三十九天|62.不同路径、63.不同路径II

代码随想录算法训练营第三十九天|62.不同路径、63.不同路径II 62.不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

nginx反向代理conf

打开nginx配置。 对登录功能测试完毕后&#xff0c;接下来&#xff0c;我们思考一个问题&#xff1a;前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f; 前端请求地址&#xff1a;http://localhost/api/employee/login 后端接口地址&#xff1a;http://localho…

[leetcode]maximum-width-of-binary-tree

. - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉…

使用python编写网页自动答题-仿真考试

自动化实践经验分享 监听数据包地址&#xff1a;通过监听数据包地址&#xff0c;可以获得实时的答案信息&#xff0c;确保答题的准确性和实效性。提取答案内容&#xff1a;使用正则表达式和json模块&#xff0c;可以快速提取和处理答案信息。答题操作&#xff1a;根据答案内容…

前端三剑客 —— JavaScript (第八节)

目录 内容回顾&#xff1a; 事件对象 事件对象 事件对象的方法和属性 案例-移动DIV 案例-图片轮换 Ajax 内容回顾&#xff1a; 事件对象 1.1 什么是事件驱动 1.2 事件绑定 事件源&#xff1a;发生事件的源对象 事件对象&#xff1a;它包含了事件所有的信息&#xff0c;它…

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程&#xff0c;就是利用 JSON.stringify 将js对象序列化&#xff08;JSON字符串&#xff09;&#xff0c;再使用JSON.parse来反序列化&#xff08;还原&#xff09;js对象&#xff1b;序列化的作用是存储和传输。&#xff08…