微机原理及应用
主讲:谢维成
http://xweicheng.ys168.com
scxweicheng@yahoo.com.cn
第 3章 8086指令系统
? 数据传送指令
? 算术运算指令
? 逻辑运算指令
? 串操作指令
? 控制传送指令
? CPU控制指令
3.4 IA-32的通用指令(P71)
8086汇编语言程序举例
MY_DATA SEGMENT
SUM DB ?
MY_DATA ENDS
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:MY_DATA
PORT_VAL EQU 3
MAIN PROC FAR
GO: PUSH DS
MOV AX,0
PUSH AX
MOV AX,MY_DATA
3.4 IA-32的通用指令(P71)
MOV DS,AX
MOV SUM,0
CYCLE: CMP SUM,100
JNA NOT_DONE
MOV AL,SUM
OUT PORT_VAL,AL
HLT
NOT_DONE: IN AL,PORT_VAL
ADD SUM,AL
JMP CYCLE
3.4 IA-32的通用指令(P71)
RET
MAIN ENDP
MY_CODE ENDS
END GO
1、汇编语言源程序是分段的,通常每个模块程
序包括数据段、堆栈段和若干代码段。
2、每个程序结构类似,可以复制。
3.4 IA-32的通用指令(P71)
3.4.3 逻辑运算指令
AND;OR;NOT;XOR
移位指令:
SAL;SAR;SHL;SHR
ROL;ROR;RCL;RCR
3.4.3 逻辑运算指令
循环移位
最低位最高位 最低位 最高位
返回
CFCF
(c) RCL
(a) ROL
最高位 最低位 最高位 最低位
CF
(b) ROR
CF
(d) RCR
3.4.3 逻辑运算指令
从功能示意图可知,ROL和ROR在移位时未把CF包含
在循环圈中,而RCL和RCR却把CF包含在循环圈内。
4条循环移位指令只影响标志位CF和OF。
用非循环移位指令时,左移一位相当于原数乘2(不
能超过数的表示范围),而右移一位相当于原数除2。
当编程乘以或除以某一常数时,采用移位指令执行
速度要快得多。
返回
3.4.3 逻辑运算指令( P95)
例:X*10,设X在AL中(第3版在P?,第4版在P95)
MOV BL,10
MUL BL
共需70~77个T状态时间(查阅附录1)
返回
3.4.3 逻辑运算指令
采用移位和加指令: 需T状态
SAL AL,1 ; 2T X*2
MOV BL,AL ; 2T
ADD AL,AL ; 3T X*4
ADD AL,AL ; 3T X*8
ADD AL,BL ; 3T X*10
只需13个T状态时间,用M UL指令需要70-77
个T状态时间。
3.4.3 逻辑运算指令
例3-1:ASCII码→BCD码(3版在P?,4版在P95)
35H→05H 33H→03H
(1)AND AL,OFH ;
(2)SUB AL,30H ;
(3)MOV CL,04 ;
SAL AL,CL ;
3.4.3 逻辑运算指令
例3-2: BCD码→ASCII码(3版在P?,4版在P100)
设在 1000H开始存有四个组合的B CD码12、34、56 、
78要求转换为ASCII码存放在3000H开始的单元中去。
思路:
12H→01H、02H 01H→31H 02H→32H
(1)AND AL,OFH ;
(2)ADD AL,30H ;OR AL,30H
(3)MOV CL,04 ;
SHR AL,CL ;
3.4.3 逻辑运算指令
MOV SI,1000H ;SI←BCD首址
MOV DI,3000H ;DI←ASCII首址
MOV CX,4 ;置计数器初值
BBB:MOV AL,[SI] ;AL←BCD码,第一次取12
MOV BL,AL ;暂存第一次
AND AL,0FH ;去高4位 02
OR AL,30H ;得低4位ASCII码(32)
MOV [DI],AL ;存ASCII码,[3000H](32H)
INC DI ;DI加1
MOV AL,BL ;恢复AL
PUSH CX ;保存CX
MOV CL,4
3.4.3 逻辑运算指令
SHR AL,CL ;逻辑右移 4位
OR AL,30H ;得高 4位 ASCII码
MOV [DI],AL ;存 ASCII码
INC DI ; DI加 1
INC SI ; SI加 1
POP CX ;恢复 CX
DEC CX ; (CX)← (CX)-1
JNZ BBB ; (CX)=0? 否转
INT 20H ;是 ,结束
3.4.4 串操作指令
串操作指令共5条,它们的共同特点是:
①一般用 DS:SI寻址源操作数 ,用 ES:DI寻址目的操作数
②每次串操作后 ,SI和 DI的内容会自 动修改 ,若 DF=0,SI
和 DI按增量修改 ,若 DF=1,SI和 DI按减量修改
③有的串操作指令前面可加重复前缀 REP,于是该指令
重复执行 ,直至 (CX)=0为止
返回
3.4.4 串操作指令
⒈串传送指令MOVSB/MOVSW
MOVS DST,SRC
功能: ((ES):(DI))← ((DS):(SI))
要求:
① SRC用 DS:SI寻址 ,DST用 ES:DI寻址
②传送是字节还是字 ,决定两个操作数的
定义类型 .
不能 MOVSB DST,SRC
本指令不影响标志位
3.4.4 串操作指令
⒉串比较指令 CMPSB/CMPSW
执行的操作:((DS):(SI))-((ES):(DI))
比较的结果只反映在标志位上。
本指令可用来检查两个串是否相等。
3.4.4 串操作指令
⒊串搜索指令SCASB/SCASW
功能:
对字节: (AL)-((ES):(DI))
对字: (AX)-((ES):(DI))
可见搜索指令执 行的 仍是 比较 (相减 )操作 ,结果
只 影 响 标志位。通常把要搜索的关建字放在 AL(字节 )
或 AX(字 )中。
3.4.4 串操作指令
⒊串搜索指令SCASB/SCASW
SCAS指令加上前缀 REPZ或 REPE,可 解 释为逐个进
行比较,若比较结果相等(Z F=1)且串未结束(C X≠ 0),
则继续比较。
若S CAS指令加上前缀 REPNZ或 REPNE则表示,若比
较结果不相等(Z F=0)且串未结束(C X≠ 0)则继续比较。
3.4.4 串操作指令
例:在E S段中从1000H开始存有10个A SCII码, 搜 索 ’E’,
若找到记下搜索次数及存放地址,并在屏幕上显示 ’Y’,
若未找到,则显示 ’N’。 (P102)
MOV DI,1000H ; (DI)←串首址
MOV BX,DI ;暂存
MOV CX,0AH ; (CX)←串长度
MOV AL,45H ; (AL)← ’E’
CLD ;让 DF=0,增量修改 DI
REPNZ SCASB ;若未找到 ,继续搜索 ZF← (AL)-((DI))
JZ FOUND ;找到 ,转 FOUND (DI) ← (DI)+1
MOV DL,’N’ ;串中无 ’E’,(DL)← ’N’ (CX)← (CX)-1
3.4.4 串操作指令
JMP DONE ;转 DONE
FOUND: DEC DI ; (DI)-1
MOV ADDR,DI ; ADDR← ’E’的地址
SUB DI,BX
MOV NUM,DI ; NUM←搜索次数
MOV DL,’Y’ ; (DL)← ’Y’
DONE: MOV AH,02
INT 21H
INT 20H
3.4.4 串操作指令
⒋取串指令LODSB/LODSW
执行的操作为:
对字节: (AL)← ((DS):(SI))
对字: (AX)← ((DS):(SI))
取串指令通常不加重复前缀,本指令不影响标志位
3.4.4 串操作指令
例:前面讲B CD码 的 加 法 十 进 制 调 整 指 令 AAA时 ,曾 举
过一例: 2658+3619=?(6277)
下面要求将和的结果送显示, 为此,要先化成ASCII码
再送显示。
3.4.4 串操作指令
图示:
3.4.4 串操作指令
程序段如下代码:
LEA SI,SUM+3 ; (SI)← SUM+3
MOV CX,4 ; (CX)←和长度
STD ;置 DF=1,减量修改 SI
MOV AH,02 ; (AH)←功能号
LP: LODSB ;取 BCD码至 AL,且 (SI)← (SI)-1
ADD AL,30H ;转换为 ASCII码
MOV DL,AL ; (DL)←字符
INT 21H
DEC CX
JNZ LP
┇
3.4.4 串操作指令
⒌存串指令 STOSB/STOSW
该指令的操作为:
对字节: ((ES):(DI))← (AL)
对字: ((ES):(DI))← (AX)
该指令若加上重复前缀R EP,则操作将一 直重复
进行下去,直至(CX)=0。 STOS指令不影响标志位
3.4.4 串操作指令
例 : 我 们 曾 举 过 一 个 例 子 :将1000H开始的100个存
储单元送上ASCII码2AH(*)。程序段如下:
MOV DI,1000H
MOV CX,64H
MOV AL,2AH
AGAIN:MOV [DI],AL
INC DI
DEC CX
JNZ AGAIN
INT 20H ;若(CX)=0,返回DOS
3.4.4 串操作指令
现采用存串指令,则程序段改动如下:
MOV DI,1000H
MOV AL,’*’
MOV CX,64H
CLD ;让 DF=0,增量修改 DI
REP STOSB ; (DI)← (AL),(DI)← (DI)+1
INT 20H (CX) ← (CX)-1
3.4.4 串操作指令
综合应用
MOV DI, 1000H
MOV CX, 64H
MOV AL, 2AH
AGAIN: MOV [DI], AL
INC DI
DEC CX
JNZ AGAIN
INT 20H ;若 (CX)=0,返回 DOS
REP STOSB