编程语言
首页 > 编程语言> > IBM-PC汇编

IBM-PC汇编

作者:互联网

目录

机器语言

计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。

用机器语言编写的程序是计算机唯一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序。

汇编语言

为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。
汇编语言是一种用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。
如:

ADD CL,BH
MOV AL,5

汇编语言的特点

  1. 汇编语言与处理器密切相关
  2. 汇编语言程序效率高
  3. 编写汇编语言源程序比编写高级语言源程序烦琐
  4. 调试汇编语言程序比调试高级语言程序困难

汇编语言的主要应用场合

  1. 程序执行占用较短的时间,或者占用较小存储容量的场合
  2. 程序与计算机硬件密切相关,程序直接控制硬件的场合。
  3. 没有合适的高级语言场合。

进位计数制与不同基数的数之间的转换

一、r进位计数制

进位计数制是一种计数的方法。常见的是十进制,但它不是唯一的。计时用时、分、秒就是按60进制计数的。
通常,一个基数为r的r进制数的值可以表示为:
在这里插入图片描述
在这里插入图片描述

123.45
可以表示为:1*10的二次方+2*10的一次方+3*10的0次方+4*10的-1次方+5*10的-2次方

计算机中为便于存储及计算的物理实现,采用了二进制数。二进制数的基数为2,只有0,1两个数码,并遵循逢2进1的规则。
在这里插入图片描述
n位二进制数可以表示2的n次方个数
在这里插入图片描述
在这里插入图片描述

进制的转换

二进制和十进制之间的转换

二进制转换为十进制数

各位二进制数码乘以与其相对应的权之和即为与该二进制数对应的十进制数
在这里插入图片描述

十进制转换为二进制数

两种比较简单的方法:

降幂法:

在这里插入图片描述
在这里插入图片描述
除法:
把要转换的十进制数的整数部分不断除以2,并记下余数,直到商为0为止。
在这里插入图片描述
在这里插入图片描述
对于被转换的十进制数的小数部分则应不断乘以2,并记下其整数部分,直到结果的小数部分为0为止。
在这里插入图片描述

十六进制和二进制之间的转换

二进制转换成十六进制

把二进制数从低位到高位每4位组成一组,直接用十六进制数来表示即可。
在这里插入图片描述

把十六进制数中每一位用4位二进制数来表示,即可得到相应的二进制数

在这里插入图片描述

十六进制和十进制之间的转换

十六进制数转换成十进制数

各位十六进制数与其对应权值的乘积之和即为相应的十进制数。
在这里插入图片描述

十进制数转换成十六进制

在这里插入图片描述

计算机中数和字符的表示

原码

最高位表示符号(正数用0,负数用1),其他位表示数值位,称为有符号数的原码表示法
在这里插入图片描述

反码

正数的反码与原码相同,符号位用0表示,数值位值不变。负数的反码符号位用1表示,数值位为原码数值位按位取反形成,即0变1,1变0。
在这里插入图片描述

补码

正数的补码与原码相同,即符号位用0表示,数值位值不变。负数的补码为反码加1形成。
在这里插入图片描述

符号扩展问题

对于用补码表示的数,正数的符号扩展应该在前面补0,而负数的符号扩展则应该在前面补1。
在这里插入图片描述

补码的加法和减法

在这里插入图片描述

无符号整数

在某些情况下,要处理的数全是正数,此时无需保留符号位。可以把最高有效位也作为无符号数处理,这样的数称为无符号整数,
在这里插入图片描述
计算机中最常用的无符号整数是表示地址的数。此外,双精度数的低位字也是无符号整数。

IBM PC机采用目前最常用的美国信息交换标准代码ASCII来表示。这种代码用一个字节来表示一个字符,其中低7位为字符的ASCII值,最高位一般用作校验位。

几种基本的逻辑运算

“与”运算

又称逻辑乘,可用符号·^来表示。
如有A、B两个逻辑变量(取值为“0”或“1”),可能有4种取值情况:
在这里插入图片描述
应用:

  1. 清零。相应的位设为0即可。
  2. 取指定位(如低位字节)。则相应位设为1,其余位为0即可。

“或”运算

又称逻辑加,可以用符号+V来表示。
应用:对特定位强行置1。
在这里插入图片描述

“非”运算

在这里插入图片描述
“非”运算的结果相当于取反。

“异或”运算

在这里插入图片描述
在这里插入图片描述
应用:

  1. 取指定位。相应的位设为0即可。
  2. 使指定位翻转。则相应位设为1,其余为设置为0即可。

在这里插入图片描述


80x86计算机组织

80x86微处理器

在这里插入图片描述
在这里插入图片描述
外部数据总线宽度:芯片内外交换数据的宽度。
地址总线宽度:专用于传送地址的总线宽度。

80x86寄存器

三类:通用寄存器、专用寄存器、段寄存器

通用寄存器

数据寄存器:AX、BX、CX、DX

AX、BX、CX、DX四个通用寄存器,用来暂时存放计算过程中所用到的操作数、结果等。它们都可以以字(16位)的形式访问,也可以以字节(8位)的形式访问。

AX(Accumulator)作为累加器用,是算术运算的主要寄存器。另外,所有的I/O指令都使用它与外部设备传送信息。

BX(Base)可以作为通用寄存器,此外在计算存储器地址时,它经常用作基址寄存器

CX(Count)可以作为通用寄存器,此外在循环(Loop)和串处理指令中用作隐含的计数器。

DX(Data)可以作为通用寄存器。在作双字长运算时用来存放高位字。对某些I/O操作,DX可用来存放I/O的端口地址。

指针及变址寄存器:SP、BP、SI、DI

SP、BP、SI、DI四个16位寄存器可以像数据寄存器一样在运算过程中存放操作数,但它们只能以字为单位使用。更经常的用途是在段内寻址时提供偏移地址。

SP(Stackc Pointer)称为堆栈指针寄存器BP(Base Pointer)称为基址指针寄存器。它们都可以与SS寄存器联用来确定堆栈段中的某一存储单元的地址。SP用来指示栈顶的偏移地址,BP可作为堆栈区中的一个基地址以便访问堆栈中的其他信息。

SI(Source Index)源变址寄存器DI(Destination Index)目的变址寄存器。一般与DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能。在串处理指令中,SIDI作为隐含的源变址寄存器,此时SIDS联用,DIES联用,分别达到在数据段和附加段中寻址的目的。
在这里插入图片描述
其专用特性与16位8个通用寄存器是一一对应的。但它们既可以存放数据,又可以存放地址。

专用寄存器

包括IP、SP和PSW三个16位寄存器。
在这里插入图片描述
SP为堆栈指针寄存器,与堆栈段寄存器联用来确定堆栈段中栈顶的地址,用来指示栈顶的偏移地址。
PSW(Program Status Word)程序状态字寄存器。由条件码标志(flag)、控制标志和系统标志构成。
在这里插入图片描述

条件码标志

用来记录程序中运行结果的状态信息。由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以称为条件码
OF(Overflow Flag)溢出标志:在运行过程中,如操作数超过了机器能表示的范围则称为溢出。此时OF位置1,否则置0。

SF(Sign Flag)符号标志,运算结果的符号为负置1,否则置0。

ZF(Zero Flag)零标志,运算结果为0时置1,否则置0。

CF(Carry Flag)进位标志,记录运算时从最高有效位产生的进位值。最高有效位有进位时置1,否则置0。

AF(Auxiliary Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位值。第3位有进位时置1,否则置0。

PF(Parity Flag)奇偶标志,为机器中传送信息时可能产生的代码出错情况提供检验条件。结果操作数中1的个数为偶数时置1,否则置0。

控制标志位

DF(Direction Flag)方向标志,在串处理指令中控制处理信息的方向用。当DF位为1时,每次操作后使变址寄存器SI和DI减量,这样就使串处理从高地址向低地址方向处理。当DF为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理。

系统标志位

IF(Interrupt Flag)中断标志,当IF为1时,允许中断,否则关闭中断。

TF(Trap Flag)陷阱标志,用于单步方式操作。当TF位为1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF位为0时,CPU正常工作不产生陷阱。

在调试程序DEBUG中提供了测试标志位的手段,它用符号表示标志位的值。
在这里插入图片描述
在这里插入图片描述

段寄存器

四个专门存放地址的寄存器:
代码段CS(Code Segment):存放当前正在运行的程序。

数据段DS(Data Segment):存放当前运行程序所用的数据,如果程序中使用了串处理指令,则其源操作数也存放在数据段中。

堆栈段SS(Stack Segment):定义了堆栈的所在区域。堆栈是一种数据结构,它开辟了一个比较特殊存储区,并以后进先出的方式来访问这一区域。

附加段ES(Extra Segment):是附加的数据段,它是一个辅助的数据区,也是串处理指令得到目的操作数存放区。

注:除非专门指定,一般情况下,各段在存储器中的分配是由操作系统负责的。每个段独立地占用64k存储区。

存储器

存储单元的地址和内容

存储信息的基本单位是二进制位,一位可存储一个二进制数:0或1。每8位组成一个字节。

16位机器字长,由2个字节组成,位编号如下:
在这里插入图片描述
16位机器字长,可以表示2(16)个字节单元的地址,范围是0~65535。在讨论存储器容器时以2(10)=1024为基本单位,称其为1K。65535个字节单元的存储容量就是54K,其地址编号范围用十六进制数表示为0 ~ FFFFH。
在这里插入图片描述在这里插入图片描述
注:存储器的内容是取之不尽的。从某个单元取出其内容后,该单元仍然保存着原来的内容不变,可以重复取出,只有存入新的信息后,原来保存的内容才自动消失。

存储器地址的分段

已知16位字长的机器可以访问的最大存储空间为64k,而IBM PC机的最大存储容量为1M字节。由于
2(20) = 1048576 = 1024K = 1M
所以要访问1M字节空间的存储器必须有20位地址,用16进制数表示1M字节的地址范围应为00000 ~ FFFFF。

在16位字长的机器采用存储器地址分段的办法来表示20位地址。
在这里插入图片描述
在这里插入图片描述
前4位从0 ~ F有分别有16种情况,即:
16 * 16 * 16 * 16 = 16(4) = 2(16) = 64K

在1M字节的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址

CPU访问存储器时,必须先确定所要访问的存储单元的物理地址。

20位物理地址由16位段地址和16位偏移地址组成,段地址是指每一段的起始地址,其低4位一定是0,于是就可以规定段地址只取段起始地址的高16位值。偏移地址则是指在段内相对于段起始地址的偏移值。

物理地址的计算方法

把段地址左移4位再加上偏移地址值就形成物理地址。

16d * 段地址 + 偏移地址 = 物理地址

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

外部设备

计算机运行时的程序和数据都要通过输入设备送入机器,程序运行的结果要通过输出设备送给用户,所以输入、输出设备是计算机必不可少的组成部分。大容量的外存储器(如磁盘)能存储大量信息,也是现代计算机不可缺少的一部分。

外部设备与主机(CPU和存储器)的通信是通过外设接口进行的。每个接口包括一组寄存器。一般来说,有三种不同的用途:

各种外设都有三种以上类型的寄存器,只是每个接口所配备的寄存器数量是根据需要确定的。例如:工作方式较简单、速度又慢的键盘只有一个8位的数据寄存器,并把状态和命令寄存器合为一个控制寄存器。又如工作速度快、工作方式又比较复杂的磁盘则需要多个数据、状态和命令寄存器。


80X86的寻址方式和指令系统

计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集提供给用户使用,这组指令集就称为计算机的指令系统

计算机的指令由操作码字段操作数字段两部分组成。操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数。例如:加法指令除了需要指定作加法操作外,还需要提供加数和被加数。操作数字段可以是操作数本身,也可以是操作数地址或是地址的一部分,还可以是指向操作数的指针或其他有关操作数的信息。

操作数字段可以有一个、二个或三个,通常称为一地址、二地址或三地址指令
例如:单操作数指令就是一地址指令,它只需要指定一个操作数,如加1指令只需要指出需要加1的操作数。
大多数运算型指令都是双操作数指令。有的机器使用三地址指令:除给出参加运算的两个操作数外,还指出运算结果的存放地址

近代多数机器则使用二地址指令,分别称两个操作数为源操作数目的操作数。尽管在指令执行前这两个操作数都是输入操作数,但指令执行后将把运算结果存放到目的操作数的地址之中,经过运算后,参加运算的一个操作数将会丢失,如果以后的运算中还会用到这个操作数,则应在运算之前将它提前存储起来。

在这里插入图片描述
计算机只能识别二进制代码,所以机器指令是由二进制代码组成的。为便于人们使用汇编语言来编写程序。汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器指令是一一对应的

80X86寻址方式

与数据有关的寻址方式

立即寻址方式

操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。立即数可以是8位或16位,386及其后机型则可以是8位或32位。高位字在高地址,低位字在低地址中。
立即寻址方式用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段

MOV AX,3566H

在这里插入图片描述

寄存器寻址方式

操作数在寄存器中,指令指定寄存器号。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。对于32位操作数,寄存器可以是EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度

MOV AX, BX	;16位
MOV ECX, EDX	;32位

在这里插入图片描述

有效地址EA

有效地址的组成部分

EA = 基址 + ( 变址 x 比例因子 )+ 位移量

在这里插入图片描述

段跨越前缀

默认段选择规则

访问类型所用段及段寄存器缺省选择规则
指令代码段CS寄存器用于取指令
堆栈堆栈段SS寄存器所有的堆栈的进栈和出栈任何用ESPEBP作为基址寄存器的访存
局部数据数据段DS寄存器除相对于堆栈以及串处理指令的目的串以外的所有数据访问
目的串附加数据段ES寄存器串处理指令的目的串

80x86允许段跨越前缀来改变系统所指定的默认段。但必须遵照下列规则:

  1. 串处理指令的目的串必须用ES段;
  2. PUSH指令的目的和POP指令的源必须用SS段;
  3. 指令必须存放在CS段中。

直接寻址方式

在直接寻址方式中有效地址EA就在指令中,它存放的在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须先求出操作段的物理地址,然后再访问存储器才能取得操作数。
如操作数在数据段中,则

物理地址 = 16d x (DS)+ EA

数据存放在数据段以外的其他段中时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。

MOV AX, [2000H]
;[]表示里面是一个有效地址(偏移地址)

在这里插入图片描述
在汇编语言指令中,可以用符号地址代替数值地址。

MOV AX, VALUE	;VALUE存放操作数单元的符号地址
MOV AX, [VALUE]	;等价

如VALUE在附加段中,则应指定段跨越前缀如下:

MOV AX, ES: VALUE
或	MOV AX, ES: [VALUE]
MOV EAX, DATA
;指令中的DATA为符号地址,
其中存放着32位操作数,
故目的操作数也应使用32位寄存器

直接寻址方式适用于处理单个变量,例如要处理某个存放在存储器里的变量,可用直接寻址方式把该变量先取到一个寄存器中,然后再作进一步处理。
80x86中为了使指令字不要过长,规定双操作数指令除立即方式外必须有一个操作数使用寄存器方式,这就是一个变量常常先要送到寄存器去的原因

寄存器间接寻址方式

操作数的有效地址在基址寄存器或变址寄存器中,而操作数则在存储器中。
16位机:BX与BP,SI与DI
32位机:EAX,EBX,ECX,EDX,ESP,EBP,ESI与EDI(变址寄存器把ESP排除掉)
在这里插入图片描述

MOV AX, [BX]
MMOV ECX, [EDX]	;该指令将数据段中有效地址存放在EDX寄存器中的32位操作数传送到ECX寄存器中。

在这里插入图片描述
指令中也可以指定段跨越前缀来取得其他段中的数据。

MOV AX, ES: [BX]

寄存器相对寻址方式

或称为直接变址寻址方式
操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的位移量之和。
它所允许使用的寄存器及其对应的默认段情况同寄存器间接寻址方式。
在这里插入图片描述

MOV AX, COUNT [SI]

在这里插入图片描述
这种寻址方式同样可用于表格处理,表格的首地址可设置为COUNT,利用修改基址或变址寄存器的内容来取得表格中的值。
寄存器相对寻址方式也可以使用段跨越前缀。
如:

MOV DL, ES: STRING [SI]

基址变址寻址方式

操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指令指定。

MOV AX, [BX][DI]

在这里插入图片描述
这种寻址方式适用于数组或表格处理。首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器都可以修改,所以它比直接变址方式更加灵活。
该种寻址方式使用段跨越前缀时的格式为:

MOV AX, ES:[BX][SI]

相对基址变址寻址方式

操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和指令中指定的位移量之和。

MOV AX, MASK[BX][SI]

在这里插入图片描述
在这里插入图片描述
类似的,32位相对基址变址寻址方式:

MOV EAX, ARRAY[EBX][ECX]

这种寻址方式通常用于对二维数组的寻址,如存储器中放着由多个记录组成的文件,则位移量可指向文件之首(数组名),基址寄存器指向某个记录(行),变址寄存器指向该记录中的一个元素(列)。

这种寻址方式为堆栈处理提供了方便。一般(BP)可指向栈顶,从栈顶到数组的首地址可用位移量表示,变址寄存器可用来访问数组中的某个元素。

标签:汇编,操作数,IBM,变址,PC,地址,寻址,指令,寄存器
来源: https://blog.csdn.net/qq_53179277/article/details/120821448