汇编期末复习
第一章 汇编语言基础知识
机器指令:cpu能直接识别并遵照执行的指令,用二进制编码表示,由操作码,操作数组成,编码只含二进制0或1
机器语言:用二进制编码组成的机器指令的集合和一组使用机器指令的规则
汇编语言:对机器指令中的操作码用英文单词的缩写描述(助记符),对操作数用符号、变量、常量描述
汇编语言是一种符号语言。汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序
重点一 汇编语言的组成
汇编语言由以下三类指令组成
- 汇编指令:机器码的助记符,有对应的机器码。它是汇编语言的核心
- 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
- 其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码
l在书写不同进位计数制数时,常常在尾部用一个字母来表示该数是什么进位计数制的数。结尾用B(2进制数)、O(8进制数)、D(10进制数)、H(16进制数)、缺省为十进制数。
十进制转换为二进制:
对于十进制的小数部分除了可以使用降幂法也可采用乘法,即不断乘2,并计下整数,而小数部分再乘2,直到结果为0为止。
- l并非所有的十进制小数都能用二进制完全表示,可按需要取一定精度即可。
十进制转换为十六进制:、
对于十进制数的小数部分除了可以使用降幂法也可采用乘法,即不断乘16,并计下整数,而小数部分再乘16,直到结果为0为止
- 并非所有的十进制小数都能用十六进制完全表示,可按需要取一定精度即可
十六进制的乘法例子:
数的补码的具体操作是:
-
正数不变,负数则用绝对值取反+1
字符的表示:
基本逻辑运算:
- 逻辑运算按位操作
- 与运算AND
- 或运算OR
- 异或运算XOR
- 非运算NOT
第二章 计算机基本原理
16位结构的CPU具有以下几方面的结构特征:
- 数据总线为16位
- 运算器一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16位
CPU对内存的读写操作
通用数据寄存器
- 8086 CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,有时候也可以存放地址,被称为通用数据寄存器
- AX:累加寄存器,运算时较多使用这个寄存器,有些指令规定必须使用它
- BX:基址寄存器,除了存放数据,它经常用来存放一段内存的起始偏移地址
- CX:计数寄存器,除了存放数据,它经常用来存放重复操作的次数
- DX:数据寄存器,除了存放数据,它有时存放32位数据的高16位
地址寄存器
- 16位的8086处理器有4个16位的通用地址寄存器。它们的主要作用是存放数据的所在偏移地址,也可以存放数据。这4个寄存器不能再拆分使用
- SP:堆栈指针,这是一个专用的寄存器,存放堆栈栈顶的偏移地址
- BP:基址指针,可以用来存放内存中数据的偏移地址
- SI:源变址寄存器,它经常用来存放内存中源数据区的偏移地址,所谓变址寄存器,是指在某些指令作用下它可以自动地递增或递减其中的值
- DI:目的变址寄存器,它经常用来存放内存中目的数据区的偏移地址,并在某些指令作用下可以自动地递增或递减其中的值
段寄存器、
- 16位8086处理器有4个16位的段寄存器,分别命名为CS,SS,DS,ES。它们用来存放4个段的段基址
- CS:代码段寄存器,用来存放当前正在执行的程序段的段基址
- SS:堆栈段寄存器,用来存放堆栈段的段基址
- DS:数据段寄存器,用来存放数据段段基址
- ES:附加段寄存器,用来存放另一个数据段的段基址
指令指针寄存器
- IP:指令指针寄存器,存放即将执行指令的偏移地址
- FLAGS:存放CPU的两类标志
- 状态标志:反映处理器当前的状态,如有无溢出,有无进位等
- 状态标志有6个:CF、PF、AF、ZF、SF和OF
- 控制标志:用来控制处理器的工作方式,如是否响应可屏蔽中断等
- 控制标志有3个:TF、IF和DF
8086CPU的工作过程
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP=IP+所读取指令的长度,从而指向下一条指令
- 执行指令,转到步骤1,重复这个过程
CS和IP的内容提供了CPU要执行指令的地址
堆栈
- 堆栈区就是这样一个特殊的存储区,它的末单元称为栈底,数据先从栈底开始存放,最后存入的数据所在单元称为栈顶。当堆栈区为空时,栈顶和栈底是重合的。数据在堆栈区存放时,必须以字存入,每次存入一个字,后存入的数据依次放入栈的低地址单元中。栈指针SP每次减2,由栈指针SP指出当前栈顶的位置,数据存取时采用后进先出的方式
根据不同用途,接口中的寄存器端口分为以下三类
- 数据端口
- 控制端口
- 状态端口
CPU与I/O接口中端口的信息传输也都是通过数据总线进行的
第三章 汇编语言程序实例及上机操作
系统工作过程
- 使用编辑程序编辑源程序文件
- 使用汇编程序(MASM)将源程序文件(.asm)汇编成目标文件(.obj)
- 使用连接程序(LINK),将目标文件(.obj)连接成可执行文件(.EXE)
- 使用调试程序(DEBUG),调试可执行文件
常用DOS命令
- 盘:;选择盘符
- CD;选择目录
- DIR;显示目录和文件
- REN;改变文件名
- CLS;清除屏幕
- DEL;删除文件
- MD;建立目录
- RD;删除目录
- COPY;复制文件
- TYPE;显示文本文件的内容
- 》;输出的重定向操作符
- SET PATH;设置或显示可执行文件的搜索路径
- HELP;显示命令格式和用法
在Win7系统中执行汇编
- DosBox为Windows环境下Dos模拟器,可以将Dos程序放置在该环境中运行。其过程即为挂载,挂载命令为mount
重点二 几个常用的Dos系统功能调用
-
21H号中断是Dos提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能
-
汇编语言程序设计需要采用系统的各种功能程序
功能调用的格式通常按照如下4个步骤进行
- 在AH寄存器中设置系统功能调用号
- 在指定寄存器中设置入口参数
- 执行指令INT 21H,实现中断服务程序的功能调用
- 根据出口参数分析功能调用执行情况
第四章 操作数寻址方式
计算机中的指令由操作码和操作数组成
- 操作数字段可以有一个、两个或三个,通常称为一地址、二地址或三地址指令
- 二地址指令中两个操作数分别称为源操作数和目的操作数
- 所谓寻址方式就是指令中寻找操作数的方式
8086汇编语言指令的一般格式为:【标号:】指令助记符 【操作数】 【;注释】
- 【】中的内容为可选项
- 标号:符号地址,表示指令在内存中的位置
- 指令助记符:指令名称,是指令功能的英文缩写
- 操作数:指令要操作的数据或数据所在的地址。寄存器,常量,变量,表达式
- 注释:每行以分号“;”开头,汇编程序不处理
立即寻址方式:操作数就在指令中,紧跟在操作码之后,操作数作为指令的一部分存放在代码段
- 执行时无需去内存取数,因此称为立即数
- 主要用于寄存器赋初值
- 立即数只能作为源操作数,并且长度与目的操作数一致
寄存器寻址方式:操作数就是寄存器中的值,指令中给出寄存器名
- 偏移地址也成为有效地址(EA)
直接寻址方式:操作数的有效地址EA就在指令中,机器默认段地址在DS中
- 存储器读操作
- 存储器写操作
- 如果要实现CPU写内存操作,只要把MOV指令的目的操作数变为存储单元,源操作数为CPU的寄存器即可
- 符号地址
- 直接寻址方式除了用数值作为有效地址之外,还可以用符号地址的形式。为存储单元定义一个名字,该名字就是符号地址。如果把存储单元看成变量,该名字也是变量名
- 段前缀
- 在与内存有关的寻址方式中,操作数的段地址默认为数据段,8086规定除了数据段之外,数据还可以存放在其他三种段中,如果操作数在其他段中存放,称为段超越,需要在指令中用段超越前缀指出,即用操作数前加上段寄存器名和冒号表示。
寄存器间接寻址方式:操作数的有效地址在寄存器中,只允许使用BX、BP、SI和DI寄存器
寄存器相对寻址方式:操作数的有效地址是一个寄存器和位移量之和
基址变址寻址方式:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和
- 基址寄存器BX和BP,变址寄存器SI和DI
- 默认段寄存器搭配和寄存器间接寻址方式一样
相对基址变址寻址方式:操作数的有效地址是一个基址寄存器和一个变址寄存器以及一个位移量之和
- 基址寄存器BX和BP,变址寄存器SI和DI
- 默认段寄存器搭配和寄存器间接寻址方式一样
第五章 常用指令
8086汇编语言指令的一般格式为:【标号】 指令助记符 【操作数】 【;注释】
8086指令系统可以分为5组
- 数据传送指令
- 算术运算指令
- 逻辑指令与移位指令
- 串操作指令
- 程序转移指令
数据传送指令
-
通用数据传送指令
-
MOV 传送
-
双操作数指令的规定
-
-
PUSH 进栈
-
POP 出栈
-
XCHG 交换
-
-
累加器专用传送指令
其中I/O端口是CPU与外设传送数据的接口,单独编址,不属于内存,端口地址范围0000~FFFFH,这组指令只限于AX,AL累加器
-
IN;从I/O端口输入
-
OUT;向I/O端口输出
-
XLAT;换码(查表)
-
-
地址传送指令
-
LEA有效地址送寄存器指令
-
LDS指针送寄存器和DS指令
-
LES指针送寄存器和ES指令
-
-
标志寄存器传送指令
-
算术运算指令
- 加减乘除四则运算是计算机经常进行的基本操作。算术运算指令主要实现二进制(和十进制)数据的四则运算
-
类型扩展指令
-
加法指令
-
ADD加法指令
-
ADC带进位加法指令
-
INC 加1指令
-
-
减法指令
-
SUB减法指令
-
SBB带借位减法指令
-
DEC减1指令
-
NEG求补指令
可以看出,NEG指令实际上就是求数X的相反数,即求0-X,只有当X=0时,CF=0,其它情况CF=1
-
CMP比较指令
-
CMP指令虽作减法,但不回送结果,只是产生标志位,为程序员比较两个数的大小提供判断依据
![typoraImage](https://img-blog.csdnimg.cn/img_convert/6593f4f7e4d20915c95a393c4d0f453c.png)
-
乘法指令
-
MUL无符号数乘法指令
-
IMUL带符号数乘法指令
两个相乘的数必须长度相同
SRC不能是立即数
-
-
除法指令
-
DIV无符号数除法指令
-
IDIV带符号数除法指令
-
BCD码的十进制调整指令
-
前面所介绍的所有算术运算指令都是二进制数的运算,为便于十进制运算,计算机提供了十进制调整指令,在二进制数计算的基础上,给予十进制调制,直接得到十进制结果
-
BCD(8421码):用二进制编码表示十进制数
-
十进制数转换为BCD码:
-
压缩的BCD码调整指令主要有两条:
-
DAA;加法十进制调整指令
-
DAS;减法十进制调整指令
-
逻辑指令
-
AND;与指令
-
OR;或指令
-
NOT;非指令
-
XOR;异或指令
-
TEST;测试指令
移位指令
-
SHL;逻辑左移
-
SAL;算术左移
-
SHR;逻辑右移
-
SAR;算术右移
-
ROL;循环左移
-
ROR;循环右移
-
RCL;带进位循环左移
-
RCR;带进位循环右移
-
算术移位指令适用于带符号数运算,SAL用来乘以2,SAR用来除以2;逻辑移位指令适用于无符号数运算,SHL用来乘以2,SHR用来除以2
串操作指令
-
MOVS;串传送
-
CMPS;串比较
-
SCAS;串扫描
-
STOS;存入串
-
LODS;从串取
-
串操作指令每次处理的是字节或字,因此需要重复执行串操作指令才能处理完一个数据串
- REP的作用:重复执行串操作指令,直到CX=0为止,串操作指令每执行一次,使CX自动减1
- REPE/REPZ的作用:当CX≠0并且ZF=1时,重复执行串操作指令,直到CX=0或者ZF=0为止,串操作指令每执行一次,使CX自动减1
- REPNE/REPNZ的作用:当CX≠0并且ZF=0时,重复执行串操作指令,直到CX=0或者ZF=1为止,串操作指令每执行一次,使CX自动减1
程序转移指令
无条件转移指令
-
JMP跳转指令:无条件转移到指令指定的地址去执行程序,转移的目标地址和本跳跳转指令在同一个代码段,则为段内转移;否则是段间转移。转移的目标地址在跳转指令中直接给出,则为直接转移;否则是间接转移
-
段内直接转移
-
段内间接转移
-
段间直接转移
-
段间间接转移
条件转移指令
-
条件转移指令根据上一条指令所设置的标志位来判别测试条件,从而决定程序转向,通常在使用条件转移指令之前,应有一条能产生标志位的前导指令,如CMP指令。汇编指令格式中,转向地址由标号表示,所有的条件转移指令都不影响标志位
-
根据单个条件标志的设置情况转移
-
测试CX寄存器的值为0则转移
-
比较两个无符号数,根据结果转移
-
比较两个带符号数,根据结果转移
循环指令
第六章 伪指令与源程序格式
汇编语言程序的语句:指令、伪指令、宏指令
指令是在程序运行期间由计算机的CPU来执行的
伪指令:主要用来定义数据变量和程序结构。伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作
处理机选择伪指令:告诉汇编程序选择哪一种指令系统,默认选择8086指令系统
assume伪指令只是指定把某个段分配给哪个段寄存器,并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中,通常用两条MOV指令完成这一操作,但是代码段不需要这样做,它在程序初始化的时候完成
简化的段定义伪指令
程序开始和结束伪指令
标号与变量区别
- 变量:定义一般在非代码段,是数据在内存中存放的符号地址,是在程序运行期间可随时被修改数值的数据对象,是内存的一个数据区的名字。由标识符构成,其后不带冒号。
- 标号:定义一般出现在代码段中,表示指令在内存中存放的符号地址。它对应的值在汇编时自动计算。是由标识符及后一个冒号构成
程序中默认的数据为十进制数。当数据第一位不是数字时,应在前面加0,负数均为补码形式存放。字符串用’‘括起来。’?'表示只分配存储单元,不存入数值
表达式赋值伪指令”EQU“和”=“
- 可以用赋值伪操作给表达式赋予一个常量或名字。格式如下:
- 表达式中的变量或标号,必须先定义后引用
- EQU伪操作中的表达式名是不允许重复定义的,而”=“伪操作则允许重复定义
过程定义伪指令
- 过程相当于高级语言程序中的子程序,是能完成特定功能的独立的代码模块,过程是进行模块化程序设计的基础。8086中调用过程指令是CALL,从过程返回的指令是RET
- 过程定义包含两条伪指令,PROC和ENDP,PROC表示过程的开始,ENDP表示过程的结束
- 过程名是标识符,起到标号的作用,是子程序入口的符号地址
- 过程的属性可以是FAR或NEAR类型。NEAR为近,是段内调用。FAR类型为远,是跨段调用,缺省时为NEAR
当一个表达式中同时有几个运算符时,按运算符优先级顺序执行,汇编源程序时,汇编程序按照下列规则计算表达式的值:
- 先执行优先级高的运算
- 优先级相同的操作,从左至右顺序进行
- 可以用圆括号改变运算的顺序
汇编语言源程序有两类:
- 扩展名为.EXE的可执行文件(简称EXE文件)
- 扩展名为.COM的可执行文件(紧凑格式,简称COM文件)
- 这两种文件具有不同的优先级,其源程序结构也有较大差异
EXE文件除了程序本身,还有文件头
COM文件由本身的二进制代码组成,它没有EXE文件那样具有文件信息的标题区
并不是具有COM文件的源程序格式,就一定是COM文件,COM文件也是通过LINK连接程序产生,连接命令后面必须加上/T
如果同一目录中有两个文件,如PROG.EXE和PROG.COM,当键入PROG执行程序时,COM文件将被执行,键入PROG.EXE才能执行PROG.EXE
第七章 分支与循环程序设计
单分支结构程序
多分支程序
- 如果在分支结构中有超过两个以上的多个可供选择的分支,这就是多分支结构
- 如果对多分支的条件逐个查询以确定是哪一个分支,只会增加代码和时间,为了尽快进入某个分支,可以采用分支向量表法
循环程序结构
- 循环程序有两种结构形式:DO–WHILE结构和DO–UNTIL结构。循环程序由三部分组成:循环初始状态、循环控制、循环体。循环控制条件有三类:计数循环、条件循环、条件计数循环
计数循环程序
- 计数循环:用循环计数器的值控制循环
条件循环程序
- 在循环程序中,有时候每次循环所做的操作可能不同,即循环体中有分支的情况,需要依据某一个标志来决定做何操作。标志位为1表示要做操作A,标志位为0表示要做操作B,我们可把这种标志字称为逻辑尺