20192413宗俊豪汇编语言程序设计学习总结
汇编语言学习总结——20192413宗俊豪
第一章 汇编语言的基本概念
-
字母或符号表示机器语言的命令
-
十进制数或十六进制数表示数据
-
一条汇编语言的语句与一条机器语言指令对应
-
汇编语言程序与机器语言程序效率相同
一、进位计数制
B——二进制数
O——八进制数
D——十进制数
H——十六进制数
1.十进制转二进制:(1)减权定位法 (2)除(乘)基取余法
2.二进制转十进制:(1)按权相加法 (2)逐次乘(除)积相加法
3.二进制与八进制十六进制的转换:3对1、4对1
二、带符号数的表示
0和1表示正数和负数
1.原码
0的原码:00000000和10000000
2.补码
[X]补=M+X
三、补码变换
-
正数原码和补码相同
-
负数真值变补码:各位变反,最低位加1
-
负数原码变补码:符号位不变,各位变反,最低位加1
-
0的补码只有00000000,10000000是-128补码,11111111是-1的补码
四、补码加减运算
-
[X+Y]补=[X]补+[Y]补
-
[X-Y]补=[X]补-[Y]补=[X]补+[-Y]补
([-Y]补是将[Y]补连通符号位一起求反再最低位加1)
第二章 微机结构
一.CPU
运算器+控制器
功能:分析指令功能、控制各项操作
1.CPU执行指令:从存储器中取指令 执行指令规定的操作
串行方式和指令流水线方式
-
串行方式:CPU指令执行阶段不需要占用系统总线,CPU和总线利用率低,运行速度较慢
-
指令流水线方式:工作效率较高 执行单元EU+总线接口单元BIU
EU:取指令、运算、向BIU发送命令
BIU:负责CPU与存储器、IO的信息传递
CPU寄存器:8个通用寄存器+2个控制寄存器+4个段寄存器
CPU访问存储器时:段+偏移量
通用寄存器:累加器AX、基址寄存器BX、计数寄存器CX、数据寄存器DX、堆栈寄存器SP、基址指针BP、源变址寄存器SI、目的变址寄存器DI
-
数据寄存器:AX、BX、CX、DX
例:MOV AX,BX
-
指针寄存器:SP、BP 一般做偏移量使用 SP指针指向堆栈顶部,BP指针指向堆栈段内某一存储单元
-
变址寄存器:SI、DI,做地址指针
-
控制寄存器:指令指针IP、标志寄存器FLAGS
段寄存器:代码段寄存器CS、数据段寄存器DS、附加段寄存器ES、堆栈段寄存器SS
标志寄存器:反映CPU在程序运行时的某些状态,如是否有进位、奇偶性等 分为状态标志、控制标志
2.主存储器
存放程序和数据
-
存储器的容量:存储单元的多少 存储单元有唯一的编号(存储地址)
-
多数以字节为基本单位,每个基本单位称为一个存储单元
(CPU+主存储器称为主机)
特点:
-
段基址 一个小节的首址
-
16个字节称为一个小节,1M内存可划分为64K小节
-
逻辑段有4种情况:邻接、间隔、部分重叠、完全重叠
(内存中一个物理存储单元可以映像到一个或多个逻辑段中) -
任意时刻一个程序只能访问4个当前段中的内容
堆栈:用于暂存数据以及断点信息 先进后出 数据在堆栈中以字为单位存放
3.系统总线
分为地址总线、数据总线、控制总线
第三章 寻址方式与指令系统
一、寻址方式
指令:操作码+操作数
提供操作数方法:
-
立即数操作数
-
寄存器操作数
-
存储器操作数
-
IO端口操作数
寻址方式:
1.立即数寻址 操作数直接在指令代码中
MOV AH,20H
不另外占用总线周期,执行速度快
2.寄存器寻址
MOV AX,BX
CPU内部进行不需要总线周期,执行速度快
3.存储器寻址
(1)直接寻址
MOV BX,DS:VAR(段基址DS,偏移量VAR)
MOV BX,DS:[64H](段基址DS,偏移量100字节,注意中括号)
(2)间接寻址
通过寄存器取操作数
指示存储器所在段的段寄存器:BP——SS,其余DS
MOV AX,[BX]——MOV AX,DS:[BX]
4.基址寻址/变址寻址
- 操作数EA=基址/变址+位移量
- 隐含使用规则同间接寻址
- 位移量为常数是不能加方括号
5.基址变址寻址
操作数EA=基址+变址+位移量
6.串操作寻址方式
- 特点:寻找源操作数用SI做地址指针
- 寻找目的串时用DI做地址指针
- 串操作完成之后自动对SI和DI进行修改
7.I/O端口寻址
(1)存储器编制方法
将I/O端口视为存储器的一个单元,访问端口等同于访问存储单元
特点:程序设计灵活,但需要占用存储地址空间
(2)I/O端口编址方法
I/O端口的地址与存储器地址分开,用专门的输入指令和输出指令
-
直接端口寻址
0-255个端口IN AL,25H
-
间接端口寻址
用DX作为间接寻址寄存器MOV DX,378H OUT DX,AL
二、指令系统
分类:
1.传送类指令
2.算术运算类指令
3.位操作类指令
4.串操作类指令
5.程序转移类指令
6.处理器控制类指令
双操作数指令:OPR DEST SRC
单操作数指令:OPR DEST
无操作数指令:OPR
一.传送类指令
1.通用数据传送指令
MOV DEST,SRC(对标志寄存器的各位无影响)
- 段寄存器CS只能做源操作数,不能做目的操作数
- 存储单元之间不能直接传送数据
2.交换指令
XCHG DEST,SRC(对标志寄存器的各位无影响)
- 寄存器之间或寄存器与存储器单元之间进行
- 不能存储单元之间
3.标志传送指令
4条都是无操作数指令(隐含操作数)
(1)取标志寄存器指令
LAHF
标志寄存器的低八位送入AH寄存器,即将标志SF、ZF、AF、PF、CF分别送入AH的第7、6、4、2、0位
(对标志寄存器的各位无影响)
(2)存储标志寄存器指令
SAHF
与取标志寄存器指令相反
(3)标志进栈指令
PUSHF
(4)标志出栈指令
POPF
4.地址传送指令
将存储单元的地址送寄存器
(1)装入有效地址
LEA DEST,SRC
SRC是一个字节或字存储器操作数,DEST必须是一个16位通用寄存器
作用:将SRC存储单元地址中的偏移量即有效地址传送到一个16位通用寄存器中
(对标志寄存器的各位无影响)
LEA AX,[BX][SI]
源操作数是基址变址寻址方式(存偏移量!不是存内容!)
(2)装入地址指针指令
LDS DEST,SRC
LES DEST,SRC
DEST是16位通用寄存器,SRC必须是一个存储器操作数
将SRC存储单元开始的4个字节单元的内容(32位地址指针)送入DEST通用寄存器和段寄存器DS(LDS)或ES(LES)
低字单元内容为偏移量送通用寄存器,高字单元内容为段基值送DS或ES
二、算数运算类指令
1.加法指令
ADD DEST,SRC
-
影响标志寄存器CF、PF、AF、ZF、SF、OF
-
DEST不能是立即数
-
SRC和DEST不能都为存储器操作数
2.带进位加法指令
ADC DEST,SRC
- DEST<=DEST+SRC+CF(进位标志)(进行运算前的CF值)
3.加1指令
INC DEST
-
影响标志寄存器PF、AF、ZF、SF、OF
-
用于某些计数器的技术和修改地址指针
4.减法指令
SUB DEST,SRC
-
影响标志寄存器CF、PF、AF、ZF、SF、OF
-
DEST不能是立即数
-
SRC和DEST不能都为存储器操作数
5.带借位减法
SBB DEST,SRC
- DEST<=DEST-SRC-CF
6.减1指令
DEC DEST
- 影响标志寄存器PF、AF、ZF、SF、OF
7.求负数指令
NEG DEST
-
也叫取补指令
-
当字节操作数为-128或字操作数为-32768时执行指令操作数无变化但溢出标志OF被置1
三、位操作类指令
1.逻辑运算指令
与 AND
或 OR
异或 XOR
非 NOT
NOT对标志位无影响
其余影响SF、ZF、PF,CF和OF总是置0,AF不确定
2.测试指令
TEST DEST,SRC
逻辑与,但不送入DEST
3.移位/循环移位指令
(1)算数移位
SAL DEST,COUNT算数左移 最高位移入CF,最低位补0
SAR DEST,COUNT算数右移 最低位移入CF,最高位不变(符号位)
当COUNT等于n时其作用相当于乘或除以2的n次方
(2)逻辑移位
SHL DEST,COUNT逻辑左移 与算数左移一样
SHR DEST,COUNT逻辑右移 最高位补0
(3)循环移位
小循环:
ROL DEST,COUNT循环左移 最高位移入CF和最低位
ROR DRST,COUNT循环右移 最低位移入CF和最高位
大循环:
RCL DEST,COUNT带进位的循环左移 最高位进CF,CF的值进最低位
RCR DEST,COUNT带进位的循环左移 最低位进CF,CF的值进最高位
共同点:
- 移位次数为1是使用常数1或寄存器CL
- 移位次数大于1必须使用寄存器CL
- 算术移位和逻辑移位会修改CF、PF、ZF、SF、OF,AF不确定
- 循环移位只修改CF和OF
四、处理器控制类指令
1.标志位操作指令
能操作的标志位:CF、IF、DF
(1)清除进位标志
CLC:置CF为0
(2)置1进位标志
STC:置CF为1
(3)进位标志取反
CMC:CF的值取反
(4)清除方向标志
CLD:置DF为0
(5)置1方向标志
STD:置DF为1
(6)清除中断标志
CLI:置IF为0
(7)置1中断标志
STI:置IF为1
2.与外部事件同步的指令
HLF:暂停指令
WAIT:等待指令
ESC:外部协处理器指令前缀
LOCK:总线锁定指令
3.空操作指令 NOP
执行一次NOP占用CPU3个时钟周期,用来延时
指令编码
一、双操作数指令编码格式
操作数两种情形:
1.一个操作数在寄存器中,另一个操作数在寄存器或者存储器中
2.目的操作数在寄存器或存储器中,源操作数是立即数
目标代码长度为2-6个字节:操作特征1字节+寻址特征1字节+位移量2字节+立即数2字节
1.操作特征
(1)OPCODE:操作码字段
- 表示该指令所执行的功能和两个操作数的来源
- 若源操作数是立即数则需要使用指令编码的第2字节中的REG字段做辅助操作码
(2)方向字段d
- 与第二部分寻址特征一起来决定源操作数和目的操作数的来源(源操作数为立即数时d字段无效,被并入操作码字段)
(3)字/字节字段W
- W=1时为字,W=0时为字节
2.寻址特征
- 与d结合指定寻址方式和寄存器
- REG确定一个操作数,MOD和R/M字段确定另一个操作数
- d=1时REG决定目的操作数,MOD和R/M决定源操作数
- d=0时MOD和R/M决定目的操作数,REG决定源操作数
(1)REG字段
- 使用寄存器寻址方式
- 与W配合使用有16种组合,可以分别指定16个通用寄存器
- 若指定段寄存器:000——ES,001——CS,010——SS,011——DS
(2)MOD和R/M
- 共同确定一个操作数(可在寄存器中也可在存储器中)
3.位移量部分
- 分为:没有位移量、1字节位移量disp8、2字节位移量disp16
4.立即数部分
二、单操作数指令编码格式
2-3字节 操作特征+寻址特征+位移量
(1)操作特征
OPCODE+V+W三个字段
V字段只有位移/循环指令中才有:V=0用常数1作为COUNT,V=1用寄存器CL作为COUNT
(2)寻址特征
不需要REG字段,该字段被用作辅助操作码
三、与AX或AL有关的指令编码格式
用于隐含指定AX/AL作为一个操作数的双操作数指令(另一个数可以是立即数或存储单元)
四、其他指令编码格式
标志位操作指令
堆栈操作指令
一般只有一个字节
第四章 汇编语言程序格式
一、汇编语言语句种类及其格式
指令语句(可执行语句)
标号:指令助记符 操作数,操作数;注释
1.标号字段
- 可选字段
- 是一条指令的符号地址,代表了该指令的第一个字节存放地址
- 一般放在一个程序段或子程序的入口处
2.指令助记符字段
- 必选项
- 可在助记符前边加上前缀实现附加操作
3.操作数字段
- 数量不定
4.注释字段
- 可选字段
伪指令语句(命令语句)
本身不产生对应的机器目标代码
符号名 伪指令符 操作数;注释
1.符号名字段
- 可选项
- 根据伪指令的不同可以是常量名、变量名、过程名、结构名和记录名等
- 伪指令符号名可以作为其他伪指令语句或指令语句的操作数,表示一个敞亮或存储器地址
2.伪指令符字段
- 必选项
- 伪指令功能
3.操作数字段、注释字段
- 同指令字段
标识符
标号和符号名统称为标识符
规则:
- 字符个数为1-31个
- 第一个字符必须是字母、问号、@或下划线
- 第二个字符开始可以是字母、数字、@、下划线或问号
- 不能使用系统专用的保留字
二、汇编语言数据
常数
1.二进制数
2.八进制数
3.十进制数
4.十六进制数 首位为字母在前边加0
5.实数 整数部分.小数部分E+指数部分 例:2.134E+10
6.字符串常数 存储时以ASCII码的形式存储
使用:
(1)作指令语句的源操作数
(2)在指令语句的直接寻址方式、变址(基址)寻址方式或基址变址寻址方试中作位移量
(3)在数据定义伪指令中使用
变量
- 变量用来表示存放数据的存储单元
- 程序中以变量名的形式来访问变量,可以认为变量名就是存放数据的存储单元地址
1.变量的定义与预置
- 就是给变量在内存中分配一定的存储单元
- 格式:
变量名+DB(字节变量)/DW(字变量)/DD(4字节变量)/DQ(8字节变量)/DT(10字节变量)+表达式1,表达式 2(存储单元赋的初值)....
变量被定义后有了三个属性:
(1)段属性
表示变量存放在哪一个逻辑段中
(2)偏移量属性(OFFSET)
表示变量所在位置与段起始点之间的字节数
段属性和偏移量属性够早了变量的逻辑地址
(3)类型属性
表示变量占用存储单元的字节数
赋初值形式:
(1)数值表达式
例如:
DATA1 DB 32,30H
(2)?表达式
表示可以预置任意内容
例如:
DA-BYTE DB ?,?,?
(3)字符串表达式
字符串为用引号括起来的不超过255个字符。给每一个字符分配一个字节单元。字符串俺从左到右将字符的ASCII编码值以地址递增的排列顺序依次存放
例如:
STRING1 DB ‘ABCDEF’
对于DD伪指令,只能给两个字符组成的字符串分配4个字节单元
两个字符存放在较低地址的两个字节单元中,较高地址的两个字节单元存放0
DW和DD伪指令不能用两个以上字符构成的字符串赋初值否则将出错
(4)DUP表达式
重复数据操作符
变量名+DB/DW/DD+表达式1 DUP(表达式2)
表达式1是重复的次数,表达式2是重复的内容
DUP可以嵌套使用
2.变量的使用
(1)在指令语句中引用
在指令语句中直接引用变量名就是对其存储单元的内容进行存取
变量出现在变址(基址)寻址或基址变址寻址的操作数中时表示取用该变量的偏移量
(2)在伪指令语句中引用
标号
(1)段属性
(2)偏移量属性
(3)距离属性(类型属性)
三、符号定义语句
1.等值语句
(1)一般格式
符号名 EQU 表达式
- 左边的符号名代表右边的表达式。
注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义。
(2)用符号名代表常量或表达式
- 当把一个常量或表达式定义成一个具有一定含义的符号名后,在程序中就可以用该符号名来代表该常量或表达式。
(3)用符号名代表字符串
- 用一个具有一定含义的符号名定义某一个较长的字符串,在随后的程序中就用该符号名。
(4)用符号名关键字或指令助忆符
- 用一个(组)程序员自己习惯的符号名来代替汇编语言中的关键字或指令助忆符。
2.等号语句
- 汇编语言提供了用等号来定义符号常数的方法,即可用符号名代表一个常数。
格式:
符号名=数值表达式
四、表达式与运算符
1.算术运算符
+ , - , x , / , MOD,SHR,SHL
2.逻辑运算符
AND, OR, NOT, XOR
3.关系运算符
EQ、NE、LT、LE、GT、GE
4.数值返回运算符
(1)SEG运算符
取变量或标号所在段的段基值
(2)OFFSET运算符
取标量或标号在段内的偏移量
(3)TYPE运算符
取变量或标号的类型属性,并用数字形式表示
(4)LENGTH运算符
取变量的长度
(5)SIZE运算符
只能作用于变量
五、程序的段结构
-
段定义伪指令
1.段名
用户任意选定,符合标识符规则的一个名称
2.定位类型
3.组合类型 -
段寻址伪指令
作用:告诉汇编程序,在处理源程序时,定义的段与哪个寄存器关联
六、标题伪指令
语句格式 TITLE 标题名
七、从程序返回操作系统的方法
1.使用程序段前缀PSP实现返回
2.使用DOS系统功能调用实现返回
学习心得
学习完四章视频后,我对于汇编语言有了初步的了解与认识。第一章第二章中对于计算机组成原理中的知识进行了回顾,复习了原码补码等数据表示方面的知识以及CPU、主存储器、总线等硬件知识;第三章中对于操作系统中的寻址方式进行了复习并且以更深入的角度了解了寻址的实质,同时在第三章中也以汇编的角度学习了寻址的过程和指令系统的相关内容;第四章中是对汇编语言的详细讲解,通过学习本章了解了汇编语言数据的分类,以及一些定义语句的使用,对于汇编语言的具体应用有了一定的印象,并且可以分析一些简单的汇编代码。通过对于这四章的学习,认识到了汇编语言的一定难度,但同时也对计算机的运行本质有了进一步的了解。在今后的学习中需要对掌握的内容进行更多的分析与实践才能有更透彻的理解。