2 寻址方式与汇编语言程序的组织
2.1 汇编语言
2.11 机器语言
-CPU能直接识别并遵照执行的指令称为机器指令。
-机器指令一般由操作码和操作数两部分构成,操作码在前,操作数在后。
-操作码指出要进行的操作或运算,如加、减、传送等。
-操作数指出参与操作或运算的对象,也指出操作或运算结果存放的位置,如CPU的寄存器、存储单元和数据等。
-机器语言是CPU能直接识别的唯一语言。
-有如下缺点:不能用人们熟悉的形式来描述计算机要执行的任务;编写程序是十分困难,易出错;有错,难发现,即调试困难。
2.12 汇编语言
-汇编语言是为了克服机器语言的缺点而产生的。
-为了克服机器语言的缺点,采用便于记忆和描述指令功能的符号来表示指令的操作码。
-用指令助记符、地址符号等符号表示的指令称为汇编格式指令。
-汇编语言是汇编格式指令、伪指令的集合及其表示、使用这些指令的一组规则。
2.2 寻址方式
-计算机指令是由操作码字段和操作数地址码字段两部分组成的,操作码字段指示计算机要执行的操作,操作数地址码字段则指出在指令执行操作的过程中所需要操作数的地址。
例:将BX寄存器中的数据传送到AX寄存器中去的指令为:
MOV AX BX
操作码 目的操作数 源操作数
地址码 地址码
-操作数地址码字段除使用立即数外,给出的是操作数的存放地址,如内存单元地址或寄存器或I/O地址。
2.2.1 数据寻找方式
立即寻址
-指令中的操作数为常数,则存储时紧跟在操作码之后,作为指令的一部分存在代码段里,这种操作数称为立即数。
MOV AL ,05H ;执行后(AL)=05H
MOV AX ,1234H ;执行后(AX)=1234H
-分号表示对指令的注释。
-字节的存放按照“高高低低”原则,高位字节存放在高地址中,地位字节存放在地址中。
-立即数寻找方式用于给寄存器或存储单元赋初值,只能用于源操作数字段,不能用于目的操作数数字段。
寄存器寻址
-操作数在CPU内部的寄存器中,指令中指定寄存器名,寄存器可以是8位、16位或32位的。
MOV AX ,01E0H ;(AX)<—01E0H
-指令中源操作耍是立即寻址,目的操作数是寄存器寻址。
MOV AX , BX ;(AX)<—(BX)
-指令中源操作数和目的操作数都是寄存器寻址。这钟情况下,两个寄存器的长度必须一样。
-这种寻址方式的指令执行速度最快,是由于操作数在CPU内部的寄存器中,不需要通过访问存储器来取得操作数。
直接寻址
-操作数的偏移地址称为有效地址EA(Effictive Address)
-有效地址EA在指令中直接给出,它存放在代码段中指令操作码之后,但操作数一般存放在数据段(DS)中,所以必须先求出操作数的物理地址,然后在访问存储器才能取得操作数。
例如:
MOV AX,[1200H]
-指令中直接给出了源操作数存放在数据段中,有效地址EA=1200H,设DS=2000H,则物理地址为:
PA=(DS)*10H+EA=20000H+1200H=21200H
-可以用符号地址代替数值地址,如:
MOV AX,VALUE
-若要指定段时,要指定段跨越前缀、如:
MOV AX,ES:VALUE
寄存器间接寻址
操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在存储器中。
-书写格式是寄存器加上方括号,例如:
MOV AX ,[SI]
-指令的功能是数据段中以SI寄存器的内容为偏移地址的字存储单元(即SI指向的存储单元)内容传送给AX寄存器。
操作数的物理地址为:
PA=10H(DS)+(BX)
PA=10H(DS)+(SI)
PA=10H(DS)+(DI)
PA=10H(SS)+(BP)
寄存器相对寻址
-操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位的位移量之和。即:
EA=(寄存器)+位移量
-在实模式下,除有段跨越前缀者外,对于寄存器为BX、SI、DI的情况,段寄存器用DS,而寄存器用BP,则使用SS段寄存器的内容作为段地址。
物理地址=10H(DS)+(BX)或(DI)或(SI)+8或16位位移量
或
物理地址=10H(SS)+(BP)
-书写格式如:
MOV AX,COUNT[BX]
其中,COUNT可以是符号地址,也可以是常数。
基址加变址寻址
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。
物理地址=10H(DS)+(BX)+(DI)或(SI)
或
物理地址=10H(SS)+(BP)+(DI)或(SI)
-书写格式如:
MOV AX,[BX][SI]
相对基址加变址寻址
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。
物理地址=10H(DS)+(BX)+(DI)或(SI)+8或16位位移量
或
物理地址=10H(SS)+(BP)+(DI)或(SI)+8或16位位移量
-书写格式如:
MOV AX,ARRAY[BX][SI]
比例变址寻址
比例变址是指一对寄存器中的第二用比例因子2、4或8来乘,产生操作数的内存地址。
例如:
MOV EDX,[EAX+4*EBX]
-指令将由EAX加上4倍EBX寻址的数据段存储单元的内容装入EDX。
2.2.2程序存储器寻址
直接(程序存储器)寻址跨段直接寻址
转换的段地址和偏移地址是直接由指令提供的。
操作:
(CS) = FAR_LABEL的段地址
(IP) = FAR_LABEL的偏移地址
例子:
JMP FAR PTR FAR_LABEL
FAR_LABEL 是远标号, 代表目标地址。
相对(程序存储器)寻址 移位相对IP。
操作:
(IP) = (IP)+ 8 位位移(短转换)
(IP) = (IP)+ 16 位位移(近转换)
JMP SHORT LABEL8 ;短转换
JMP NEAR PTR LABEL16 ;近转换
JMP $+ shift
;LABEL8 是8位移位,LABEL16i是16位移位
间接(程序存储器)寻址段内间接寻址
要转移去的目的的偏移地址,存储在任何16位寄存器或者内存单元中
有两种类型的(程序存储器)间接寻址方式
**寄存器间接寻址 **
内存间接寻址
堆栈寻址
CALL 指令保存程序的返回地址,
RET (return) 指令从堆栈中取出返回地址。
在实模式下,
SP常常指向最后入栈的元素。
实模式下, 栈结尾的物理地址:
** PA = (SS)10H+(SP)*
例(a) :
PUSH BX
操作:
(SP)=(SP)-2
((SP)+1)=(BH)
((SP))=(BL)
例(b) :
POP CX
操作:
(CL)=((SP))
(CH)=((SP)+1)
(SP)=(SP)+2
SP常常指向下一个即将要出栈的元素.
PA= (SS)*10H+(SP)