计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。
用机器语言编写的程序是计算机唯一
能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序。
为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。
汇编语言是一种用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。
如:
ADD CL,BH MOV AL,5
汇编源程序
。汇编语言源程序
要翻译成机器语言程序
才可以由计算机执行。这个翻译过程称为“汇编
”,这种把汇编源程序翻译成机器语言程序的语言加工程序称为汇编程序
。高级程序设计语言
。高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。汇编语言的特点
汇编语言的主要应用场合
进位计数制是一种计数的方法。常见的是十进制,但它不是唯一的。计时用时、分、秒就是按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种取值情况:
应用:
“或”运算
又称逻辑加,可以用符号+
或V
来表示。
应用:对特定位强行置1。
“非”运算
“非”运算的结果相当于取反。
“异或”运算
应用:
外部数据总线宽度:芯片内外交换数据的宽度。
地址总线宽度:专用于传送地址的总线宽度。
三类:通用寄存器、专用寄存器、段寄存器
数据寄存器: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四个16位寄存器可以像数据寄存器一样在运算过程中存放操作数,但它们只能以字为单位使用。更经常的用途是在段内寻址时提供偏移地址。
SP(Stackc Pointer)称为堆栈指针寄存器
,BP(Base Pointer)称为基址指针寄存器
。它们都可以与SS寄存器联用来确定堆栈段中的某一存储单元的地址。SP用来指示栈顶的偏移地址,BP可作为堆栈区中的一个基地址以便访问堆栈中的其他信息。
SI(Source Index)源变址寄存器
,DI(Destination Index)目的变址寄存器
。一般与DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能。在串处理指令中,SI和DI作为隐含的源变址寄存器,此时SI和DS联用,DI和ES联用,分别达到在数据段和附加段中寻址的目的。
其专用特性与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 * 段地址 + 偏移地址 = 物理地址
如果程序中的四个段都在64K的范围内,而且程序运行时所需要的信息都在本程序所定义的段区之内,那么程序员只要在程序的首部设定各段寄存器的值就可以了。
如果程序的某一段在程序运行过程中会超过64K空间,或者程序中可能访问除本身四个段之外的其他段区的信息,那么程序中必须动态地修改寄存器的内容,以保证所获得的信息的正确性。即段区的划分不会限制程序的空间。
计算机运行时的程序和数据都要通过输入设备送入机器,程序运行的结果要通过输出设备送给用户,所以输入、输出设备是计算机必不可少的组成部分。大容量的外存储器(如磁盘)能存储大量信息,也是现代计算机不可缺少的一部分。
外部设备与主机(CPU和存储器)的通信是通过外设接口进行的。每个接口包括一组寄存器。一般来说,有三种不同的用途:
数据寄存器
:存放要在外设和主机之间传送的数据,实际上起缓冲器的作用。状态寄存器
:保存外部设备或接口的状态信息,以便CPU在必要时测试外设状态,了解其工作情况。例如:每个设备都有忙闲位来标志设备当前是否正在工作,是否有空接受CPU给予的新任务等。命令寄存器
:把外设或接口的控制命令送给外部设备。例如:CPU要启动磁盘工作,必须发出启动命令。各种外设都有三种以上类型的寄存器,只是每个接口所配备的寄存器数量是根据需要确定的。例如:工作方式较简单、速度又慢的键盘只有一个8位的数据寄存器,并把状态和命令寄存器合为一个控制寄存器。又如工作速度快、工作方式又比较复杂的磁盘则需要多个数据、状态和命令寄存器。
为使主机访问外设方便起见,外设中的每个寄存器给予一个端口(Port)地址(又称端口号),这样就组成了一个独立于内存储器的I/O地址空间。
IBM PC机的I/O地址空间可达64K,所以端口地址范围是0000 ~ FFFFH,用16位二进制代码来表示。
主机与外设交换信息是通过输入、输出指令来完成的。主机与外设的信息传送方式可有直接
、查询
、中断
、成组传送
等。实际上,对外设的管理及信息传送
是汇编最经常使用的场合,也是最复杂的一部分程序。
为了便于用户使用外设,IBM PC机提供了两种类型的例行程序供用户调用。一种是BIOS
,另一种是DOS
功能调用。它们都是系统编制的子程序,通过中断方式转入所需要的子程序去执行,执行之后返回原来的程序继续执行。这些例行程序有的完成一次简单的外设信息传送,如从键盘输入一个字符,或送一个字符至显示器等;也有的完成相当复杂的一次外设操作,如从磁盘读写一个文件等。
操作系统把一些复杂的外设操作编成例行程序,使用户用简单的中断指令(INT)
就可以进入这些例行程序,完成所需要的外设操作,所以用户应尽量利用这些系统所提供的工具来编写自己的程序。
BIOS和DOS功能调用虽然都是系统提供的例行程序,但是它们之间又有差别:
BIOS
存放在机器的只读存储器ROM中,所以可以把它看成是机器硬件的一个组成部分,他的层次比DOS更低,更接近硬件,因此它的语句要完成每一个对设备的直接命令,或信息传送。计算机是通过
执行指令序列
来解决问题的,因而每种计算机都有一组指令集提供给用户使用,这组指令集就称为计算机的指令系统
。
计算机的指令由操作码字段
和操作数字段
两部分组成。操作码字段指示计算机所要执行的操作,而操作数字段则指出在指令执行操作的过程中所需要的操作数。例如:加法指令除了需要指定作加法操作外,还需要提供加数和被加数。操作数字段可以是操作数本身,也可以是操作数地址或是地址的一部分,还可以是指向操作数的指针或其他有关操作数的信息。
操作数字段可以有一个、二个或三个,通常称为一地址、二地址或三地址指令。
例如:单操作数指令就是一地址指令,它只需要指定一个操作数
,如加1指令只需要指出需要加1的操作数。
大多数运算型指令都是双操作数指令。有的机器使用三地址指令:除给出参加运算的两个操作数外,还指出运算结果的存放地址
。
近代多数机器则使用二地址指令,分别称两个操作数为源操作数
和目的操作数
。尽管在指令执行前这两个操作数都是输入操作数,但指令执行后将把运算结果存放到目的操作数的地址之中,经过运算后,参加运算的一个操作数将会丢失,如果以后的运算中还会用到这个操作数,则应在运算之前将它提前存储起来。
计算机只能识别二进制代码,所以机器指令是由二进制代码组成的。为便于人们使用汇编语言来编写程序。汇编语言
是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器指令是一一对应的
。
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数
。立即数可以是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
;有效地址的组成部分
EA = 基址 + ( 变址 x 比例因子 )+ 位移量
段跨越前缀
默认段选择规则
访问类型 | 所用段及段寄存器 | 缺省选择规则 |
---|---|---|
指令 | 代码段CS 寄存器 | 用于取指令 |
堆栈 | 堆栈段SS 寄存器 | 所有的堆栈的进栈和出栈任何用ESP和EBP作为基址寄存器的访存 |
局部数据 | 数据段DS 寄存器 | 除相对于堆栈以及串处理指令的目的串以外的所有数据访问 |
目的串 | 附加数据段ES 寄存器 | 串处理指令的目的串 |
80x86允许段跨越前缀来改变系统所指定的默认段。但必须遵照下列规则:
在直接寻址方式中有效地址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)可指向栈顶,从栈顶到数组的首地址可用位移量表示,变址寄存器可用来访问数组中的某个元素。