第二章80X86指令系统1
汇编80X86伪指令系统
80X86伪指令系统一.伪指令概述构成汇编语言程序的语句可以分为三种:指令性语句(指令语句)、指示性语句(伪指令语句)和指令语句(宏调用语句)。
指令语句,又称可执行语句,表示计算机具有的一个基本能力。
比如数据传送,数据相加、相减等。
伪指令语句,又称命令语句,告诉汇编程序如何对程序进行汇编。
比如段定义、储存单元分配等。
一个汇编语言程序经汇编,连接和装入内存后,在执行程序之前:1.指示性语句的功能已经完成,故又称伪操作。
2.指令性语句的功能尚未完成,需控制CPU去执行,才能完成。
二、伪指令详解符号定义语句1.等值语句格式:符号名EQU 需等值的表达式功能:用符号名等值指定的表达式;其中表达式可以是任何有效的操作数,汇编时用语句中的表达式代替程序中符号所在的地方。
说明:▲可用于定义符号常量,方便修改程序。
▲某表达式多次出现时,用等值伪操作可以方便编程。
▲等值语句表达式的种类(1)常数或数值表达式COUNT EQU 10NUM EQU 89*3+5-9(2)地址表达式ADD1 EQU V AR2+10H(3)变量或标号CON EQU V AR▲在EQU语句右边出现的标号需在EQU语句以前进行定义。
2.等号语句格式:符号=需等值的表达式功能:把等号“=”右边表达式的值或符号赋给等号“=”左边的符号。
表达式可以是任何有效的操作数。
说明:EQU语句与“=”的区别:在同一源程序中,EQU语句定义的符号不能被重新赋值或者说不能被重新定义,同一符号只能定义一次,符号的数值不能被改变。
“=”定义的符号可以被重新赋值,同一符号的数值在同一个程序中可以改变。
数据定义语句格式:变量名类型助记符操作数[ ,操作数, ……]功能:用于在内存中为常数、初始数据或者变量分配储存单元。
说明:(1)变量名指示内存操作数所占用的内存单元地址(符号地址),在程序中,可以通过变量,名对内存单元进行访问。
变量名为用户自定义标识符,表示初值表首元素的逻辑地址。
80x86的指令系统
80x86的指令系统1.1.1数据传送指令:负责把数据、地址或立即数传送到寄存器或存储单元中。
1.通用数据传送指令(1).MOV——传送指令指令格式:MOV DST,SRC ;(DST)←(SRC)。
DST表示目的操作数, SRC表示源操作数说明:①.DST为除CS外的各寄存器寻址方式或任意存储器寻址方式。
SRC为任意数据寻址方式。
②.DST、SRC不能同时为存储器寻址方式,也不能同时为段寄存器寻址方式,而且在DST为段寄存器时,SRC不能为立即数。
③.MOV指令不影响标志位。
(2).MOVSX——带符号扩展传送指令(386及其后继机型可用)指令格式:MOVSX DST,SRC ;(DST)←符号扩展(SRC)说明:①.DST必须为16位或32位寄存器。
SRC为8位或16位的寄存器或存储单元的内容。
传送时把源操作数符号扩展送入目的寄存器。
②.MOVSX指令不影响标志位。
(3).MOVZX——带零扩展传送指令(386及其后继机型可用)指令格式:MOVZX DST,SRC ;(DST)←零扩展(SRC)说明:①.DST必须为16位或32位寄存器。
SRC为8位或16位的寄存器或存储单元的内容。
传送时把源操作数零扩展送入目的寄存器。
②.MOVZX指令不影响标志位。
(4).PUSH——进栈指令指令格式:PUSH SRC ;16位指令:(SP)←(SP) –2 ((SP)+1,(SP))←(SRC)32位指令:(ESP)←(ESP) –4 ((ESP)+3, (ESP)+2, (ESP)+1,(ESP))←(SRC)说明:①.堆栈:计算机开辟的以“后进先出”方式工作的存储区。
它必须存在于堆栈段中,只有一个出入口,所以只有一个堆栈指针SP或ESP。
SP或ESP的内容在任何时候都指向当前的栈顶。
②.8086中的SRC不能为立即数寻址方式。
286及其后继机型可用立即数寻址方式。
③.PUSH指令不影响标志位。
(5).POP——出栈指令指令格式:POP DST ;16位指令:(DST)←((SP)+1,(SP)) (SP)←(SP)+232位指令:(DST)←((ESP)+3, (ESP)+2, (ESP)+1, (ESP)) (ESP)←(ESP)+4说明:①.DST为除立即数及CS寄存器以外的任意数据寻址方式。
80x86指令系统
七、80x86指令系统(一)8086指令系统8086/8088指令系统是整个80x86系列微处理器的基础,按功能可以分为六种类型。
1.传送指令传送指令用于在存储单元、寄存器、输入/输出端口之间传送地址或数据。
①通用数据传送指令MOV指令:该指令可以将一个立即数传送到寄存器或存储单元中,也可以在寄存器与寄存器之间、寄存器与存储器之间传送字数据或字节数据。
例如:将一个立即数传送到寄存器中的指令MOV AL,05H;在两个寄存器之间传送字节数据的指令MOV AL,BL;在寄存器和存储器之间传送数据的指令MOV SI,[BX+5AH]。
XCHG指令:该指令可以将源操作数和目的操作数进行交换,但操作数可以是寄存器或存储单元,不能是段寄存器或立即数,也不能同时为两个存储器操作数。
PUSH指令:PUSH指令是对一个16位操作数执行进栈操作,这是在一个操作数和堆栈之间进行数据传送,而不是在两个操作数之间进行数据传送。
POP指令:POP指令是将一个16位操作数执行出栈操作,这也是在一个操作数和堆栈之间进行数据传送。
XLAT指令:该指令专门用于在AL寄存器与字节表中某一存储单元之间进行数据传送。
其中字节表的首地址存放在BX基址寄存器中,根据AL设置的偏移地址,可以将该单元的内容传送到AL累加寄存器中。
②输入/输出指令该指令专门用于在累加器和I/O端口之间进行数据传送操作。
输入/输出的工作原理:CPU使用AL或AX寄存器接收数据或发送数据,最多可提供64K个8位端口地址,或32K个16位端口地址。
当端口地址小于256时使用直接寻址来获得操作数,即在指令中直接指定端口地址;当端口地址超过256时使用间接寻址来获得操作数,即先将端口地址放到DX寄存器中,然后利用IN指令或OUT指令进行输入/输出操作。
例如:IN AX,28H是从I/O端口28H输入一个字到AX寄存器中;OUT 5,AL是从AL寄存器输出一个字节到I/O端口5中。
汇编语言第2章80x86计算机组织
控制标志位
• 控制标志位 :DF 方向标志,用于串处理指令处理
▪ DF位为1时,每次操作后使变址寄存器SI和 DI减量,使串处理从高地址向低地址方向处 理:
▪ 当DF位为0时,则使SI和DI增量,使串处理 从低地址向高地址方向处理:
系统标志位
• IF:中断标志。 当IF=1时,允许中断; IF=0时关闭中断
数据的宽度 • 地址总线宽度:用以确定可访问的存储器的最
大范围
地址总线宽度
• 10位:210=1024单元,1K • 20位:220=1024* 210单元=1024K,1M • 24位:224=16*1M,16M • 30位:230=1024M,1G • 32位:232=4G,即4GB
二、一些名词术语(2)
• TF:陷井标志(跟踪标志)。用于单步方式操作 • IOPL:I/O特权级。控制对I/O地址空间访问
段寄存器
• 8086/8088、80286:四个段寄存器 ▪ 代码段CS,数据段DS,堆栈段SS,附加段ES
• 80386及后继机型:六个段寄存器 ▪ 代码段CS,数据段DS,堆栈段SS,附加段ES、 FS、GS---都是16位
• ZF:零标志。运算结果为0,置1;否则置0。 • CF:进位标志。记录从最高有效位产生的进位值。
最高有效位有进位时置1,否则置0。 • AF:辅助进位标志。记录运算时第3位产生的进位
值。如第3位有进位时置1,否则置0。 • PF:奇偶标志。当结果操作数中1的个数为偶数时置
1,否则置0。
标志符号 举例
段中的某一存储单元的地址 4. SI、DI一般与DS联用:
在串处理指令中,SI和DS联用,DI和ES联用
8086系统的堆栈
• 是存储器中的特殊区域 – 在堆栈段内,“FILO” – SP始终指向栈顶,总是字操作,指示栈顶的 偏移地址; – BP可作为堆栈区中的一个基地址以便访问 堆栈中的其他信息
80x86微机原理参考答案
80x86微机原理参考答案第一章计算机基础(P32)1-1电子管,晶体管,中小规模集成电路、大规模、超大规模集成电路。
1-2把CPU和一组称为寄存器(Registers)的特殊存储器集成在一片大规模集成电路或超大规模集成电路封装之中,这个器件才被称为微处理器。
以微处理器为核心,配上由大规模集成电路制作的只读存储器(ROM)、读写存储器(RAM)、输入/输出、接口电路及系统总线等所组成的计算机,称为微型计算机。
微型计算机系统是微型计算机配置相应的系统软件,应用软件及外部设备等.1-3写出下列机器数的真值:(1)01101110 (2)10001101(3)01011001 (4)11001110答案:(1)+110 (2)-13(原码) -114(反码)-115(补码)(3)+89 (4)-78(原码)-49(反码)-50(补码)1-4写出下列二进制数的原码、反码和补码(设字长为8位):(1)+010111 (2)+101011(3)-101000 (4)-111111答案:(1)[x]原=00010111 [x]反= 00010111 [x]补= 00010111(2)[x]原=00101011 [x]反= 00101011 [x]补= 00101011(3)[x]原=10101000 [x]反= 11010111 [x]补= 11011000(4)[x]原=10111111 [x]反= 11000000 [x]补=110000011-5 当下列各二进制数分别代表原码,反码,和补码时,其等效的十进制数值为多少?(1)00001110 表示原码14,反码14,表示补码为14(2)11111111 表示原码-127,反码-0,表示补码为-1(3)10000000 表示原码-0,反码-127,表示补码为-128(4)10000001 表示原码-1,反码-126,表示补码为-1271-6 已知x1=+0010100,y1=+0100001,x2=-0010100,y2=-0100001,试计算下列各式。
用DEBUG熟悉Intel80x86指令(一)
用DEBUG熟悉Intel80x86指令(一) 一、数据传送指令以程序MOV.asm为例DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV CX,8000HMOV AL,DS:[100H]MOV AL,'E'MOV DS:[100H],ALLEA BX,[SI+100H]LDS SI,DS:[12H]LES DI,ES:[12H]MOV AX,DATASMOV DS,AXXCHG BX,[SI]XLATPUSH AXPUSH BXMOV AX,10HMOV BX,10HPOP BXPOP AXPUSHFPOPFLAHFSAHFMOV AH,4CHINT 21HCODES ENDSEND START1、MOV(传送)指令写法:MOV target,source功能描述:将源操作数source的值复制到target中去,source值不变。
MOV指令的机器语言有7种格式:(1)MOV mem/reg1,mem/reg2双操作数指令不允许两个操作数都使用存储器,因而两个操作数中必须有一个是寄存器。
这种方式不允许指定段寄存器。
(2)MOV reg,datareg指定寄存器,data为立即数。
这种方式也不允许指定段寄存器。
(3)MOV ac,memac为累加器。
(4)MOV mem,ac(5)MOV segreg,mem/regsegreg指定段寄存器,但不允许使用CS寄存器。
(6)MOV mem/reg,segreg(7)MOV mem/reg,dataMOV传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意,立即数不能直接送给段寄存器),从段寄存器到寄存器或存储单元。
80x86指令系统
imm32
— 32位立即数
imm — imm8/imm16/imm32
— 段寄存器CS/DS/SS/ES/FS/GS
mem8
mem16 mem32
— 8位内存操作数
— 16位内存操作数 — 32位内存操作数
(一)数据传送指令
1. MOV ( Move ):传送 一般形式:
MOV
dest, src
; dest = src。将源操作数src复制到目的
对标志位的影响:若8位×8位、16位×16位或32位×32位的结果分别能由8、 16或32位容纳(即结果的高一半为0),则CF = OF = 0,
否则,CF = OF = 1;其余标志无定义。
说明:由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果 为16位;同样,16位操作数相乘结果为32位,32位数相乘结果为64位。
[reg]
disp[reg] [base][index]
disp[base][index]
(二)32位CPU扩展的操作数形式
1.立即数: 32位立即数。 2.寄存器操作数: 32位通用寄存器。 3.内存操作数
包括下列几种形式。
说明:
base、index为任一32位通用寄 存器(index不能取ESP)。 n为比例因子,取1、2、4或8。 若包含base且base为EBP或ESP, 则隐含段地址在SS;否则,隐含 段地址在DS。 若在16位CPU上编程,则不能使 用这些寻址方式。
对标志位的影响:无。
(一)数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点:
堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底 指向同一内存单元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使 栈顶向低地址方向移动,而POP操作则刚好相反。 堆栈操作只能以字或双字为单位。 SS:SP指向栈顶。
80x86指令系统
标志寄存器的条件位:进位位(CF):最高位有进位(借位)时置1,否则0;奇偶位(PF): 操作结果低8位hamming重量为偶则置1,否则0;辅助进位位(AF): 计算中低4位有进位置1,否则0;零值位(ZF): 计算结果为零则置1,否则0;符号位(SF): 计算结果为负则置1,否则0;溢出位(OF): 计算结果超过补码能表示的范围为1,否则0;不同于CF!!方向标志位(DF):串操作中DF=0用+,DF=1用-;条件位的显示设置指令:CF:CLC 置CF=0;STC 置CF=1;CMC CF取反。
DF:CLD 置DF=0:STD 置DF=1。
IF:CLI 置IF=0:STI 置IF=1。
特别说明:所有指令未说明均不影响条件标志位。
1数据传送指令1.1通用数据传送指令(1) MOV 传送指令。
(2) MOVSX 带符号扩展传送,386后可用。
(3) MOVZX 带零扩展传送,386后可用。
(4) PUSH 进栈指令。
POP 出栈指令。
操作数必须以字或双字为单位(6) PUSHA/PUSHAD 所有通用寄存器进栈,进栈顺序是EAX, EBX, ECX, EDX,指令执行前的ESP, EBP, ESI, EDI。
POPA/PUSHAD 所有通用寄存器出栈,但是丢弃ESP而不装入当前的ESP中。
说明:PUSHA和POPA操作16位的寄存器,PUSHAD和POPAD操作32位。
(7) XCHG 交换指令。
1.2累加器(EAX)专用传送指令(1) IN 格式: IN EAX, PORT或者IN EAX, DX,输入指令。
OUT 格式OUT PORT, EAX或者OUT DX, EAX,输出指令。
端口号从0000-FFFFH,其中00-FFH可以直接指定,否则必须放在DX中。
(2) XLAT 换码指令。
操作:AL = ( (EBX)+(AL) )。
1.3地址传送指令(1) LEA 有效地址送寄存器指令。
(2) LDS, LES, LSS, LFS, LGS 指针送寄存器和段寄存器指令。
IBM—PC(80x86)汇编语言与接口技术-第2章 80x86计算机组织
• 80386是1985年研制出的一个32位微处理器, 内部及外部数据总线均为32位,地址线也为32 位,因此它可处理4G(232)字节的物理存储 空间。
• 1989年Intel公司又研制出新一代的微处理器 80486,80486芯片内除了有一个与80386相同 结构的主处理器外,还集成了一个浮点处理部 件FPU以及一个8K字节的高速缓冲存储器 (cache),使80486的计算速度和总体性能比 80386有了明显的提高。
• Intel公司在1982年推出了80286微处理器,它仍 然是16位结构。80286的内部及外部数据总线都 是16位的,但它的地址线是24位的,可寻址16M 字节的存储空间。
80286有两种工作方式,即实模式和保护模式: 实模式与8086工作方式相同,但速度比8086快。
保护模式除了仍具有16M字节的存储器物理地址空 间外,她还能为每个任务提供1G字节的虚拟存储 器地址空间。保护方式把操作系统及各任务所分配 到的地址空间隔离开,避免程序之间的相互干扰, 保证系统在多任务环境下正常工作。
• 8086是1978年Intel公司推出的16位微处理器。
(1)8086有16位数据总线,处理器与外部传送数据 时,一次可传送16位二进制数。
(2)8086有20位地址总线,寻址空间提高到1M字节。
(3)8086采用了流水线技术,可以实现处理器的内 部操作与存储器或I/O接口之间的数据传送操作重叠 进行,从而提高了处理器的性能。
2.2 基于微处理器的 计算机系统的构成
硬件:
中央处理机 CPU
总线控制 逻辑 系 统 总 线
存储器
接口
...
接口
大容量 存储器
...
I/O设备
I/O子系统
(完整word)80x86指令详解
80x86指令系统,指令按功能可分为以下七个部分.(1) 数据传送指令.(2) 算术运算指令。
(3) 逻辑运算指令。
(4)串操作指令。
(5)控制转移指令。
(6)处理器控制指令。
(7)保护方式指令.1、数据传送指令数据传送指令包括:通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令、扩展传送指令等.一、通用数据传送指令1 传送指令传送指令是使用最频繁的指令,格式:MOV DEST,SRC功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST.传送指令允许的数据流方向见图3 11。
图 3.11 传送指令数据流由上图可知,数据允许流动方向为:通用寄存器之间、通用寄存器和存储器之间、通用寄存器和段寄存器之间、段寄存器和存储器之间,另外还允许立即数传送至通用寄存器或存储器。
但在上述传送过程中,段寄存器CS的值不能用传送指令改变。
例 3.12CPU内部寄存器之间的数据传送。
MOV AL,DH ;AL←DH(8位)MOV DS,AX ;DS←AX(16位)MOV EAX,ESI ;EAX←ESI(32位)例 3.13CPU内部寄存器和存储器之间的数据传送。
MOV [BX],AX ;间接寻址(16位)MOV EAX,[EBX+ESI];基址变址寻址(32位)MOV AL,BLOCK ;BLOCK为变量名,直接寻址(8位)例 3。
14立即数送通用寄存器、存储器。
MOV EAX,12345678H ;EAX←12345678H(32位)MOV [BX],12H ;间接寻址(8位)MOV AX,1234H;AX←1234H(16位)使用该指令应注意以下问题:·源和目的操作数不允许同时为存储器操作数;·源和目的操作数数据类型必须一致;·源和目的操作数不允许同时为段寄存器;·目的操作数不允许为CS和立即数;·当源操作数为立即数时,目的操作数不允许为段寄存器;·传送操作不影响标志位。
微机8088第二章
15
1 0 0 1 1
OF DF IF TF SF ZF
0 1 0 1
AF PF
0
CF
FR
实模式下标志寄存器有9个标志位:6个状态标志位,3个控制标志位 状态标志位反映算术或逻辑运算后结果的状态: CF——进/借位标志。D7/D15向高位有进/借位,CF为1,否则为0。 PF——奇偶标志,运算结果中1的个数为偶数置1 AF——辅助进/借位标志,低4位/ 8位向高位产生进/借位置1,用于十进 制数运算调整。 ZF — 零标志,结果为0置1 SF ——符号标志,与运算结果的最高位相同。 OF — 溢出标志。反映有符号数作加法或减法运算时,运算结果是否 出现溢出的状态。OF=1,溢出。 字节:+127~-128; 字:+32767~-32768
微处理器的集成度
•指微处理器芯片上集成的晶体管的密度。 •最早Intel 4004的集成度为2250个晶体管,Pentium III的集 成度已经达到750万个晶体管以上,集成度提高了3000多倍 。
微处理器的发展概况 1971年~1977年是微处理器发展的早期阶段:
1971年:Intel 4004,是世界上
第三代:80386(1985年-1988年)
•第一个实用的32位微处理器,采用了 1.5m工艺,集成了275,000个晶体管 ,工作频率达到16MHz。80386的内 部寄存器、数据总线和地址总线都是 32 位 的 。 通 过 32 位 的 地 址 总 线 , 80386的可寻址空间达到4GB。
•80386的其他一些版本:80386SX,包含16位数据总线 和24位地址总线,寻址空间为16MB;80386SL/ 80386SLC,包含 l6位数据总线和25位地址总线,寻址 空间为32MB。由于这些微处理器由于与I/O之间传输 为16位,故也称为准32位微处理器。
80X86的指令系统
<>
SETA/SETNBE opr
SETAE/SETNB opr
SETB/SETNAE opr
SETBE/SETNA opr
SETE/SETZ opr
SETNE/SETNZ opr
Reg,mem
Reg1=reg2*imm Reg=mem*imm
将EAX的符号位D31扩展到EDX
<>
BT opr1,opr2 BTC opr1,opr2 BTR opr1,opr2 BTS opr1,opr2
将opr1中的第opr2位送CF 将opr1中的第opr2位送CF,并取反该位 将opr1中的第opr2位送CF,并复位该位 将opr1中的第opr2位送CF,并置位该位
Reg,mem
<>
CMPXCHG opr1,opr2
算 CMPXCHG8B 术 mem64 运 算 IMUL 指 reg1,reg2,imm 令 IMUL 组 reg,mem,imm
CDQ
Opr1-opr2,若ZF=1,opr1=opr2,否则,累 加器=目的操作数。 EDX,EAX-mem64,相等,则EDX,EAX送 mem64,否则,mem64送EDX,EAX
汇编语言程序设计
80X86的指令系统
Intel公司在成功推出8086/8088CPU之后,陆续推出 80286、80386、80486和Pentium(80586)CPU,其指令系 统在8086/8088的基础上,又扩充了一些指令。
80X86指令系统一般不作为课堂讲述的主要内容,因 此,只给出部分指令的汇总格式,不具体说明、分析指 令的格式、功能及使用方法。
80x86的指令系统和寻址方式(1).ppt
• 指令系统
一组指令的集合
指令
操作码 操作数 ... 操作数
• 寻址方式
与数据有关的寻址方式 与转移地址有关的寻址方式
物理地址的形成
3.1.1 8086中数据寻址方式
以 MOV 指令为例
• 立即寻址
MOV AX , 3069H
• 寄存器寻址
MOV AL , BH
JMP
目标地址的范围:段内
• 段内转移——近转移(near)
– 在当前代码段64KB范围内转移
代
( ±32KB范围)
码 段
– 不需要更改CS段地址,只要改变IP偏
移地址
• 段内转移——短转移(short)
代 码
– 转移范围可以用一个字节表达,在段
段
内-128~+127范围的转移
目标地址的范围:段间
• 段间转移——远转移(far)
– 从当前代码段跳转到另一个代码 段,可以在1MB范围
代 码
– 需要更改CS段地址和IP偏移地址
段
– 目标地址必须用一个32位数表达,
叫做32位远指针,它就是逻辑地
代
址
码
段
实际编程时,汇编程序会根据目标地址的距离, 自动处理成短转移、近转移或远转移
程序员可用操作符short、near ptr 或far ptr 强制
假设(35000H)=1234H, 那么 (AX)=1234H
* 适于数组、字符串、表格的处理
(6) 基址变址寻址方式*
有效地址 =
(BX) +
(SI)
(BP) (DI)
指令格式:
MOV MOV MOV
AX, [BX] [DI] AX, [BX+DI] AX, ES:[BX] [SI]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指令中也可以指定段跨越前缀来取 得其他段中的数据。 例如:MOV AX, ES:[BX] 这种寻址方式可以用于表格处理。 基址或变址寄存器初始化为表格的 首地址,每取一个数据就修改寄存器的 值,使之指向下一个数据。
例
MOV AX, [BX] 如果(DS)= 2000H, (BX)= 1000H,
注意:一条指令中同时使用基址寄 存器或变址寄存器是错误的。 例如:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。
这种寻址方式同样适用于数组或表 格处理。 首地址可存放在基址寄存器中,而 用变址寄存器来访问数组中的各个元素。 由于两个寄存器的值都可以修改,所以 它比寄存器相对寻址方式更加灵活。
指令的组成 计算机中的指令由操作码字段和 操作数字段两部分组成。操作码字段指 示计算机所要执行的操作,比如加、减 运算;操作数字段指示指令执行过程中 所需要的操作数,它既可以是操作数本 身,也可以是操作数地址或地址的一部 分,还可以是指向操作数地址的指针或 其他有关操作数的信息。
操作数字段可以有一个、二个或 三个,通常称为一地址、二地址或三 地址指令。
指令格式
”。
注释行: 书写说明性文字,不进行“汇编”,也不产生
80X86指令格式 [标号:] 操作码 [操作数] [;注释]
[标号: ] 程序员给这一行起的名字,后面跟上冒号,代表这一行的 地址。标号用字母开始,不要使用保留字作为标号。 操作码是这条指令需要完成的操作,用指令助记符表示。
[操作数] 是指令的操作对象,指令的操作数可以有0~3个。
直接寻址方式适合于处理单个变量。
(2) 寄存器间接寻址方式(Register indirect addressing)
这种寻址方式通过基址寄存器BX、BP 或变址寄存器SI、DI来保存操作数的有效地 址。如果指令中使用的寄存器是SI、DI和BX, 则操作数在数据段中,((DS)×16)再加上 寄存器中的有效地址形成20位物理地址;如 果指令中使用的寄存器是BP,则操作数在堆 栈段中,((SS)×16)再加上BP中的有效地 址形成20位物理地址。
8086的寻址方式包括与数据 有关的寻址方式和与转移地址有 关的寻址方式,CPU根据这些 寻址方式以不同的方法取得操作 数。
与数据有关的寻址方式
此类寻址方式用来确定操作数地址从而 找到操作数。 操作数寻址方式的讨论均以 MOV destination, source 为例,这是一条数据传送指令,第一操作数 为目的操作数destination,第二操作数为源 操作数source,指令执行的结果是把source 送到destination中去。
这种寻址方式同样可用于表格处理。 表格的首地址可设置为位移量,修改 基址或变址寄存器的内容取得表格中的值。
例 MOV AX, COUNT[SI](也可表示为 MOV AX, [COUNT+SI]) 其中COUNT为16位位移量的符号地址。 如果 (DS)= 3000H,(SI)= 2000H,COUNT = 3000H 则物理地址 = 30000H + 2000H + 3000H = 35000H 指令执行情况如图所示,最后的执行结果是(AX) = 1234H。
注意: ● 目的操作数dst和源操作数src 不能同时用存储器寻址方式,这个限制 适用于所有指令; ● 目的操作数dst不能是CS,也 不能用立即数方式; ● 目的操作数dst和源操作数src 不允许同时为段寄存器; ● MOV指令不影响标志位。
源操作数可以是:寄存器、存储器、立即数; 目的操作数可以是:寄存器、存储器。
例
MOV
AX, BX
如指令执行前(AX)= 1234H,(BX)= 5678H; 则指令执行后(AX)= 5678H,(BX)保 持不变。 注意:源寄存器和目的寄存器的位数必 须一致。
例如:MOV CL, BX是一条错误指令。
除上述两种寻址方式外,下面五 种寻址方式ive Address)的概念:在 8086里,把操作数的偏移地址称为 有效地址,下面五种计算EA的方法 体现了五种寻址方式。
(5) 相对基址变址寻址方式(Relative based indexed addressing)
这种寻址方式与基址变址寻址方式类 似,不同的是基址加变址再加上一个位移量 形成操作数的有效地址。缺省段的使用仍然 是DS与BX组合,SS与BP组合。
综上所述,有效地址可以由以下三种成 分组成: ·位移量(Displacement)是存放在指令 中的一个8位或16位数,但它不是立即数,而 是一个地址。 ·基址(Base)是存放在基址寄存器 (BX或BP)中的内容。它是有效地址中的基 址部分,通常用来指向数据段中数组或字符串 的首地址。 ·变址(Index)是存放在变址寄存器(SI 或DI)中的内容。它通常用来访问数组中的某 个元素或字符串中的某个字符。
3 存储器寻址方式
(1)直接寻址方式(Direct addressing)
在这种寻址方式中,操作数存放在 存储单元中,而这个存储单元的有效地 址就在指令的操作码之后,操作数的物 理地址可通过((DS)×16)再加上这个 有效地址形成。
例
MOV AX, [2000H] 如果(DS)= 3000H,则执行情况如图所示。 最后的执行结果为(AX)= 3050H。
例
MOV AL, 9H 指令执行后,(AL)= 09H
例
MOV AX, 3064H 指令执行后,(AX)= 3064H 下图表示了它的执行情况,图中指令存放 在代码段中,OP表示该指令的操作码部分, 3064H为立即数,它是指令的一个组成部分。
注意:不能直接给段寄存器和标志寄存 器赋予立即数。 显然,下面的指令是错误的: MOV DS, 1250H
1 立即寻址方式(Immediate addressing) 操作数直接存放在指令中,紧跟在操作 码之后,它作为指令的一部分存放在代码段 里,这种操作数称为立即数. 立即数可以是8位的或16位的。如果是16 位数,则高位字节存放在高地址中,低位字 节存放在低地址中。 立即寻址方式常用于给寄存器赋初值, 并且只能用于源操作数字段,不能用于目的 操作数字段。
两个操作数时,右面的操作数称为“源操作数”,左面的操作数称 为“目的操作数”。 [;注释] 用来添加一些说明,例如说明本行指令的功能。
8086的指令系统
我们已经知道计算机是通过执行指令序列 来解决问题的,因而每种计算机都有一组指令 集供给用户使用,这组指令集就称为计算机的 指令系统。本章说明8086的指令系统以及在指 令中为取得操作数地址所使用的寻址方式 (Addressing mode)。
(4) 基址变址寻址方式 (Based indexed addressing)
这是一种基址加变址来定位操作数 地址的方式,也就是说,操作数的有效 地址是一个基址寄存器(BP或BX)和 一个变址寄存器(SI或DI)的内容之和。 如基址寄存器为BX时,与DS形成的物 理地址指向数据段;如基址寄存器为BP 时,与SS形成的物理地址指向堆栈段。
在汇编语言指令中,可以用符 号地址(变量名或标号)代替数值 地址。 例如: MOV AX, DATA 或 MOV AX, [DATA] 这里DATA是存放操作数单 元的符号地址。
直接寻址方式默认操作数在数据段中,如 果操作数定义在其它段中,则应在指令中指定段 跨越前缀。 例如: MOV AX, ES:NUMBER 或 MOV AX, ES:[NUMBER] 这里NUMBER是附加段中的字变量。
2.2.1 通用数据传送指令
MOV dst, src;传送指令(move) 执行操作:(dst) ← (src) 功能: 将源操作数(字节或字)传送 到目的地址。
P40 例 MOV MOV
AX,DATA_SEG DS,AX
例 例
例
MOV MOV
MOV
AL,’E’ BX,OFFSET TABLE
AX,Y[BP][SI]
则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H 指令执行情况如图所示,最后的执行结果是( AX) = 1234H。
8086的指令系统
汇编语言的指令系统是程序设计的 基础,这里主要介绍8086的指令系统。 8086指令系统分为以下6组: ⒈ 数据传送指令 ⒉ 算术指令 ⒊ 逻辑指令 ⒋ 串处理指令 ⒌ 控制转移指令 ⒍ 处理机控制指令
I I
R
M
R
M
S (a)正确的数据传送操作
S (b)错误的数据传送操作
数据的定义
程序取得所需空间的方法有两种,一种是在加载程 序的时候为程序分配,再就是程序在执行的过程中向系统 申请。课程中不讨论第二种方法。 若要一个程序在被加载的时候取得所需的空间,则 必须要在源程序中做出说明。通过在源程序中定义段来进 行内存空间的获取。 为了程序设计上的清晰和方便,一般也都定义不同 的段来存放他们。 在程序中定义要处理的数据,这些数据会被编译、 连接程序作为程序的一部分写到可执行文件中。当可执行 文件中的程序被加载入内存时,这些数据也同时被加载入 内存。与此同时,要处理的数据也就自然而然地获得了存 储空间。
例如,单操作数指令就是一地址指令, 它只需要指定一个操作数,如加1指令只需要 指出需要加1 的操作数。大多数运算型指令可 使用三地址指令:除给出参加运算的两个操作 数外,还指出运算结果的存放地址。也可使用 二地址指令,此时分别称两个操作数为源操作 数(source)和目的操作数(destination)。 尽管在指令执行前这两个操作数都是输入操作 数,但指令执行后将把运算结果存放到目的操 作数的地址之中。8086的大多数运算型指令 就采用这种二地址指令。
2.2 数据传送类指令
数据传送指令的功能是把数据、地 址传送到寄存器或存储器单元中。它分 为4类。