收藏夹吃灰版!汇编语言快速入门(非常详细)

C语言与CPP编程 2024-06-07 09:01


Part1内容的定义

1.1 数据段的定义

汇编语言程序以段为单位进行书写,一般把数据定义在数据段里,程序写在代码段中。下面给出段的定义语法:

段名  SEGMENT
...(段的内容)...
段名 ENDS

注意事项:

  1. 汇编语言不区分字母的大小写

  2. 汇编语言中一行只能有一条语句

  3. 段的名字用字母或下划线开头,需要做到含义清晰且不能与保留字重名

  4. 汇编语言中用英文分号后的内容表示程序注释

  5. 不能在一个段的内部定义另一个段,也就是各个段之间相互独立

1.2 数据的定义

数据的定义是指对给出的数据分配存储单元,并将它们以标准的格式存放到数据段中。数据定义的语句元素包括DB DW DD DQ DT等。

1.2.1 定义字节数据DB

给出下面的汇编程序段

DATA  SEGMENT
X DB -1,255,'A',3+2,?
DB "ABC",0FFH,11001010B
Y DB 3 DUP(?)
DATA ENDS

下面对上面的代码段进行解释:

  1. 变量的定义X和Y称为变量名,表示程序员定义了两个变量X和Y。与高级语言不同,汇编语言中的变量实际上是后面第一个数据的地址,变量名代表了后面的若干个数据

  2. 字节数据的定义DB表示定义的数据类型都是字节类型。DB可以用于定义整数(包括正数和负数,可以使用十进制、十六进制或二进制)以及字符

  3. 求值表达式定义数据时可以出现简单的求值表达式的结果。如上方的DB 3+2相当于 DB 5

  4. 未知值的定义用问号表示一个暂时还不确定的值,一般先用0进行这个单元的填充

  5. 多个字符的定义可以出现用双引号括起来的多个字符,这些字符将分开并按照顺序进行存储;

  6. 重复定义相同数据DUP表示重复定义多个相同的数据。语法如下

  7. 隔行定义如果数据太多一行写不下,则可以另起一行继续定义。不需要重新写变量名,但是需要重新写DB伪指令

1.2.2 定义字数据DW

字数据的位数为16位,只需要将上面字节定义的语法中的DB修改为DW即可。

1.2.3 定义双字数据DD

双字数据为32字节,只需要将上面字节定义的语法中的DB修改为DD即可。需要注意的是,数据的高位存放在地址较大的单元里,数据的低位存放在地址较小的单元里。

1.2.4 定义八字节和十字节数据DQ DT

只需要将DB伪指令修改为DQ和DT即可。

Part2数据的传送

2.1 指令语句的格式

指令语句是指与一条机器指令相对应的代码语句,其一般格式如下:

[标号:]  操作码 [操作数] [;注释]

语法解释:

  1. 标号是指程序员为这一条指令语句所起的名字。大多数指令语句都不需要标号,只有一些特殊的指令语句需要用到

  2. 操作码指定本条指令的操作类型,所有的操作码都是保留字

  3. 操作数可以是0-3个,有多个操作数时彼此之间用逗号分隔。右边的操作数为源操作数,最左边的操作数为目的操作数


2.2 操作数的分类

操作数可以分为寄存器操作数、立即数操作数和存储器操作数三类。关于寄存器操作数,需要注意的是寄存器IP和FLAGS不能作为操作数出现在指令中;关于立即数操作数,需要注意的是立即数操作数不能用作目的操作数。下面着重介绍存储器操作数,先介绍两点基础知识:

  1. 存储器操作数表示对一个存储器单元进行访问,需要给出这个存储单元的段基址和偏移地址两部分才能进行

  2. 大多数情况下,指令将自动使用DS寄存器中的内容作为操作数的段基址,因此,编写汇编语言源程序时首先要做的事情就是把数据段的段基址放入DS寄存器

既然我们已经设置好了段基址,那么只需要有偏移地址即可找到内存中正确的存储单元。给出偏移地址的方法有直接和间接两种方法。直接法是指直接在指令中写出存储单元的偏移地址,间接法则是把存储单元的偏移地址事先装入一个寄存器中,需要时通过这个寄存器中的值来找到这个存储单元。

(1)直接法语法

MOV  目的寄存器,  变量名[+字节偏移量]

此语句的作用是以DS寄存器中的内容作为段基址,以数据段中指定变量名的偏移量(与字节偏移量)的和作为偏移地址,将指定存储单元中的值放入目的寄存器中。

(2)间接法语法:

MOV  间接寻址寄存器,  OFFSET 变量名
(下面是需要使用偏移地址时的语句)
MOV 目的寄存器, 间接寻址寄存器

语法解释:

  1. OFFSET是保留字,表示取出后面变量的偏移地址

  2. 间接寻址寄存器只能是BX BP SI DI中的一个如果没有另外说明,那么使用BX、SI和DI时自动以DS中的内容作为段基址,使用BP时自动使用SS的值作为段基址。

2.3 程序段的定义

程序段的一般格式如下:

CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
...(其他指令部分)...
MOV AX, 4C00H
INT 21H
CODE ENDS
END START

语法解读:

  1. 程序开始的两条指令都是用于装载数据段寄存器DS的进入程序后,代码段寄存器CS中的值已经由操作系统自动设置为代码段的段基址,数据段的段基址则需要程序员手动装入DS中

  2. ASSUME伪指令用于指定每一个数据段所对应的段基址寄存器如上面的代码中CODE段的段基址寄存器为CS,DATA段的段基址寄存器为DS

  3. INT 21H表示调用由操作系统提供的21H号服务程序服务的种类由AH中的功能号决定,本例中4CH表示返回操作系统的操作;AL中的代码称为返回代码,用返回代码00H表示正常返回

  4. END伪指令标志整个程序的结束END语句下面书写的任何代码都不会被汇编。END后的标号表示程序的入口地址,也就是汇编程序开始执行的地方。

2.4 基本传送指令

基本传送指令是使用最频繁的指令,需要熟练掌握。格式如下:

MOV  目的操作数, 源操作数

语法解释:

  1. 源操作数和目的操作数的类型必须相同如果不相同只有使用强制类型转换后才能进行传送。强制类型转换语法可以见下方

  2. 源操作数和目的操作数不能同时是存储器操作数,也不能同时是段寄存器

  3. 目的操作数不能是立即数

  4. 代码段基址寄存器CS不能作目的操作数

  5. 使用立即数作为源操作数时,立即数会按照目的操作数的类型进行扩展。

强制类型转换语法(要谨慎使用)

数据类型  PTR[变量名]

Part3堆栈

3.1 堆栈的定义

堆栈也是用户使用的存储器的一部分,用于存放临时性的数据和一些其他信息。堆栈段的定义语法如下:

堆栈名  SEGMENT  STACK
(堆栈内容)
堆栈名 ENDS

语法解释:

  1. 堆栈定义和一般段的定义的唯一区别在于使用了STACK

  2. 对于堆栈段,系统会在装入程序时自动把SSEG的段基址放入SS寄存器中,堆栈中的字节数自动置入SP寄存器中

  3. 堆栈段中的内容从较大的地址开始分配和使用

  4. 对于8086CPU,进出堆栈的只能是2字节的数据。

3.2 堆栈的使用方法

常用的堆栈相关指令包括PUSH POP PUSHF和POPF,语法如下:

PUSH 源操作数              ;将指定操作数入栈保护
POP 目的操作数 ;将栈顶操作数恢复到指定位置
PUSHF ;标志寄存器内容入栈保护
POPF ;标志寄存器出栈恢复

Part4常用操作数表达式

4.1 符号定义伪指令

符号定义相当于C语言中的#define编译预处理,用于进行符号的等价替换,符号定义的语法如下所示:

符号名   EQU   表达式

语法解释:

  1. 在进行汇编时,对EQU定义的符号名用对应的表达式进行等价替换

  2. 对用EQU定义的符号名不允许重复定义。

另一种进行符号定义的方式是使用“=”符号,具体语法如下:

符号名   =   常数表达式

语法解释:

使用等号定义符号时只能使用常量表达式。

4.2 取段基址

可以使用SEG来取地址表达式所在段的段基址,具体使用方法为:

SEG 地址表达式

Part5算术运算

5.1 加法指令

对于两个操作数相加应该使用ADD指令,指令语法如下:

ADD   目的操作数, 源操作数

语法解释:

  1. 该指令将目的操作数与源操作数相加,结果存放在目的操作数原先的存放位置

  2. ADD指令执行后会刷新CPU的状态标志位。

除此之外,还有一条INC指令实现操作数的自增,语法如下:

INC   操作数

语法解释:

  1. 增量执行执行后不影响CPU的状态标志位

  2. 增量指令常常用于修改计数器以及存储器指针的值。

5.2 减法指令

减法指令和加法指令的使用是对称的。加法中的ADD对应减法中的SUB;加法中的INC对应减法中的DEC。

5.3 乘法指令和除法指令

乘法指令为MUL,除法指令为DIV,使用方法和加减法类似。由于乘除法使用较少,因此不过多介绍。

Part6循环

循环指令的语法如下:

LOOP   标号

语法解释:

  1. 循环的次数由寄存器CX中的值决定。每一次循环后CX寄存器中的值会自减1,当CX=0时循环终止,因此CX也被称为计数器

  2. 装载寄存器CX的过程应该在循环开始之前完成

  3. 每一次循环成功则回到标号处的语句。

Part7逻辑运算

逻辑运算有AND OR XOR和NOT四种,使用语法如下:

逻辑运算操作码   目的操作数   源操作数

使用情况:

  1. AND指令主要用于对操作数的各位有选择地清零

  2. OR指令主要用于对操作数各位有选择地置一

  3. XOR指令主要用于对操作数各位有选择地取反

  4. NOT指令主要用于对操作数整体取反。

Part8中断调用

所有的DOS系统功能调用都是通过软中断指令INT 21H来实现的。INT 21H是一个具有90多个子功能的中断服务程序。INT 21H对每一个子功能都进行了编号,这个编程成为功能号。

DOS系统功能调用方法:

MOV 功能号   ;把功能号放入寄存器AH中
......
(在其他寄存器中放入该功能要求的入口参数)
......
INT 21H ;调用DOS系统功能

常用功能:

8.1 键盘输入单字符

功能号1,输入字符以ASCII码的形式存放在累加器AL中同时显示出来。

MOV AH 01
INT 21H

8.2 屏幕显示单字符

功能号2,屏幕显示存放在DL寄存器中的字符。

MOV AH 02
MOV DL 待显示字符
INT 21H

8.3 屏幕显示字符串

功能号9,用于在显示器上显示一个存放在寄存器DX中的字符串,被显示的字符串必须以’$'作为结束符。

MOV AH 09
MOV DX 待显示字符串首地址
INT 21H

8.4 返回DOS

一个程序执行完成后使得程序正常退出并返回DOS的功能,功能号为4CH。

MOV AH 4CH
INT 21H

Part9子程序的定义和调用

9.1 定义子程序

子程序名 PROC
...
RET ;表示子程序返回
子程序名 ENDP ;表示子程序段定义结束

9.2 调用子程序

CALL 子程序名

Part10对接口中的端口进行读写

MOV DX 端口地址
......
(其他寄存器初始化)
......
OUT DX 需要传输到端口的数据所在的寄存器

Part11空指令延时

使用NOP表示执行一条空指令,不进行任何操作。当指令之间需要有延时时,可以插入NOP指令。

NOP

Part12选择结构

12.1 CMP指令

CMP指令格式如下:

CMP 目的操作数,源操作数

语法解释:

  1. CMP用于比较两个同类型的操作数的大小;

  2. 指令执行的结果不会修改两个操作数,而是修改标志位;

  3. CMP指令常常与下列指令结合使用。

JGE 前>=后     Jump if  greater or equal
JG 前>后 Jump if greater
JLE 前<=后 Jump if less or equal
JL 前<后 Jump if less
JNE 前不等于后 Jump if not equal
JE 前等于后 Jump if equal
文章已获作者授权转载,版权归原作者所有,如有侵权,与本账号无关,可联系删除。https://blog.csdn.net/hanmo22357/article/details/127883179
EOF

你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索字节跳动电商以及携程等部门担任Linux C/C++后端研发工程师。

最近跟朋友一起开发了一个新的网站:编程资源网,已经收录了不少资源(附赠下载地址),如果屏幕前的靓仔/女想要学习编程找不到合适资源的话,不妨来我们的网站看看,欢迎扫码下方二维码白嫖~

同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。

我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。

欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会

加个微信,打开另一扇窗

C语言与CPP编程 C语言/C++开发,C语言/C++基础知识,C语言/C++学习路线,C语言/C++进阶,数据结构;算法;python;计算机基础等
评论
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 85浏览
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 163浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 73浏览
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 144浏览
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 55浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 84浏览
  • 汽车驾驶员监控系统又称DMS,是一种集中在车辆中的技术,用于实时跟踪和评估驾驶员状态及驾驶行为。随着汽车产业智能化转型,整合AI技术的DMS逐渐成为主流,AI模型通过大量数据进行持续训练,使得驾驶监控更加高效和精准。 驾驶员监测系统主要通过传感器、摄像头收集驾驶员的面部图像,定位头部姿势、人脸特征及行为特征,并通过各种异常驾驶行为检测模型运算来识别驾驶员的当前状态。如果出现任何异常驾驶行为(如疲劳,分心,抽烟,接打电话,无安全带等),将发出声音及视觉警报。此外,驾驶员的行为数据会被记录
    启扬ARM嵌入式 2024-12-20 09:14 98浏览
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 71浏览
  •         不卖关子先说感受,真本书真是相见恨晚啊。字面意思,见到太晚了,我刚毕业或者刚做电子行业就应该接触到这本书的。我自己跌跌撞撞那么多年走了多少弯路,掉过多少坑,都是血泪史啊,要是提前能看到这本书很多弯路很多坑都是可以避免的,可惜这本书是今年出的,羡慕现在的年轻人能有这么丰富完善的资料可以学习,想当年我纯靠百度和论坛搜索、求助啊,连个正经师傅都没有,从软件安装到一步一布操作纯靠自己瞎摸索,然后就是搜索各种教程视频,说出来都是泪啊。  &
    DrouSherry 2024-12-19 20:00 112浏览
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 80浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 98浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 118浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦