null第5章
指令系统第5章
指令系统第一部分指令与指令系统指令与指令系统指令:
控制计算机完成某种操作的命令。用户程序都必须翻
译成指令形式的机器语言后才能运行。
指令系统:
处理器所能识别和执行的全部指令的集合。是计算机
系统设计的核心问题。
指令的兼容性:
同一系列机的指令都是兼容的。5.1.1 指令格式5.1.1 指令格式操作码(OP) 操作数地址(A)执行何种操作
(做什么)操作数地址或操作数本身
(做的对象)指令格式指令格式指令的长度与操作码及操作数的多少和类型有关注:两个操作数时,操作数类型要一致。如都是8位或都是16位。零地址指令: OP
一地址指令: OP A
二地址指令: OP A1 A2
三地址指令: OP A1 A2 A3
多地址指令5.1.2 指令分类5.1.2 指令分类算术逻辑运算
数据传送
移位操作
浮点运算
字符串处理
转移指令
堆栈操作
输入/输出
特权无条件转移和条件转移
调用和返回
陷阱5.2 指令的寻址方式5.2 指令的寻址方式寻址方式
指令中如何提供操作数地址(或操作数)的方式
立即寻址
直接寻址
寄存器寻址
寄存器间接寻址
寄存器相对寻址
基址-变址寻址
基址-变址-相对寻址一、立即寻址一、立即寻址指令中直接给出操作数本身(是立即数)
例:MOV AX,1234H12H34HAH ALMOV代码段┇ 二、直接寻址二、直接寻址指令中直接给出操作数的地址(偏移地址)
例:MOV AX,[1200H]22H11H1200H偏移地址┇ 数据段AH AL直接寻址直接寻址直接寻址方式下,操作数的段地址默认为数据段,但允许段重设,即由指令定义段。
例:MOV AX,ES:[1200H]三、寄存器寻址三、寄存器寻址操作数在通用寄存器中。
例:MOV AX,BX AX BX四、寄存器间接寻址四、寄存器间接寻址寄存器中的内容为操作数的偏移地址。操作数实际存放在内存单元中。
例:MOV AX,[BX]寄存器间接寻址寄存器间接寻址例:
设(BX)=1200H
则执行MOV AX,[BX]后22H11H1200H偏移地址AH AL┇ 11 22数据段代码段MOV寄存器间接寻址寄存器间接寻址由寄存器间接给出操作数的偏移地址;
存放偏移地址的寄存器称为间址寄存器,它们是:BX,BP,SI,DI
操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:
BX,SI,DI 默认在数据段
BP 默认在堆栈段寄存器间接寻址寄存器间接寻址寄存器
间接寻址基址寻址(间址寄存器为基址寄存
器BX,BP)
变址寻址(间址寄存器为变址寄存
器SI,DI)五、寄存器相对寻址五、寄存器相对寻址操作数的偏移地址=寄存器的内容+位移量
例:MOV AX,[BX+DATA]
设:DS=2000H,BX=0220H,
DATA=05H
则:AX=[20225H]六、基址-变址寻址六、基址-变址寻址操作数的偏移地址为一个基址寄存器的内容加上一个变址寄存器的内容,操作数的段地址由选择的基址寄存器决定
例:MOV AX,[SI+BX]七、基址-变址-相对寻址七、基址-变址-相对寻址操作数的偏移地址为一个基址寄存器的内容加上一个变址寄存器的内容,再加上一个位移量。
操作数的段地址由选择的基址寄存器决定
例:MOV AX,[BP+SI+DATA]八、隐含寻址八、隐含寻址指令隐含了的一个或两个操作数的地址,即操作数在默认的地址中
例: MUL BL
指令的执行:AL×BL AX5.3 RISC指令系统5.3 RISC指令系统RISC (精简指令系统计算机)指令特点
是计算机发展的重要趋势
使用简单指令(使用频率高的)
长度固定、格式和寻址方式少
取数/存数指令访问内存,其余指令访问寄存器(限制内存访问)
通用寄存器数量特别多
充分使用流水线
以硬布线控制逻辑为主,尽量少用微程序控制
对编译程序的要求高5.4 汇编语言及伪指令简介5.4 汇编语言及伪指令简介机器语言和汇编语言统称为低级语言
基本汇编语言(不使用宏指令)与宏汇编语言
(书中79页~83页的内容,要求实验前预习)汇编语言程序设计与执行过程汇编语言程序设计与执行过程输入汇编语言源程序 源文件 .ASM
汇编(编译) 目标文件 .OBJ
链接 可执行文件 .EXE
调试 最终程序汇编语言的基本语法汇编语言的基本语法常量
运算符
变量或标号
表达式变量变量代表内存中的数据区,变量名是地址单元的名字。
变量的属性:
段地址 —— 变量所在段的段地址
偏移量 —— 变量单元地址与段首地址之
间的位移量。
类 型 —— 字节型、字型和双字型语句语句指令语句:由CPU执行的指令
伪指令: CPU不执行,不生成目标代码;
由汇编程序执行,用于分配内存空间、定义变量、指示程序开始和结束等。
宏指令:将某些汇编语言指令定义为新的功能更强的指令汇编语言的语句格式汇编语言的语句格式指令语句的格式:
[标号:] [前缀] 助记符 [操作数],[操作数] [;注释]指令的符号地址,标号后要有冒号操作码注释前加分号汇编语言的语句格式汇编语言的语句格式
伪指令的格式:[名字] 伪指令助记符 操作数 [,操作数,…] [ ;注释]变量的符号地址其后不加冒号指示性语句中至少有一个操作数三、基本伪指令三、基本伪指令表达式赋值(符号定义)伪指令
定义数据伪指令
段定义伪指令
设定段寄存器伪指令
过程定义伪指令
程序结束伪指令表达式赋值(符号定义)伪指令表达式赋值(符号定义)伪指令格式:
符号名 EQU 表达式
操作:
用符号名取代后边的表达式,不可重新定义
例:
CONSTANT EQU 100
VAR EQU 30H+99HEQU说明的表达式不占用内存空间定义数据伪指令定义数据伪指令用于为变量对应的内存单元分配数据。
格式:
[变量名] 伪指令助记符 操作数,[… ] [ ;注释]定义数据伪指令定义数据伪指令伪指令助记符
DB 定义的变量为字节型
DW 定义的变量为字类型(双字节)
DD 定义的变量为双字型(4字节)
DQ 定义的变量为4字型(8字节)
DT 定义的变量为10字节型定义数据伪指令定义数据伪指令NUM1 DB 10H ; 将10H存放到NUM1对应的字节单元中
DATA1 DB 11H,22H,33H,44H
DATA2 DW 3344H
DATA3 DD 33445566H定义数据伪指令定义数据伪指令伪指令的性质决定所定义变量的属性;
定义字符串必须用DB伪指令
例:
DATA1 DB ‘ABCD’,66H
‘A’‘B’‘C’‘D’41H42H43H44H66H重复操作符重复操作符为一个数据区的各单元设置相同的初值
格式:
[变量名] 伪指令助记符 n DUP(初值,…)
例:
DW 20 DUP (0)
DB 3 DUP (22H, 11H, ?)随机数段定义伪指令段定义伪指令说明逻辑段的起始和结束;
说明不同程序模块中同类逻辑段之间的联系形态段定义伪指令段定义伪指令段名 SEGMENT [定位类型] [组合类型] [’类别’]
┇
段名 ENDS说明逻辑段的起点说明不同模块中同名段的组和连接方式段定义伪指令例段定义伪指令例DATA SEGMENT
MEM1 DB 11H,22H
MEM2 DW 1234H
DATA ENDS设定段寄存器伪指令设定段寄存器伪指令说明所定义逻辑段的性质
格式
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
程序结束伪指令程序结束伪指令表示源程序结束
格式:
END [标号]一个完整源程序结构例一个完整源程序结构例DSEG SEGMENT
DATA1 DB 1, 2
DATA2 DW 1234H
DSEG ENDS
ESEG SEGMENT
DB 20 DUP (?)
ESEG ENDS
SSEG SEGMENT
DB 200 DUP (?)
SSEG ENDS一个完整源程序结构例一个完整源程序结构例CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG,
ES: ESEG, SS: SSEG
START: MOV AX, DSEG
MOV DS, AX
MOV AX, ESEG
MOV ES, AX
MOV AX, SSEG
MOV SS, AX
┇
CSEG ENDS
END START源程序
代码过程定义伪指令过程定义伪指令用于定义一个过程体
格式:
过程名 PROC [ NEAR / FAR ]
┇
RET
过程名 ENDP过程入口的符号地址§5.5 8086指令系统§5.5 8086指令系统从功能上包括六大类:数据传送
算术运算
逻辑运算和移位
串操作
控制转移
处理器控制一、数据传送指令一、数据传送指令通用数据传送
输入/输出
地址传送
标志位寄存器操作1. 通用数据传送1. 通用数据传送一般数据传送指令
堆栈操作指令
交换指令
查表换码指令
字位扩展指令特点:
该类指令的执行对标志位不产生影响 一般数据传送指令一般数据传送指令一般数据传送指令 MOV
格式:MOV dest,src
操作:src dest
例: MOV AL,BL一般数据传送指令一般数据传送指令注:
两操作数字长必须相同 ;
不允许在两个存储单元之间直接进行数据传送;
不允许在两个段寄存器之间直接进行数据传送;
在源操作数是立即数时,目标操作数不能是段寄存器;
IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。一般数据传送指令一般数据传送指令判断下列指令的正确性:
MOV AL, BX
MOV AX, [SI+05H]
MOV DS, 1000H
MOV DX, 09H
MOV [1200] , [SI]
MOV BYTE PTR[BX], 5
MOV WORD PTR[BX], 5一般数据传送指令例一般数据传送指令例将(*) 的ASCII码2AH送入内存1000H开始的100个单元中:
MOV DI,1000H
MOV CX,64H
MOV AL,2AH
AGAIN:MOV [DI],AL
INC DI ;DI+1
DEC CX ;CX-1
JNZ AGAIN ;CX≠0则继续
HLT 上段程序在代码段中的存放形式上段程序在代码段中的存放形式設CS=109EH,IP=0100H,则各条指令存放地址如下:
CS : IP
109E:0100 MOV DI,1000H
109E:0103 MOV CX,64H
109E:0105 MOV AL,2AH
109E:0107 MOV [DI],AL
109E:0109 INC DI
109E:010A DEC CX
109E:010B JNZ 0107H
109E:010D HLT数据段中的分布数据段中的分布送上2AH后数据段中相应存储单元的内容改变如下:
DS:1000 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS:1010 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS:1020 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS:1030 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS:1040 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS:1050 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A
DS:1060 2A 2A 2A 2A 00 00 00 00 00 00 00 00 00 00 00 00偏移地址[DI]堆栈操作指令堆栈操作指令堆栈操作的原则
先进后出
以字为单位
堆栈操作指令堆栈操作指令入栈指令 PUSH
格式: PUSH OPRD
出栈指令 POP
格式: POP OPRD入栈指令PUSH入栈指令PUSH指令执行过程:
(SP) (SP)-2
(SP)-1 操作数高字节
(SP)-2 操作数低字节入栈指令PUSH入栈指令PUSH设AX=1234H,SP=1200H
执行 PUSH AX 指令后堆栈区的状态:1200H┇ 堆栈段 SP-2=11FEH12H34H1200H┇ 堆栈段12H 34HAX入栈后入栈前出栈指令POP出栈指令POP指令执行过程:
(SP) 操作数低字节
(SP)+1 操作数高字节
(SP)←(SP)+2出栈指令的操作出栈指令的操作执行 POP AX
堆栈区的状态:12H34H11FEH┇ 堆栈段代码段PUSH 12 34 AX SP+2堆栈操作指令说明堆栈操作指令说明指令的操作数必须是16位的;
操作数可以是寄存器或存储器两单元,但不能是立即数;
不能从栈顶弹出一个字给CS;
PUSH和POP指令在程序中一般成对出现;
PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。堆栈操作指令例堆栈操作指令例PUSH AX
PUSH BX
PUSH WORD PTR[BX]
POP WORD PTR[BX]
POP AX
POP BX交换指令交换指令格式:
XCHG MEM/REG,MEM/REG
两操作数必须有一个是寄存器操作数
不允许使用段寄存器
例: XCHG AX,BX
XCHG [2000],CL查表换码指令查表换码指令格式:
XLAT
将累加器AL中的值换为内存表格中的某个值。
用BX的内容代表内存表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址
操作:[BX+AL] AL查表换码指令例查表换码指令例数据段中存放有一张ASCII码转换表,设表首地址为2000H,现欲查出表中第11个代码的ASCII码
(设DS=4000H)查表换码指令例查表换码指令例303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’查表换码指令例查表换码指令例可用如下指令实现:
MOV BX,2000H ;(BX)←表首地址
MOV AL,0BH ;(AL)←序号
XLAT ; 查表转换
执行后得到:(AL)=42H字位扩展指令字位扩展指令将符号数的符号位扩展到高位;
指令为零操作数指令,采用隐含寻址,隐含的操作数为AX及AX,DX
无符号数的扩展规则为在高位补0字节到字的扩展
字到双字的扩展字节到字的扩展指令字节到字的扩展指令格式:
CBW
操作:将AL内容扩展到AX
规则:若最高位=1,则执行后AH=FFH
若最高位=0,则执行后AH=00H字到双字的扩展指令字到双字的扩展指令格式:
CWD
操作:将AX内容扩展到DX AX
规则:若最高位=1,则执行后DX=FFFFH
若最高位=0,则执行后DX=0000H字位扩展指令例字位扩展指令例MOV AL,44H
CBW
MOV AX,0AFDEH
CWD
MOV AL,86H
CBW执行结果?2. 地址传送指令2. 地址传送指令取偏移地址指令LEA
LDS指令
LES指令
取偏移地址指令LEA取偏移地址指令LEA将变量的16位偏移地址取出送目标寄存器
格式:
LEA REG,MEM
指令要求源操作数必须是一个内存单元地址,目标操作数是16位通用寄存器。内存单元地址LEA指令LEA指令比较下列指令:
LEA SI,DATA1
MOV SI,DATA1
MOV BX,[BX]
LEA BX,[BX]符号地址LEA指令LEA指令┇ ┇ ┇ DATA112H34H1100H88H77HBX=1100HLEA指令在程序中的应用LEA指令在程序中的应用将数据段中首地址为MEM1 的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段 。LEA指令在程序中的应用LEA指令在程序中的应用 开 始取源地址取目标地址送数据块长度到CL传送一个字节修改地址指针修改计数值计数值=0? 结 束NYLEA指令在程序中的应用LEA指令在程序中的应用 LEA SI,MEM1
LEA DI,MEM2
MOV CL,50
NEXT: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CL
JNZ NEXT
HLT 取远地址指针指令取远地址指针指令 LDS reg,MEM32
LES reg,MEM32
指令中源操作数是存储器某4个连续单元的内容取出,低地址两单元的数据送reg(间址寄存器),高地址两单元的数据送DS或ES。
LDS指令例LDS指令例例:
LDS SI,[1200H]
MOV AX,[SI]
指令执行后:LDS指令例LDS指令例DS = 6000H
SI = 1234H
AX = 2233H┇ ┇ 12H34H00H60H1200H数据段 1┇ DSSI数据段233H22H61234HLES指令例LES指令例 LES DI,[1200H]
MOV AX,[DI]┇ ┇ 12H34H00H60H1200H数据段┇ ESDI附加段33H22H61234H3. 标志寄存器操作指令3. 标志寄存器操作指令LAHF
SAHF
PUSHF
POPF隐含操作数AH隐含操作数FLAGSLAHF,SAHFLAHF,SAHFLAHF ;将FLAGS的低8位装入AH
SAHF ;将AH 的内容送FLAGS的低8位CFPFAFZFCF….AHFLAGSD15D0D7D0PUSHF,POPFPUSHF,POPF针对FLAGS的堆栈操作指令
将标志寄存器的内容入栈或从堆栈弹出
4. 输入/输出指令4. 输入/输出指令专门面向I/O端口操作的指令
指令格式:
输入指令 IN AX(AL),PORT
输出指令 OUT PORT,AX(AL)端口地址累加器输入/输出指令寻址方式输入/输出指令寻址方式直接寻址
直接给出8位端口地址,可寻址256个端口
间接寻址
16位端口地址由DX指定,可寻址64K个端口例例IN AL,50H ;从50H端口读一个字节到AL中
IN AX,50H ;从50H端口读一个字节到AL中
从51H端口读一个字节到AH中
MOV DX,03FFH
IN AL,DX
OUT DX,AX
OUT 3FH,AL二、算术运算类指令二、算术运算类指令加法运算指令
减法运算指令
乘法指令
除法指令
十进制调整指令算术运算指令的执行大多对状态标志位会产生影响1. 加法指令1. 加法指令普通加法指令ADD
带进位位的加法指令ADC
加1指令INC
加法指令对操作数的要求与MOV指令相同ADD 指令ADD 指令格式:
ADD OPRD1,OPRD2
操作:
OPRD1 OPRD1+OPRD2ADD指令的执行对全部6个状态标志位都产生影响ADD 指令例ADD 指令例MOV AL,78H
ADD AL,0A6H
指令执行后6个状态标志位的状态=?
ADD 指令例ADD 指令例 01111000
+ 10100110
000111101标志位状态: CF= SF=
AF= ZF=
PF= OF=ADC 指令ADC 指令指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样
指令的操作:
OPRD1 OPRD1+OPRD2+CF
ADC指令多用于多字节数相加运算INC 指令INC 指令格式:
INC OPRD
操作:
OPRD OPRD+1常用于在程序中修改地址指针不能是段寄存器或立即数2. 减法指令2. 减法指令普通减法指令SUB
考虑借位的减法指令SBB
减1指令DEC
比较指令CMP
求补指令NEG
减法指令对操作数的要求与对应的加法指令相同SUB 指令SUB 指令格式:
SUB OPRD1,OPRD2
操作:
OPRD1 OPRD1- OPRD2
对标志位的影响与ADD指令同SBB 指令SBB 指令指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样
指令的操作:
OPRD1 OPRD1- OPRD2- CF
SBB指令多用于多字节数相减运算DEC 指令DEC 指令格式:
DEC OPRD
操作:
OPRD OPRD – 1
指令常用于在程序中修改计数值,其对操作数的
要求与INC指令相同应用程序例应用程序例 MOV BL,2
NEXT1 :MOV CX,0F000H
NEXT2: DEC CX
JNZ NEXT2
DEC BL
JNZ NEXT1
HLTNEG 指令NEG 指令格式:
NEG OPRD
操作:
OPRD 0 – OPRD
用0减去操作数,相当于对该操作数求补码8/16位寄存器或存储器操作数CMP 指令CMP 指令格式:
CMP OPRD1,OPRD2
操作:
OPRD1- OPRD2
指令执行的结果不影响目标操作数!CMP 指令CMP 指令用途:
用于比较两个数的大小,可作为条件转移指令转移的条件
指令对操作数的要求及对标志位的影响与SUB指令相同
CMP 指令比较原理CMP 指令比较原理两个无符号数的比较:
CMP AX,BX
若 AX > BX CF=0
若 AX < BX CF=1CMP 指令比较原理CMP 指令比较原理两个带符号数的比较
CMP AX,BX
两个数的大小由OF和SF共同决定
OF和SF状态相同 AX > BX
OF和SF状态不同 AX < BX CMP 指令应用例CMP 指令应用例 LEA BX,MAX
LEA SI,BUF
MOV CL,20
MOV AL,[SI]
NEXT:INC SI
CMP AL,[SI]
JNC GOON ;CF=0转
XCHG [SI],ALGOON:DEC CL
JNZ NEXT
MOV [BX],AL
HLT程序功能
?程序功能程序功能┇ ┇ ┇ MAXBUFXXHXXHXXH找20个数中最大的数,并将其存放在MAX单元中3. 乘法指令3. 乘法指令无符号的乘法指令MUL
带符号的乘法指令IMUL乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX;无符号数乘法指令无符号数乘法指令格式:
MUL OPRD
操作:
OPRD为字节数 AX AL×OPRD
OPRD为16位数 DXAX AX×OPRD不能是立即数无符号数乘法指令无符号数乘法指令MUL BYTE PTR[BX]┇ BXXXHAL × XXHAX带符号数乘法指令带符号数乘法指令格式:
IMUL OPRD
IMUL指令将OPRD视为带符号数,运算时若操
作数为负数,要先将操作数按位取反加1,运算
后再将结果按位取反加1 。带符号数乘法指令带符号数乘法指令设:AL=FEH,CL=11H,求AL与CL的乘积
若为无符号数,则 MUL CL
结果:AX=10DEH
若将两操作数看作有符号数,则:
IMUL CL
指令执行后:AX=FFDEH=-34。4. 除法指令4. 除法指令无符号除法指令 DIV OPRD
有符号除法指令 IDIV OPRD若OPRD是字节数,则执行AX/OPRD
若OPRD是双字节数,则执行 DXAX/OPRD
指令要求被除数是除数的双倍字长AL=商
AH=余数AX=商
DX=余数5 十进制调整指令5 十进制调整指令DAA 压缩BCD码加法调整指令
AAA 非压缩BCD码加法调整指令
DAS 压缩BCD码减法调整指令
AAS 非压缩BCD码减法调整指令
本文档为【计算机硬件基础-5指令系统1】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。