20192401王麦齐汇编语言程序设计学习笔记(1~4章)
前言
计算机程序设计语言分为机器语言、高级语言和汇编语言三类
机器语言呈现计算机底部
高级语言更像是语法
虽然高级语言方便了人对计算机的使用,但其运行效率较低。在一些应用场合,如系统管理,实时控制等,难于满足要求。因此又希望使用机器语言。
为了便于记忆和阅读,使用字母和符号来表示机器语言的命令,用十进制数或十六进制数来表示数据,这样的计算机程序设计语言就称为汇编语言。
汇编语言
一条汇编语言的语句与一条机器语言指令对应,汇编语言程序与机器语言程序效率相同.
例如,对于前述的4×6+40算式运算,如果把机器语言程序改写为汇编语言程序,则为以下两条汇编指令∶
MUL BL
ADD AL, CL
不同类型计算机有不同的机器指令系统和汇编语言描述
为了学习和使用某种计算机的汇编语言,必须熟悉计算机的内部组成结构。但并非要掌握计算机系统的全部硬件组成,只需掌握用汇编语言编制程序时所涉及到的那些硬件的结构和功能。汇编语言与硬件密切联系
1.学习和使用汇编语言的目的
- 学习和使用汇编语言可以从根本上认识、理解计算机的工作过程。
通过用汇编语言编制程序可以更清楚地了解计算机是如何完成各种复杂的工作。在此基础上,程序设计人员能更充分地利用机器硬件的全部功能,发挥机器的长处。 - 在计算机系统中,某些功能必须用汇编语言程序来实现。
如∶机器自检、系统初始化、实际的输入输出设备的操作等。
一.进位计数制
使用一定个数的数码的组合来表示数字,这种表示方法称为进位计数制。根据所使用的数码的个数,就产生了不同的进位计数制。
将各个位置上所表示的基本数值称为位权,简称权。
不同的进位制和不同的位置其位权是不同的。
位权乘以对应位置上的数码就等于该数位上数值的大小。
每个数位上能使用不同数码的个数称为基数。例如十进制有十个数码0~9,基数为10,二进制基数为2。
每个数位能取的最大数码值=基数-1。如十进制为10-1=9
-
在计算机中数据表示一般采用二进制数,因为它在计算机中最容易表示和存储,且适合于逻辑值的表达与运算。
-
对人来说二进制不便于书写和阅读,因此书写时常使用8进制和16进制。
二进制与8进制、16进制之间有非常简单的转换关系∶3位二进制数与一位8进制数对应,4位二进制数与一位16进制数对应。 -
在书写不同进位计数制数时,为了区别,常在数的尾部用一个字母来表示。
B(Binary)——二进制数
O (Octal))或Q-—八进制数
D (Decimal)-—十进制数
H (Hexadecimal)-—十六进制数。
如未使用任何字母,则默认表示是十进制数。
十进制转换为二进制
整数部分
- (1)减权定位法 从二进制数高位起,依次用待转换的十进制数与各位权值进行比较; 如够减,则该数位系数Ki=1,同时减去该位权值,余数作为下一次比较的值;如不够减,则Ki=0。
- (2)除基取余法将十进制数除以基数2,其余数为二进制数的最低位,再用其商除2,其余数为次低位,反复做下去,直到商0。
小数部分
二进制与八进制和十六进制之间的对应关系很简单∶
三位二进制数对应一位八进制数,四位二进制数对应一位十六进制数。
例如∶10100010B
所以10100010B=242Q
10100010B= 1010 0010
例如∶10100010B
所以10100010B=242Q
10100010B= 1010 0010
所以 10100010B=A2 H所以 10100010B=A2 H
- 带符号数的表示
在一般算术表示中使用""+"和"-"来表示正数与负数,而在计算机中使用"0"和"1"来表示正数和负数。
用"+"或"一"表示正负的数叫真值
用"0"或"1"表示正负的数叫机器数
带符号的机器数可以用原码、反码和补码三种不同码制来表示。一般计算机中大多采用补码表示。
一、原码表示
二进制数的最高位表示符号,0表示正,1表示负。数值部分用二进制数绝对值表示
8位二进制数原码的最大数为011111(+127)
最小数为111111(-127)
0的原码有两种表示形式∶00000000和10000000(+0和-0)
二、补码的表示
- 补码的定义
带符号数X的补码表示【X】定义为∶【X】排=NM+X (Mod MD 其中模数MI根据机器数的位数而定,如位数为8则M=28 用补码表示的机器数,符号位仍然表示数的符号∶
0为正,1为负。对于正数,补码与原码相同,对于负数需要进行变换。 - 由真值、原码变换为补码
由于正数的原码与补码相同,下面讨论负数的变换方法。负数的真值变换为补码的方法∶将各位变反(0变1,1变0)然后在最低位加1.
负数的原码变换为补码∶保持符号位不变,其余各位变反,最低位加1。
将一59变换为补码
原码 10111011
变反
11000100
加1 11000101
真值一00111011 变反 11000100
加1 11000101
所以【-59】补=11000101所以【-59】补=11000101
注意补码的转换,注意-1和-128补码的对应值,先用原码再转换补码
视频里转换普遍为8位进行运算
-
在计算机内部,各种字符(字母、符号、数字码)都是按一定的方式编写成二进制信息。不同的计算机以及不同的场合所采用的编码形式可能不同。目前最广泛采用的是ASCII码(American Standard Code for Information Interchange)标准ASCII码为一字节,其中用低七位表示字符编码(见附录A),用最高位表示奇偶数验位。
-
ASCII码
在计算机内部,各种字符(字母、符号、数字码)都是按一定的方式编写成二进制信息。不同的计算机以及不同的场合所采用的编码形式可能不同。目前最广泛采用的是ASCII码(American Standard Code for Information Interchange)标准ASCII码为一字节,其中用低七位表示字符编码(见附录A),用最高位表示奇偶数验位。
二、IBM-PC微机基本结构
-
微机的一般构成一般计算机应包括五大部件∶
运算器、控制器、存储器、输入设备和输出设备。
由于微机的主要特点是其体积很小,因此在系统设计上就有一些特殊考虑。
将运算器和控制器两大部件集成在一个集成电路芯片上,称为中央处理器,简称CPU,也叫微处理器。
-
中央处理器CPU
微型计算机中的中央处理器也叫微处理器。它包括运算器和控制器。功能∶
分析从主存储器取来的各条指令的功能,控制计算机各部件完成指定功能的各项操作。 -
主存储器
主存储器是用来存放程序和数据的部件。它由若干个存储单元构成。
存储单元的多少表示存储器的容量。每个存储单元使用一个唯一的编号来标识,称为存储单元的地址。
习惯上将CPU与主存储器合称为主机
在计算机中,除了主存储器之外,一般还配置有辅助存储器,简称辅存。由于它的位置是在主机之外,因此也叫做外存。
-
输入输出设备及接口
输入设备将外部信息(程序、数据和命令)送入计算机。包括键盘、鼠标等。
输出设备将计算机处理后的结果转换为人或其它系统能识别的信息形式向外输出。如显示器、打印机等。 -
由于I/O设备的工作速度、工作原理以及所处理的信息格式等与主机相差很大,因此I/O设备要通过I/O接口才能与系统总线连接。
I/O接口是主机与I/O设备之间设置的逻辑控制部件。通过它实现主机与I/O设备间的信息传送。
- 系统总线
系统总线将CPU、存储器和I/O设备连接起来,实现各大部件之间的各种信息传送。
系统总线包括地址总线、数据总线和控制总线三组。它们分别用于传送不同的信息。
里面放了各式各样的指令符,说实话多的让人心痛。
一、存储器的组成
- 存储器是由若干个存储单元构成
存储单元的多少就表示了存储器的容量。 - 每个存储单元存放相同长度的二进制数
一个存储单元的长度一般为8位二进制数,即一个字节。 - 每个存储单元有一个唯一的地址编号—地址
8086/8088CPU有20根地址线,即它可以产生20位的地址码,它的存储器寻址能力为2*20,即1兆字节空间。
这个很重要
堆栈及其操作方法
堆栈是一个特定的存储区,访问该存储区一般需要按照专门的规则进行操作
堆栈的用途∶主要用于暂存数据以及在过程调用或处理中断时保存断点信息
- 堆栈的构造
堆栈一般分为∶专用堆栈存储器和软件堆栈
堆栈的一端是固定的,称为栈底,是存储器的最大地址单元
另一端是浮动的,称为栈顶,随着堆栈中存放信息的多少而改变
为了确定栈顶的位置,通常使用堆栈指针SP指示栈顶
堆栈存取数据的规则∶"先进后出FILO"
- 8086/8088堆栈的组织
当SP被初始化时,指向栈底+2单元,其值就是堆栈的长度
指向栈底+2单元的原因是当栈为空的时候,栈中没有元素,也就不存在栈顶页元素,所以SP具能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2
数据在堆栈中存放格式∶以字(两字节)为单位存放,数据的低8位放在较低地址单元,高8位放在较高地址单元
- 堆栈操作
设置堆栈
例如∶ STACK1 SEGMENT PARA STACK DB100 DUP (0)STACK1 ENDS
- 进栈PUSH
例如∶PUSHAX;将寄存器AX的内容压入堆栈
PUSH DS;将段寄存器DS的内容压入堆栈PUSHF;将标志寄存器内容压入堆栈
进栈过程∶首先将堆栈指针SP-2,即指向一个空的堆栈字单元。之后将要储存的内容送入SP指向的字单元中 - 出栈POP
出栈操作由POP指令或机器自动实现,它从堆栈顶部弹出一个字到通用寄存器、段寄存器或字存储单元例如∶ POP AX;将栈顶字单元内容弹出到AX
POP DS;将栈顶字单元内容弹出到段寄存器DS
POPF;将栈顶字单元内容送回标志寄存器F
出栈过程∶首先将SP指向的字单元内容送往指定的寄存器或存储器。之后将堆栈指针SP内容+2
第三章
本章学习的主要内容
Intel 8086/8088各指令中提供操作数的方法有以下四种;
(1)立即数操作数-操作数在指令代码中提供
(2)寄存器操作数——操作数在CPU的通用寄存器或段寄存器中
(3)存储器操作数—-操作数在内存的存储单元中
(4)I/O端口操作数——操作数在输入/输出接口的寄存器中
一个指令,一个目标,一个值,重要的是这个值在哪里,是现成的,还是存在寄存器中,还是在存储器中,或者是等待输入。一个指令,一个目标,一个值,重要的是这个值在哪里,是现成的,还是存在寄存器中,还是在存储器中,或者是等待输入。
注意加中括号个不加中括号的区别,常数为直接
关于寄存器间接寻址,寄存器进行中转,也就是找寄存器的对应的数值找到对应的寄存器,然后作为偏移量进行查找。
1123非常好记,这种方式至关重要(一个、四选一 、两个量和三个量)
指令系统
一种计算机所能执行的各种类型的指令的集合称为该计算机的指令系统。
Intel8086/8088CPU指令系统的指令可以分为六大类∶
1.传送类指令
2.算术运算类指令
3.位操作类指令
4.串操作类指令
5.程序转移类指令
6.处理器控制类指令
从指令的格式划分,一般可以分为三种∶
1.双操作数指令∶OPR DEST SRC
2.单操作数指令∶OPR DEST
3.无操作数指令∶OPR
作用∶将源操作数指定的内容传送到目的操作数,即DEST<=(SRC)。
当指令执行完后,目的操作数原有的内容被源操作数内容覆盖,即目的操作数和源操作数具有相同内容。
MOV指令对标志寄存器的各位无影响
MOV指令可以是字节数据传送也可以是字数据传送,但是源操作数和目的操作数的长度必须一致。MOV指令可以分为以下几种情况∶(1)立即数传送到通用寄存界或存储单元。
第四章 汇编语言程序格式
4.1 汇编语言语句种类及其格式
汇编语言的语句可以分为指令语句和伪指令语句
指令语句:每一条指令语句在汇编时都要产生一个可供CPU执 行的机器目标代码,它又叫可执行语句。一条指令语句最多可以包含4个字段:标号字段、指令助记符字段、操作数字段、注释字段
伪指令语句:又叫命令语句。伪指令本身并不产生对应的机器目标代码。它仅仅是告诉汇编程序对其后面的指令语句和伪指令语句的操作数应该如何处理。一条伪指令语句可以包含四个字段:符号名字段、伪指令符字段、操作数字段、注释字段
标识符:指令语句中的标号和伪指令语句中符号名统称为标识符。标识符是由若干个字符构成的
4.2 汇编语言数据
数据是指令和伪指令语句中操作数的基本组成部分。一个数据由数值和属性两部分构成
在汇编语言中常用的数据形式有:常数、变量和标号
常数:在汇编期间其值已完全确定,并且在程序运行过程中,其值不会发生变化
变量:变量用来表示存放数据的存储单元,这些数据在程序运行期间可以被改变
标号:标号写在一条指令的前面,它就是该指令在内存的存放地址的符号表示,也就是指令地址的别名
4.3 符号定义语句
在源程序设计中,使用符号定义语句可以将常数或表达式等内容用某个指定的符号来表示。在8086/8088汇编语言中有两种符号定义语句:
等值语句。语句格式:符号名 EQU 表达式
功能:用符号名来表示EQU右边的表达式。后面的程序中一旦出现该符号名,汇编程序将把它替换成该表达式。表达式可以是任何形式,如:常数或数值表达式、地址表达式、变量、寄存器名或指令助记符
等号语句。语句格式:符号名=表达式
功能:与等值语句具有相同的作用。但等号语句可以对一个符号进行多次定义
4.4 表达式与运算符
表达式是指令或伪指令语句操作数的常见形式。它由常数、变量、标号等通过操作运算符连接而成
8086/8088宏汇编语言中的操作运算符可以分为五类:
算术运算符
包括:+、—、*、 / 、MOD、SHL、SHR、[ ]
逻辑运算符
包括:NOT、AND、OR和XOR等
关系运算符
包括:EQ(等于)、NE(不等于)、LT(小于)、 LE(小于等于)、GT(大于)、GE(大于等于)
数值返回运算符,用于将变量或标号的某些特征值或存储单元地址的一部分提取出来
包括:SEG运算符、OFFSET运算符、TYPE运算符、LENGTH运算符、SIZE运算符
属性修改运算符,用来对变量、标号或存储器操作数的类型属性进行修改或指定
包括PTR运算符、HIGH/LOW运算符、THIS运算符
4.5 程序的段结构
8086/8088在管理内存时,按照逻辑段进行划分, 不同的逻辑段可以用来存放不同目的的数据。在程序中使用四个段寄存器CS,DS,ES和SS来访问它们。在源程序设计时,使用伪指令来定义和使用这些逻辑段。
段定义伪指令
伪指令SEGMENT和ENDS用于定义一个逻辑段。使用时必须配对,分别表示定义的开始与结束
段寻址伪指令
段寻址伪指令ASSUME的作用是告诉汇编程序,在处理源程序时,定义的段与哪个寄存器关联。ASSUME并不设置各个段寄存器的具体内容,段寄存器的值是在程序运行时设定的
段寄存器的装入
段寄存器的初值(段基值)装入需要用程序的方法来实现。四个段寄存器的装入方法略有不同
DS和ES的装入:
在程序中,使用数据传送语句来实现对DS和ES的装入
SS的装入:
在段定义伪指令的组合类型项中,使用STACK参数,并在段寻址伪指令ASSUME语句中把该段与SS段寄存器关联,如果在段定义伪指令的组合类型中,未使用STACK参数,或者是在程序中要调换到另一个堆栈,这时,可以使用类似于DS和ES的装入方法
CS的装入:
CPU在执行指令之前根据CS和IP的内容来从内存中提取指令,即必须在程序执行之前装入CS和IP的值。因此,CS和IP的初始值就不能用可执行语句来装入