玩转汇编——基础
前言
汇编语言本质上仍是机器语言,是程序员接触计算机底层硬件的基础,其重要性不言而喻,跟随作者一起玩转汇编吧!
(本篇参考教材为钱晓捷的《汇编语言简明教程》以及燕山大学汇编语言教学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
运行结果:
总结
此部分是汇编语言的入门基础,或许作为新手小白的你会在很多地方感到困惑不解,而知识点的渗透是层层深入的,切勿焦躁,在后续的文章中你的疑惑会逐步解开,欢迎在评论区留言,也欢迎大佬批评指正,期待我们一起学习,共同进步。希望本篇内容对你有所帮助,祝你开心每一天!