null5 指令系统和汇编语言5 指令系统和汇编语言主要
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
指令的格式与分类
指令的寻址方式
8086汇编指令系统简介5.1 指令的格式与分类5.1 指令的格式与分类指令中应包含的信息:
运算数据的来源(源操作数)
运算结果保存到何处(目的操作数)
执行的操作(操作码)例如: Z = X + Y 目的操作数 源操作数1 操作 源操作数2想一想: 指令应该包括几个部分?5.1.1 指令格式5.1.1 指令格式操作码 操作数,操作数执行何种操作目标操作数源操作数参加操作的数据
或数据存放的地址指令格式指令格式指令的长度与操作码及操作数的多少和类型有关零地址指令: 操作码
一地址指令: 操作码 操作数
二地址指令: OP A1 A2
三地址指令: OP A1 A2 A3
多地址指令5.1.2 指令分类5.1.2 指令分类算术逻辑运算
数据传送
位移操作
浮点运算
字符串运算
转移
堆栈操作
输入输出
特权无条件转移和条件转移
调用和返回
陷阱5.2 指令的寻址方式5.2 指令的寻址方式寻址方式
指令中提供操作数或操作数地址的方式
操作数
立即数:表征参加操作的数据本身
存储器操作数:表征数据存放的地址
寄存器操作数:表征数据存放在哪个寄存器中
隐含操作数:表征数据隐含存放在某个寄存器中立即数操作数*立即数操作数源操作数就是参加操作的数据本身,它们可以是8位或16位。
例: MOV AX,1234H
MOV BL,22H
立即数无法作为目标操作数
立即数可以是无符号或带符号数, 其值应在允许范围内
错误例:
MOV AX, 12345H; MOV 1234H, AX寄存器操作数:*寄存器操作数:表示参加运算的数存放在指令给出的寄存器中,可以是16位或8位。
例:MOV AX,BX
MOV DL,CH
想一想:以下指令正确否?
MOV AX,BL
MOV DL,CX 存储器操作数存储器操作数表示当前参加运算的数存放在存储器的某一个或某两个单元中
表示形式: [ ]
地址值或寄存器如:[1234H] 表示操作数在地址为1234H的存储器单元中
[BX] 表示操作数在以BX的内容为地址的存储器单元中指令例:MOV AX, [1234H]
MOV [BX], SI一、立即寻址一、立即寻址指令中的源操作数是立即数,即源操作数是参加操作的数据本身
例:MOV AX,1234H
12H34HAH ALMOV代码段┇ 二、直接寻址1二、直接寻址1指令中直接给出操作数的偏移地址
例:MOV AX,[1200H]22H11H1200H偏移地址┇ 数据段AH AL直接寻址2直接寻址2直接寻址方式下,操作数的段地址默认为数据段,但允许段重设,即由指令定义段。
例:MOV AX,ES:[1200H]
三、寄存器寻址三、寄存器寻址参加操作的操作数在CPU的通用寄存器中。
例:MOV AX,BX
AX BX四、寄存器间接寻址1四、寄存器间接寻址1参与操作的操作数存放在内存中,其偏移地址为指令中的寄存器的内容。
例:MOV AX,[BX]
寄存器间接寻址2寄存器间接寻址2例:
设(BX)=1200H
则执行MOV AX,[BX]后22H11H1200H偏移地址AH AL┇ 11 22代码段MOV寄存器间接寻址3寄存器间接寻址3由寄存器间接给出操作数的偏移地址;
存放偏移地址的寄存器称为间址寄存器,它们是:BX,BP,SI,DI
操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:
BX,SI,DI 默认在数据段
BP 默认在堆栈段寄存器间接寻址4寄存器间接寻址4寄存器
间接寻址基址寻址(间址寄存器为基址寄存
器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 AX
5.3 8086汇编指令系统简介5.3 8086汇编指令系统简介数据传送指令
算术运算指令
逻辑运算指令
串处理指令
控制转移指令
处理器控制指令5.3.1 数据传送指令5.3.1 数据传送指令1. 通用数据传送
2. 输入输出
3. 地址传送
4. 标志位操作
1. 通用数据传送1. 通用数据传送一般数据传送指令
堆栈操作指令
交换指令
查表转换指令
字位扩展指令特点:
该类指令的执行对标志位不产生影响 一般数据传送指令一般数据传送指令一般数据传送指令 MOV
格式:MOV dest,src
操作:src dest
例: MOV AL,BL一般数据传送指令一般数据传送指令注:
两操作数字长必须相同 ;
两操作数不允许同时为存储器操作数;
两操作数不允许同时为段寄存器;
在源操作数是立即数时,目标操作数不能是段寄存器;
IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。一般数据传送指令一般数据传送指令判断下列指令的正确性:
MOV AL,BX
MOV AX,[SI]05H
MOV [BX][BP],BX
MOV DS,1000H
MOV DX,09H
MOV [1200],[SI]一般数据传送指令例一般数据传送指令例将(*) 的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 REG,MEM/REG
两操作数必须有一个是寄存器操作数
不允许使用段寄存器
例: XCHG AX,BX
XCHG [2000],CL查表指令查表指令格式:
XLAT
说明:用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)←序号
XALT ; 查表转换
执行后得到:(AL)=42H2. 输入输出指令2. 输入输出指令专门面向I/O端口操作的指令
掌握:
指令的格式及操作
指令的两种寻址方式
指令对操作数的要求输入输出指令输入输出指令指令格式:
输入指令 IN acc,PORT
输出指令 OUT PORT,acc端口地址累加器指令寻址方式指令寻址方式直接寻址
直接给出8位端口地址,可寻址256个端口
间接寻址
16位端口地址由DX指定,可寻址64K个端口例例IN AX,80H
MOV DX,03FFH
IN AL,DX
OUT DX,AX
OUT AL,3FH3. 地址传送指令3. 地址传送指令取偏移地址指令LEA
LDS指令
LES指令
取偏移地址指令LEA取偏移地址指令LEA将变量的16位偏移地址取出送目标寄存器
格式:
LEA REG,MEM
指令要求源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。存储器操作数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个连续单元的偏移地址,目标操作数是间址寄存器。
LDS指令例LDS指令例例:
LDS DI,[1200H]
MOV AX,[DI]
指令执行后:LDS指令例LDS指令例DS = 6000H
DI = 1234H
AX = 2233H┇ ┇ 12H34H00H60H1200H数据段 1┇ DSDI数据段233H22H61234HLES指令例LES指令例 LES DI,[1200H]
MOV AX,[DI]┇ ┇ 12H34H00H60H1200H数据段┇ ESDI附加段33H22H61234H4. 标志位操作指令4. 标志位操作指令LAHF
SAHF
PUSHF
POPF隐含操作数AH隐含操作数FLAGSLAHF,SAHFLAHF,SAHFLAHF ;将FLAGS的低8位装入AH
SAHF ;执行与LAHF相反的操作CFPFAFZFCF….AHFLAGSD15D0D7D0PUSHF,POPFPUSHF,POPF针对FLAGS的堆栈操作指令
将标志寄存器压栈或从堆栈弹出
5.3.2 算术运算指令5.3.2 算术运算指令加法运算指令
减法运算指令
乘法指令
除法指令
十进制调整指令算术运算指令的执行大多对状态标志位会产生影响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;
若运算结果的高位全为0或1,表示其为无效数据,OF=CF=0无符号数乘法指令无符号数乘法指令格式:
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.3.3 逻辑运算指令5.3.3 逻辑运算指令逻辑运算
移位操作与
或
非
异或
测试非循环移位
循环移位逻辑移位
算术移位不带进位位的移位
带进位位的移位1. 逻辑运算1. 逻辑运算逻辑运算指令对操作数的要求大多与MOV指令相同。“非”运算指令要求操作数不能是立即数;
除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0“与”指令“与”指令格式: AND OPRD1,OPRD2
操作: 两操作数按位相“与”,结果送目标
地址
“与”指令的应用“与”指令的应用实现两操作数相与的运算;
使目标操作数的某些位不变,某些位清零;
在操作数不变的情况下使CF和OF清零。“与”指令的应用“与”指令的应用AND BL,[BX]
AND AL,0FH
AND AX,AX
“或”运算指令“或”运算指令格式: OR OPRD1,OPRD2
操作: 两操作数按位相“或”,结果送目标
地址“或”运算指令的应用“或”运算指令的应用实现两操作数相“或”的运算;
使某些位不变,某些位置“1”
在不改变操作数的情况下使OF=CF=0应用程序例应用程序例OR AX,[DI]
OR CL,0FH
OR AX,AX OR AL,AL
JPE GOON
OR AL,80H
GOON:….偶校验转移
(PF=1)将一个二进制数9变为字符‘9’?“非”运算指令“非”运算指令格式:NOT OPRD
操作:操作数按位取反再送回原地址
指令中的操作数不能是立即数
指令的执行对标志位无影响
例:NOT BYTE PTR[BX]
“异或”运算指令“异或”运算指令格式: XOR OPRD1,OPRD2
操作: 两操作数相“异或”,结果送目标
地址
两操作数自身相异或,结果
XOR AX,AX“测试”指令“测试”指令格式: TEST OPRD1,OPRD2
操作: 执行“与”运算,但运算的结果不
送回目标地址。
应用: 常用于测试某些位的状态“测试”指令例“测试”指令例从地址为38F0H的端口中读入一个字节数,如果该数的bit1位为1,则可从38FEH端口将DATA为首地址的一个字输出,否则就不能进行数据传送。
编写相应的程序段。“测试”指令例“测试”指令例开 始取待输出数的偏移地址读入状态字测试bit1位状态Bit1=1?取输入口地址取输出口地址 输出一个字NY“测试”指令例“测试”指令例 LEA SI,DATA
MOV DX,38F0H
WATT:IN AL,DX
TEST AL,02H
JZ WATT ;ZF=1转移
MOV DX,38FEH
MOV AX,[SI]
OUT DX,AX2. 移位指令2. 移位指令非循环移位指令
循环移位指令
注:
移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。非循环移位指令非循环移位指令逻辑左移
算术左移
逻辑右移
算术右移算术左移和逻辑左移算术左移和逻辑左移格式:
SAL OPRD,1
SAL OPRD,CL
SHL OPRD,1
SHL OPRD,CL有符号数无符号数逻辑左移移动一位后,若CF与最高不相等,则OF=1;否则OF=0逻辑右移逻辑右移格式:
SHR OPRD,I
SHR OPRD,CL0CF无符号数的右移移动一位后,若次高位与最高位不相等,则OF=1;否则OF=0算术右移算术右移格式:
SAR OPRD,I
SAR OPRD,CL
有符号数的右移CF非循环移位指令的应用非循环移位指令的应用左移可实现乘法运算
右移可实现除法运算
循环移位指令循环移位指令
不带进位位的循环移位
带进位位的循环移位
循环移位指令的格式、对操作数的要求与非循环移位指
令相同左移 ROL
右移 ROR左移 RCL
右移 RCR不带进位位的循环移位不带进位位的循环移位CFCF带进位位的循环移位带进位位的循环移位CFCF循环移位指令的应用循环移位指令的应用用于对某些位状态的测试;
高位部分和低位部分的交换;
与非循环移位指令一起组成32位或更长字长数的移位。程序例程序例 MOV SI,1000H
MOV DI,3000H
MOV CX,4
BBB:MOV AL,[SI]
MOV BL,AL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,BLPUSH CX
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
INC SI
POP CX
DEC CX
JNZ BBB
HLT程序
功能?程序功能程序功能将1000H开始存放的四个压缩BCD码转换为ASCII码存放在3000H开始的单元中去。┇┇12H34H56H78H┇1000H3000H5.3.4 串处理指令5.3.4 串处理指令针对数据块或字符串的操作;
可实现存储器到存储器的数据传送;
待操作的数据串称为源串,目标地址称为目标串。串操作指令的特点串操作指令的特点源串一般存放在数据段,偏移地址由SI指定。允许段重设;
目标串必须在附加段,偏移地址由DI指定;
指令自动修改地址指针,修改方向由DF决定。
DF=0 增地址方向;DF=1 减地址方向;
数据块长度值由CX指定;
可增加自动重复前缀以实现自动修改CX内容。串操作指令流程串操作指令流程取源串地址取目标串地址设串长度传送一个字节或字修改地址指针修改串长度值传送完否?重复前缀重复前缀REP 无条件重复
REPE 相等重复
REPZ 为零重复
REPNE 不相等重复
REPNZ 不为零重复条件重复CX≠0ZF=1CX≠0ZF=0CX≠0 重复串操作指令串操作指令串传送 MOVS
串比较 CMPS
串扫描 SCAS
串装入 LODS
串送存 STOS串传送指令串传送指令格式:
MOVS OPRD1,OPRD2
MOVSB
MOVSW
指令用于实现数据块的传送,常与无条件重复前缀连用。串传送指令串传送指令对比用MOV指令和MOVS指令实现将200个字节数据从内存的一个区域送到另一个区域的程序段。串传送指令例串传送指令例用串传送指令实现200个字节数据的传送:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT串比较指令串比较指令格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW
该指令用于两个数据块或两个字符串之间的比较;
常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。串比较指令例串比较指令例测试上例中200个字节数据是否传送正确:LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REPE CMPSB JZ STOP
DEC SI
MOV AL,[SI]
MOV BX,SI
STOP:HLT 串扫描指令串扫描指令格式:
SCAS OPRD
SCASB
SCASW
指令执行:AX(或AL)- OPRD
该指令常用于在某个区域中寻找关键字。目 标
操作数串装入指令串装入指令格式:
LODS OPRD
LODSB
LODSW
操作:对字节: AL ([DS:SI])
对 字: AX ([DS:SI])源操作数串装入指令串装入指令用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口。
LODS指令一般不加重复前缀。串送存指令串送存指令格式:
STOS OPRD
STOSB
STOSW
操作:对字节: AL ([ES:DI])
对 字: AX ([ES:DI])目 标
操作数串送存指令的应用串送存指令的应用将内存某个区域清零 区域首地址送ES:DI串长度送CX置方向标志DF0送累加器AL执行串送存指令开始5.3.5 控制转移指令5.3.5 控制转移指令转移指令
循环控制
过程调用
中断控制1. 转移指令1. 转移指令无条件转移指令
无条件转移到目标地址,执行新的指令
有条件转移指令
在具备一定条件的情况下转移到目标地址转移指令的转移原理转移指令的转移原理通过修改代码段寄存器CS及指令指针IP的内容,使程序改变顺序执行的模式,转到新的目标地址执行。无条件转移指令无条件转移指令指令格式:
JMP OPRD
无条件转移的目标地址可以是在当前代码段,也可在另一代码段无条件转移指令无条件转移指令段内转移——目标地址与JMP指令在同一代码段
转移方式:
直接转移——指令中直接给出转移的目标地址
间接转移——由指令中的寄存器或存储器间接给出转移
目标地址无条件段内转移无条件段内转移直接转移:
JMP Lable
转移目标地址:
段基地址不变;
偏移地址=当前IP+位移量JMPLabel┇┇┇代码段位移量近地址标号无条件段内转移无条件段内转移间接转移:
JMP BX
JMP WORD PTR[BX]JMP┇┇┇代码段数据段BX=1200┇XXHXXHIP指令码无条件段间转移无条件段间转移直接转移:
JMP FAR Lable
远地址标号JMPLabel┇┇┇代码段1代码段2XXHXXHXXHXXHIPCS无条件段间转移无条件段间转移间接转移:
JMP DWORD PTR[BX]XXHXXHXXHXXH[BX]IPCSJMP┇┇┇┇指令码代码段1代码段2数据段条件转移指令条件转移指令在满足一定的条件下,程序转移到目标地址继续执行;
在条件转移指令之前,应有一条为条件转移指令的执行形成条件的指令(如对标志位产生影响的指令);
条件转移指令均为段内短转移,即转移范围为: -128------+1272. 循环控制指令2. 循环控制指令控制程序在以当前IP为中心的-128~+127范围内循环执行;
循环次数由CX寄存器指定。
循环指令无条件循环指令LOOP
条件循环指令LOOPZ
LOOPNZ无条件循环指令无条件循环指令格式:
LOOP Lable
循环条件:
CX ≠ 0
LOOP指令的操作相当于:
DEC CX
JNZ Lable条件循环指令条件循环指令格式:
LOOPZ Lable
LOOPE Lable
循环条件:
CX ≠ 0 ZF=1格式:
LOOPZ Lable
LOOPE Lable
循环条件:
CX ≠ 0 ZF=13. 过程调用和返回3. 过程调用和返回段内调用
段间调用段内直接调用
段内间接调用段间直接调用
段间间接调用调用指令与转移指令的比较调用指令与转移指令的比较用于调用一个子过程;
调用前须保护断点地址;
子过程执行结束后要返回原调用处继续执行原程序 —— 断点恢复。调用指令的执行过程调用指令的执行过程将调用指令的下一条指令的地址(断点)压入堆栈;
获取子过程的入口地址(子过程第1条指令的偏移地址);
(执行子过程,含相应参数的保存及恢复);
将断点偏移地址由堆栈弹出,返回原程序。段内调用段内调用子过程与原调用程序在同一代码段,在调用之前只需保护断点的偏移地址
格式:
CALL NEAR PROC近过程名断点入口地址段内调用例段内调用例CALL TIMRE
CALL WORD PTR[SI]直接调用间接调用段间调用段间调用子过程与原调用程序不在同一代码段,在调用之前需保护断点的段基地址和偏移地址。
断点地址的保护是先将断点的CS压栈,再将IP压入堆栈。
指令格式:
CALL FAR PROC
段间调用例段间调用例CALL FAR TIMRE
CALL DWORD PTR[SI]返回指令返回指令从堆栈中弹出断点地址,返回原程序。
格式:
RET
RET指令一般位于子程序的最后。4. 中断指令4. 中断指令中断与过程调用:
中断是随机事件或异常事件引起,调用则是事先已在程序中安排好 ;
响应中断请求不仅要保护断点地址,还要保护FLAGS内容;
调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。中断指令中断指令格式:
INT n
说明:
nх4 =存放中断服务子程序入口地址的单元地址中断类型码
n=0 〜 255n х4 XXHXXHXXHXXH入口偏移地址IP入口段地址CS中断指令中断指令操作:
将FLAGS压入堆栈;
将INT指令下一条指令的CS、IP压栈;
取中断服务程序入口地址。 中断指令例中断指令例INT 21HIPLIPHCSLCSHSP=1200FLAGSLFLAGSHSP=11FA执行INT指令后保护断点中断指令例中断指令例执行INT 21H指令后
IP=?
CS=?21Hх4
=0084H 23H11H00H20HIP CS溢出中断指令溢出中断指令格式:
INTO
若OF=1,则启动一个类型为4的中断过程,给出一个出错标志,如果OF=0,不做任何操作。
INTO指令通常安排在有符号数加减运算指令之后。相当于INT 4中断返回指令中断返回指令格式:
IRET
中断服务程序的最后一条指令,负责恢复断点
恢复标志寄存器内容5.3.6 处理器控制指令5.3.6 处理器控制指令对标志位的操作
与外部设备的同步