玩转汇编——基础


前言

汇编语言本质上仍是机器语言,是程序员接触计算机底层硬件的基础,其重要性不言而喻,跟随作者一起玩转汇编吧!
(本篇参考教材为钱晓捷的《汇编语言简明教程》以及燕山大学汇编语言教学PPT)


一、计算机系统概述

计算机系统包括硬件和软件两大部分——硬件和软件。
下图是对微型计算机的描述(简称微机)
在这里插入图片描述

1.计算机的硬件

源于冯诺依曼设计思想的计算机由5大部件组成:控制器、运算器、存储器、输入设备和输出设备。其中控制器是计算机核心。
现代计算机的演进,5大部件演变为3个硬件子系统:处理器、存储系统和输入输出系统。运算器和控制器被制作在一块大规模集成电路芯片上,称为处理器,也常被称为中央处理单元CPU。
在这里插入图片描述
汇编语言程序员将处理器、存储器和外部设备分别抽象为:寄存器、存储器地址和输入输出地址

2.计算机的软件

在这里插入图片描述

3.程序设计语言

在这里插入图片描述

语言类别特点优点缺点
机器语言“母语”/目标程序(二进制编码)机器语言程序是计算机唯一能够直接识别并执行的程序难以理解,极易出错,且难以发现错误
汇编语言符号语言/指令助记符易于记忆,本质上仍是机器语言,但增强了可读性繁琐难记,必须翻译(汇编)才能执行
高级语言比较接近人类自然语言与硬件无关,可移植性增强,普通用户也能编程都要通过编译程序翻译成机器语言才能执行

4.汇编语言和高级语言的对比

汇编语言高级语言
与处理器密切相关,可移植性较差与具体计算机无关,便于移植
功能有限、涉及硬件细节,编写繁琐困难功能强大,语法自然,容易掌握和应用
直接、有效地控制硬件,容易产生运行速度快、指令序列短小的高效率目标程序不易直接控制计算机的各种操作,编译程序产生的目标程序往往比较庞大

在编程时我们可以采用混合编程的策略,取长补短。

二、8086处理器(※)

1.8086的内部结构

处理器由多个功能部件组成,Intel公司按执行单元(EU)和总线接口单元(BIU)两个功能模块描绘了8086处理器的内部结构。
在这里插入图片描述

2.8086寄存器

寄存器的定义:处理器内部需要高速存储单元,用于暂时存放程序执行过程中的代码和数据,这些存储单元被称为寄存器。寄存器从应用角度可以分成两类:透明寄存器和可编程寄存器。

透明寄存器:有些寄存器对应用人员来说不能通过指令直接编程控制,它们对应用人员来说好像看不见一样,被称为透明寄存器。(你以为透明寄存器只是个小透明吗?什么叫“透明”呢?)这里的“透明”是计算机学科中常用的一个专业术语,表示实际存在但从某个角度看好像没有;运用“透明”思想可以使我们抛开不必要的细节,而专注于关键问题。

可编程寄存器可进一步分为通用寄存器和专用寄存器。
通用寄存器:处理器最常使用的整数通用寄存器;可用于保存整数数据、地址等;通用寄存器既是一个整体又可独立使用。(此句还有后续继续体会)
专用寄存器:这类寄存器各自只用于特定目的。例如程序计数器(PC)、标志寄存器(FLAGS)、指令指针寄存器(IP)、段寄存器等。

重要的来了!!!此部分要记好了,后续一直会用到。闲话少说,先上图!
在这里插入图片描述

3.通用寄存器

通用寄存器的用途很多,可以保存数据、暂存运算结果,也可以存放存储器的地址、作为变量的指针。
下图是8086处理器的8个16位通用寄存器,其中AX、BX、CX、DX还可以进一步分成高字节H(High)和低字节L(Low)两部分,这样就又有了8个8位通用寄存器:AX=AH+AL;BX=BH+BL;CX=CH+CL;DX=DH+DL。意为16位寄存器AX,数据的高8位由AH存储,低8位由AL存储。

名称中英文含义作用
AX累加器(Accumulator)使用频度最高,用于算术、逻辑运算以及与外设传送信息等
BX基址寄存器(Base)常用做存放存储器地址,以方便指向变量或数组中的元素
CX计数器(Counter)常作为循环操作等指令中的计数器
DX数据寄存器(Data)可用来存放数据,在输入输出指令存放外设端口地址
SI源变址寄存器(Source Index)用于指向字符串或数组的源操作数
DI目的变址寄存器(Destination Index)用于指向字符串或数组的目的操作数
BP基址指针寄存器(Base Pointer)默认情况下指向程序堆栈区的数据,主要用于在子程序中访问通过堆栈传递的参数和局部变量
SP堆栈指针寄存器(Stack Pointer)专用于指向程序堆栈区域顶部的数据,在涉及堆栈操作的指令中会自动增加或减少

4.专用寄存器

在这里插入图片描述
状态标志是最基本的标志,用来记录指令执行结果的辅助信息。
它们从低位到高位是:进位标志CF、奇偶标志PF、调整标志AF、零标志ZF、符号标志SF、溢出标志OF。
控制标志用于控制处理器执行指令的方式,可由程序根据需要用相关指令设置。
方向标志DF,仅用于串操作指令中,控制地址变化的方向。
中断允许标志IF,或简称中断标志,用于控制外部可屏蔽中断是否可以被处理响应;
陷阱标志TF,也常被称为单步标志,用于控制处理器是否进入单步操作方式。

在这里插入图片描述
在这里插入图片描述

5.8086存储组织

主存储器容量很大,被划分成许多存储单元,为了区分和识别,每个存储单元被编排一个号码即存储单元地址,称为存储器地址(Memory Address)
每个存储单元以字节为基本存储单位,即字节编址(Byte Addressable)
一个字节(Byte)等于8个二进制位(Bit)
二进制位是计算机存储信息的最小单位(常用单位)
16位(2个字节)构成一个字(Word)
32位(4个字节)构成一个双字(Double Word)

在这里插入图片描述

在这里插入图片描述
举例说明逻辑地址与物理地址,比如教学楼的教室编号,(物理地址方式)可以从1号房间一直排到最后,是连续的,绝对的地址;(逻辑地址方式)每层楼都可以重新由1-10编号,是相对的地址。
在这里插入图片描述
8086处理器具有20位地址总线,故8086能管理1MB存储容量。但8086处理器只有16位寄存器,用二进制16位(十六进制4位)表示存储器地址,可以表达的存储器容量是64KB,范围是0000H~FFFFH。因此引入逻辑段的概念,将1MB物理存储空间分成许多不超过64KB的区域进行管理,这种区域常称为段(区)。
在这里插入图片描述

注意:段基地址的物理地址低四位全为0(二进制),用16位寄存器将高16位存起来即可。且偏移地址也用16位二进制数(4位十六进制数)表示,在计算物理地址时(十六进制),将段基地址的末尾补0,然后用该地址加上偏移地址即为所求。
在这里插入图片描述
举个栗子吧:计算逻辑地址时需要将段地址左移,低四位用0补齐(二进制),若使用十六进制相当于段地址最右端添0,左移后的段地址再加上偏移地址即可得到物理地址,比如逻辑地址=0111:0123,则计算物理地址=01110H+0123H=01233H。。
在这里插入图片描述
在这里插入图片描述

三、汇编语言程序格式

程序用程序设计语言编写,由指令构成,指令由操作码和操作数(地址码)组成
操作码(Opcode)表明处理器执行的操作;操作数(Operand)是参与操作的数据对象。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.语句格式

语句格式:(这是MASM语法,但具有一般性)
源程序由语句组成
一个语句常占一行(MASM有续行符“\”)
一个语句每行不超过132个字符,4个部分(MASM6.0开始可以是512个字符)
执行性语句:表达处理器指令(硬指令)
标号: 硬指令助记符 操作数,操作数 ;注释
说明性语句:表达伪指令,控制汇编方式
名字 伪指令助记符 参数,参数,…… ;注释

在这里插入图片描述

2.标识符

在这里插入图片描述

3.助记符

在这里插入图片描述

4.操作数和参数

在这里插入图片描述

5.注释与分隔符

在这里插入图片描述

6.源程序框架

;example.asm in DOS
	.model small	;程序的存储模型,一般小型程序选用SMALL模型,大型选用LARGE模型
	.stack	;定义堆栈段(默认1KB)堆栈段名是:STACK,用@STACK预定义操作符
	.data	;定义数据段,数据段名是:_DATA,用@DATA预定义操作符
	……	;数据定义(数据待填)
	.code	;定义代码段,代码段名是:_TEXT,用@CODE预定义操作符
	.startup	;程序执行起始
	……	;主程序(指令待填)
	.exit	;程序正常执行结束
	……	;子程序(指令待填)
	end	;汇编结束

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
EXIT代表执行结束,END代表汇编结束,而值得注意的是执行结束不等于汇编结束。

四、DOS功能调用

1.输入输出AH调用

(1)在AH寄存器中设置系统功能调用号
(2)在指定寄存器中设置入口参数
(3)用中断调用指令(INT 21H)执行功能调用
(4)根据出口参数分析功能调用执行情况

子功能号功能参数
AH=01H输入一个字符AL=输入字符的ASCII码
AH=02H输入一个字符DL=字符的ASCII码
AH=09H输出一个字符串DX=字符串地址($结尾)
AH=4CH程序执行结束AL=返回代码

2.输入输出子程序库

在这里插入图片描述

;eg101a.asm
	include io.inc
	.model small
	.stack
	.data 
msg	db 'Hello, Assembly !',13,10,0	
	.code 
	.startup
	mov ax,offset msg
	call dispmsg
	.exit
	end

运行结果:
在这里插入图片描述


总结

此部分是汇编语言的入门基础,或许作为新手小白的你会在很多地方感到困惑不解,而知识点的渗透是层层深入的,切勿焦躁,在后续的文章中你的疑惑会逐步解开,欢迎在评论区留言,也欢迎大佬批评指正,期待我们一起学习,共同进步。希望本篇内容对你有所帮助,祝你开心每一天!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君知燕云归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值