第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)
DESCRIPTION
第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二). 主要内容: 1. 中断指令 2. 汇编语言程序设计. 介绍几条指令: INT n , IRET 格式: INT n ; n— 常数或表达式, n=0—255 或 INTO 执行操作: (SP)←(SP)-2 , (SP)) ← (PSW) (SP)←(SP)-2 , (SP)) ← (CS) (SP)←(SP)-2 ,← (IP) (IP) ←(N×4) (CS) ←(N×4+2) - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/1.jpg)
第九讲第四章 第四章 8086/80888086/8088 汇编语言程序设计汇编语言程序设计
2006.11.14 (星期二)
主要内容:
1. 中断指令
2. 汇编语言程序设计
![Page 2: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/2.jpg)
介绍几条指令: INT n , IRET
格式: INT n ; n— 常数或表达式, n=0—255 或 INTO
执行操作:
(SP)←(SP)-2 , (SP)) ←(PSW)
(SP)←(SP)-2 , (SP)) ← (CS)
(SP)←(SP)-2 ,← (IP)
(IP) ←(N×4)
(CS) ←(N×4+2)
清除 IF 、 TF ,避免进入中断以后不被外面其它中断所打断
及进入中断以后按单步执行。例: . 某中断程序入口地址为 3375H : 1234H ,放置矢量表位置为 0000H : 0180H 。问此中断类型号为 ___ ,写出入口地址在矢量表中放置顺序 ( 由低到高 )____________________ 。
![Page 3: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/3.jpg)
类型 0~3 的中断称为内部中断。
类型 0 :指令系统没有 INT0 这条指令
除数为 0 中断
除数为 0 :它既不是外部中断 也不是软件中断。
是由 CPU 自身产生的,所以无对应中断指令。
有符号数进行除法所得的商超出规定范围
有符号数进行除法运算,所得的商超出规定范围,
CPU 自动产生类型为 0 的中断,转入响应的中断处理程序。
。
![Page 4: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/4.jpg)
内存内存 00 :: 0000H~0:03FFH0000H~0:03FFH 区域中,构成中断向量表,存放中断处理程序入口区域中,构成中断向量表,存放中断处理程序入口地址。每地址。每 44 个单元对应个单元对应 11 个中断源。关系如下表:个中断源。关系如下表:
中断处理程序入口地址的地址 类型
00000H~00001H 类型 0(IP)
00002H~00003H 类型 0(CS)
00004H~00005H 类型 1(IP)
00006H~00007H 类型 1(CS)
00008H~00009H 类型 2(IP)
0000AH~0000BH 类型 2(CS)
0000CH~0000DH 类型 3(IP)
0000EH~0000FH 类型 3(CS)
00010H~00011H 类型 4(IP)
00012H~00013H 类型 4(CS)
…… ……
003FCH~003FDH 类型 255(IP)
003FEH~003FFH 类型 255(CS)
![Page 5: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/5.jpg)
∴ INTO 跟在有符号数 + 、 - 后面:
* 这条指令可以写在一条算术指令后面。
若产生溢出, OF=1 ,则启动中断过程,不进行任何操作。
(2) IRET—— 从中断返回指令( Interrupt return ) 所有中断过程(服务程序)不管是硬还是软,最后一条指令一定是:
IRET 退出中断过程,返回中断时断点。
格式: IRET
执行操作:执行操作: (IP)←((SP)+1,(SP)) , (SP) ←(SP)+2
(CS)←((SP)+1,(SP)) , (SP) ←(SP)+2
( PSW)←((SP)+1,(SP)) , (SP) ←(SP)+2
![Page 6: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/6.jpg)
六、处理器控制指令
(一)标志处理指令
1 、 CLC ( Clear carry flag ) 清 CF 标志2 、 STC ( Set carry flag ) 置 CF 标志3 、 CMC ( Complement carry flag ) 对 CF 求反4 、 CLD ( Clear direction flag ) 清 DF 标志5 、 STD ( Set direction flag ) 置 DF 标志6 、 CLI ( Clear interrupt flag ) 清 IF 标志7 、 STI ( Set interrupt enable flag ) 置 IF 标志 (二)其他处理机控制指令
1 、 NOP ( No operation ) 空操作2 、 HLT ( Halt ) CPU 暂停状态3 、 WAIT ( Wait while pin not asserted ) CPU 等待状态4 、 ESC ( Escape ) 交权5 、 LOCK ( Lock bus ) 总线锁定
TEST
![Page 7: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/7.jpg)
4.1 概述4.2 汇编语言的基本语法4.3 汇编语言程序设计的基本方法4.4 DOS/BIOS 中断调用
4.1 概述汇编语言程序的上机处理过程
主要的汇编程序: MASM 、 TASM
第四章 第四章 8086/80888086/8088 汇编语言程序设计汇编语言程序设计
![Page 8: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/8.jpg)
例:求从 1 开始连续 50 个奇数之和,并将结果存放在名字为 SUM的字存储单元中.其汇编源程序如下:
DATA SEGMENT ;定义数据段, DATA 为段名SUM DW 0 ;由符号(叫变量名) SUM 指定的内
存单元类型,定义一个字,初值为 0DATA ENDS ; 定义数据段结束
STACK SEGMENT STACK ;定义堆栈段,这是组合类型伪指令,它规定在伪指令
后须跟 STACK 变量名 DB 200 DUP ( 0 ) ;定义堆残段为 200 个字节的
连 续存储区,且每个字节的值为 0STACK ENDS ;定义堆栈段结束
CODE SEGMENT ;定义代码段ASSUME DS : DATA , SS : STACK ,
CS : CODE ;由 ASSUM 伪指令定义各段寄存器
![Page 9: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/9.jpg)
START : MOV AX , DATA ;将 DS 初始化为数据段首 MOV DS , AX ;地址 DATA
MOV CX , 50 ; CX 置入循环计数值 MOV AX , 0 ;清 AX 累加器
MOV BX , l ; BX 置常量 1NEXT: ADD AX , BX ;累加奇数和,计 50 次
INC BX ;求下一个奇数 INC BX DEC CX ;循环计数器作减 1 计数 JNE NEXT ;未计完 50 次时,转至
NEXT 循环 MOV SUM , AX ; 累加和送存 SUM 单元 MOV AH , 4CH ; DOS 功能调用语句,
机器 将结束本程序的运行,并返 回 DOS 状态( 4CH 为 DOS
程序的入口地址) INT 21H
CODE : ENDS ;代码段结束END START ;整个程序汇编结束
初始化
![Page 10: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/10.jpg)
4.2 汇编语言的基本语法
1. 常量、变量和表达式常量
二进制 xxxxxxxxB 01000101B八进制 xxxO 或 xxxQ 721O 或 721Q十进制 xxxx 或 xxxxD 1991 或 1991D十六进制 xxxxH 0F1D4H字符串 ‘ xxx’ 或“ xxx” ‘AB’ 以 ASCII 编码数值常量、符号常量(用 EQU 或 = 定义)
![Page 11: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/11.jpg)
变量
内存单元的名字 , 由 DB/DW/DD/DQ/DT 定义
BUF DB ?MOV BUF,AL
变量的三种属性:段值 SEG偏移量 OFFSET类型 BYTE/WORD/...
![Page 12: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/12.jpg)
标号
指令存放单元的符号地址 , 是转移 / 调用 / 循环指令的操作数
标号的三种属性:段值 SEG偏移量 OFFSET类型 NEAR/FAR
![Page 13: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/13.jpg)
表达式
由操作数和运算符组成的序列
操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量)
运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算符
![Page 14: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/14.jpg)
数值返回运算符(分析运算符)
SEG 变量 / 标号OFFSET 变量 / 标号TYPE 变量 / 标号
变量返回类型: 1 字节、 2 字、 4 双字标号返回类型: -1NEAR 、 -2FAR
LENGTH 变量:返回变量的个数SIZE 变量:返回变量所占地字节数
![Page 15: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/15.jpg)
2. 指令语句
标号: 指令助记符 操作数 ;注释
START : MOV AX , DATA;将 DS 初始化为数据段首
![Page 16: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/16.jpg)
3. 伪指令语句
名字 伪操作命令 操作数 ;注释
符号定义语句定义符号常量
PRICE EQU 281PORT = 6PORT = PORT +1
![Page 17: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/17.jpg)
数据定义语句
定义变量、分配存储单元等
变量名 DB/DW/DD/DQ/DT 操作数,…,操作数
操作数可以是:数值表达式或表、字符串、?、N DUP 表达式
VAR DW ?ARRAY DB 100 DUP(0) ; DUP 为重复符号ARR2 DB 100 DUP(0 , 2DUP(3,2))
定义 500 个字节并设初始值
![Page 18: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/18.jpg)
段定义语句
过程定义语句(子程序定义)
程序结束语句
END 表达式
表达式为程序的第一条指令的地址
![Page 19: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/19.jpg)
汇编语言的基本语法常量
数值常量 , 01000101B, 32, 0F1D4H符号常量(用 EQU 或 = 定义)
变量内存单元的名字 , 由 DB/DW/DD/DQ/DT 定义标号
指令存放单元的符号地址 , 是转移 / 调用 / 循环指令的操作数
![Page 20: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/20.jpg)
指令语句
执行性的语句,汇编时汇编程序将其转换成机器目标代码标号: 指令助记符 操作数 ;注释伪指令语句
说明性的语句,为汇编程序提供进行汇编所需要的有关信息,如定义符号、分配存储单元等,不生成目标代码名字 伪操作命令 操作数 ;注释
![Page 21: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/21.jpg)
分类 助记符• 符号定义伪指令 EQU ,=, LABEL• 数据定义伪指令 DB , DW , DD , DQ* , DT* , RE
CORD* , STRUC*• 段定义伪指令 SEGMENT , ENDS , GROUP* ,
ASSUME , ORG• 过程定义伪指令 PROC , ENDP• 模块定义与通信伪指令 EXTRN* , PUBLIC* , NAME , END• 宏处理伪指令 * MACRO* , ENDM* , LOCALA* ,
REPT* , IRPC * , IRP* , PURGE*• 条件汇编伪指令 * IF , ENDIF , IFI , IFZ , IFB , IFNB ,
IFE , IFDIF , IFDEF , IFNDEF , IFIDN , EISE
• 列表伪指令 PAGE , TITLE , SUBTTL* , LIST , XLIST , % OUT*
• 其他伪指令 COMMENT* , RADIX* , INCLUDE , EVEN*
•
![Page 22: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/22.jpg)
实模式汇编语言源程序的结构——完整的段定义DATA SEGMENT …...DATA ENDSSTACK SEGMENT STACK …...STACK ENDSCODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODESTART: ……
CODE ENDS END START
![Page 23: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/23.jpg)
段寄存器定义伪指令ASSUME 段寄存器 : 段名 [, 段寄存器 : 段名 ,...]
•ASSUME 语句习惯上作为代码段的第一条指令•ASSUME 语句是非执行性的伪指令,段寄存器的初值必须在程序中用指令设置。
CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG MOV AX, DSEG MOV DS, AX …...
•对 CS 的赋值由操作系统装入 EXE文件时自动完成
![Page 24: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/24.jpg)
分支结构
程序段 Y 程序段 N
条件JZ LY
LY: …… …...
LN: …...
后继程序L0: …...
JMP L0
TEST AX, 1
Y N
IF … THEN … ELSE
4.3 程序设计的基本方法
![Page 25: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/25.jpg)
程序段 N
后继程序段 Y
条件JZ LY
LY: …… …...
…...
TEST AX, 1
分支结构
N Y
IF … THEN
LN:
![Page 26: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/26.jpg)
循环结构
DO-UNTIL
初始化部分
循环体
修改部分
条件
初始化部分
循环体
修改部分
条件
后继程序
WHILE-DO
![Page 27: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/27.jpg)
循环控制:计数控制 LOOP/...条件控制 JZ/...
例:计算 1+2+3+…+100
MOV AX, 0MOV BX, 0MOV CX, 64HINC BXADD AX, BXLOOP SUM
SUM:
![Page 28: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/28.jpg)
例:从 1 开始累加奇数,直到和大于 10000 为止,统计被累加的整数个数
MOV AX, 1MOV BX, 1MOV CX, 1HINC BXINC BXADD AX, BXINC CXCMP AX , 2710HJLE SUMHLT
SUM:
![Page 29: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/29.jpg)
子程序设计过程定义过程名 PROC [ 类型 ] …… ; 指令序列 RET ; 过程返回指令过程名 ENDP
类型:NEAR——与主程序在同一个段FAR —— 可以与主程序不在同一个段
![Page 30: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/30.jpg)
子程序设计过程调用
近程调用
CALL 过程名
•将当前 IP 寄存器内容进栈(保存 CALL 下一条指令的偏移地址)•将被调用过程的偏移地址送 IP 寄存器,控制程序转移到该过程
![Page 31: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/31.jpg)
DATA SEGMENT MESSAGE DB "Hello world!",0DH,0AH,"$"
DATA ENDSSSEG SEGMENT STACK
DB 100 DUP(?)SSEG ENDSCSEG SEGMENT
ASSUME CS:CSEG,DS:DATA,SS:SSEG START:
MOV AX, DATAMOV DS, AX
CALL DISPLAYMOV AH, 4CH ;返回 DOSINT 21H
DISPLAY PROCMOV DX, OFFSET MESSAGEMOV AX, SEG MESSAGE
MOV DS, AX MOV AH, 9 ;显示以“ &” 为结尾地字符串
INT 21H
RETDISPLAY ENDP CSEG ENDS
END START
![Page 32: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/32.jpg)
远程调用
CALL FAR PTR 过程名
•将当前 CS 寄存器内容进栈(保存 CALL 下一条指令的段地址)•将当前 IP 寄存器内容进栈(保存 CALL 下一条指令的偏移地址)•将被调用过程的偏移地址送 IP 寄存器,段地址送 CS 寄存器,控制程序转移到该过程
过程调用
![Page 33: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/33.jpg)
DATA SEGMENT MESSAGE DB "Hello world!",0DH,0AH,"$"
DATA ENDSSSEG SEGMENT STACK
DB 100 DUP(?)SSEG ENDSCSEG SEGMENT
ASSUME CS:CSEG,DS:DATA,SS:SSEG START:
MOV AX, DATAMOV DS, AX
CALL FAR PTR DISPLAYMOV AH, 4CHINT 21H
DISPLAY PROC FARMOV DX, OFFSET MESSAGEMOV AX, SEG MESSAGE
MOV DS, AX MOV AH, 9
INT 21H
RETDISPLAY ENDP CSEG ENDS
END START
![Page 34: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/34.jpg)
子程序设计返回指令
REP
REP n实现返回功能,并调整 SP ,即
SP+n SP
![Page 35: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/35.jpg)
例例 11 :程序如下,完成什么功能::程序如下,完成什么功能: DATA SEGMENT DATA SEGMENT
D1 DW -123H ;D1 DW -123H ; 补码为补码为 FEDDHFEDDH
D2 DW -120H ;D2 DW -120H ; 补码为补码为 FEE0HFEE0H
DATA ENDSDATA ENDS
CODE SEGMENTCODE SEGMENT
ASSUME CS:CODE,DS:DATA ;ASSUME CS:CODE,DS:DATA ; 说明代码段、数据段说明代码段、数据段 BEGIN: MOV AX,DATABEGIN: MOV AX,DATA
MOV DS,AX ;MOV DS,AX ; 给给 DSDS 赋段值赋段值 MOV BX,D1MOV BX,D1
CMP BX,D2CMP BX,D2
JGE NEXTJGE NEXT
MOV BX,D2MOV BX,D2
NEXT: MOV AH,4CHNEXT: MOV AH,4CH
INT 21HINT 21H
CODE ENDSCODE ENDS
END BEGINEND BEGIN
分析汇编语言程序
![Page 36: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/36.jpg)
例 2 :关于按大小的排序程序(发泡)
小数在前排序。两两比较,保证前一个数据比后一个数据小N 个数,第 1 轮要进行 N-1 次比较,最大的沉底;剩余 N - 1 个数,第 2 轮进行 N - 2 次比较。若比较伦次用 (i) 表示,该轮次的比较次数为( N - i )
10
3
7
6
5
原始数据
3
10
7
6
5
一次比较
3
7
10
6
5
二次比较
3
7
6
10
5
三次比较
3
7
6
5
10
四次比较
第一轮
![Page 37: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/37.jpg)
3
7
6
5
10
一次比较
3
6
7
5
10
二次比较
3
6
5
7
10
三次比较
3
7
6
5
10
原始数据
第二轮
3
6
5
7
10
一次比较
3
5
6
7
10
二次比较
3
6
5
7
10
原始数据
第三轮
3
5
6
7
10
一次比较
3
5
6
7
10
原始数据
第四轮
![Page 38: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/38.jpg)
程序如下:程序如下: D SEGMENT D SEGMENT
VAR DB –1,-10,-100,27H,0AOH.47HVAR DB –1,-10,-100,27H,0AOH.47H
N EQU $-VARN EQU $-VAR
D ENDSD ENDS
CSEG SEGMENTCSEG SEGMENT
ASSUME CS: CSEG,DS:DASSUME CS: CSEG,DS:D
B: MOV AX,DB: MOV AX,D
MOV DS,AX ;MOV DS,AX ; 给给 DSDS 赋段值赋段值 MOV CX,N-1 ;MOV CX,N-1 ; 每轮次比较次数每轮次比较次数 MOV DX,1 ;MOV DX,1 ; 轮次 调用次数轮次 调用次数 ii
AG:AG: CALL SUBP CALL SUBP
INC DXINC DX
LOOP AGLOOP AG
MOV AH,4CH ;MOV AH,4CH ; 返回返回 DOSDOS
INT 21HINT 21H
SUBP PROC SUBP PROC ;完成(;完成( N-N-ii )次比较)次比较 PUSH CXPUSH CX
MOV CX,NMOV CX,N
SUB CX,DX ;SUB CX,DX ; 本次比较次数(本次比较次数( NN -- ii ))
MOV SI,0MOV SI,0
RECMP: MOV AL,VARRECMP: MOV AL,VAR [[ SISI ]] ;; 取第取第 11 字节数到字节数到ALAL
CMP AL,VARCMP AL,VAR [[ SI+1SI+1 ]] JLE NOCH JLE NOCH ;前小,不动;前小,不动 XCHG AL,VARXCHG AL,VAR [[ SI +1 SI +1 ] ;大,则互] ;大,则互换换
XCHG AL,VARXCHG AL,VAR [[ SISI ] ] NOCH: INC SI NOCH: INC SI
LOOP RECMP LOOP RECMP ;CX←CX-1,;CX←CX-1,
;; 若若 CXCX 不等 于不等 于 00 则则转转
POP CXPOP CX
RET RET
SUBP: ENDP SUBP: ENDP
CSEG: ENDSCSEG: ENDS
END BEND B
LOOP语句仅对 CX 计数器进行减一操作程序中用 DX 代表比较轮次,该轮次的比较次数存于 CX
子程序中成对使用 PUSH 和 POP
![Page 39: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/39.jpg)
FFHF6H
9CH27H
A0H47H
6H
VAR:
N:
程序如下:程序如下: D SEGMENT D SEGMENT
VAR DB –1,-10,-100,27H,0AOH,47HVAR DB –1,-10,-100,27H,0AOH,47H
N EQU $-VARN EQU $-VAR ;; $$当前位置,紧接在当前位置,紧接在 447H7H
D ENDS D ENDS ;;后面的那个位置后面的那个位置
CSEG SEGMENTCSEG SEGMENT
ASSUME CS: CSEG,DS:DSEG ASSUME CS: CSEG,DS:DSEG
B: MOV AX,DB: MOV AX,D
MOV DS,AX ;MOV DS,AX ; 给给 DSDS 赋段值赋段值 MOV CX,N-1 ;MOV CX,N-1 ; 剩余轮次比较剩余轮次比较 MOV DX,1 ;MOV DX,1 ; 正进行的轮次正进行的轮次 AG:AG: CALL SUBP CALL SUBP ;两两比较子程序;两两比较子程序
INC DXINC DX
LOOP AGLOOP AG
MOV AH,4CH ;MOV AH,4CH ; 返回返回 DOSDOS
INT 21HINT 21H
9CHF6H
FFH27H
47HA0H
6H
VAR:
N:
排序结果
![Page 40: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/40.jpg)
SUBP: PROCSUBP: PROC ;;完成(完成( NN--ii )次比较)次比较 PUSH CXPUSH CX ;保护主程序循环变量;保护主程序循环变量 MOV CX,NMOV CX,N
SUB CX,DX ;SUB CX,DX ; 本次比较次数(本次比较次数( NN--ii )) MOV SI,0MOV SI,0
RECMP: MOV AL,VARRECMP: MOV AL,VAR [[ SISI ]] ;; 取第取第 11 字节数到字节数到 ALAL
CMP AL,VARCMP AL,VAR [[ SI+1SI+1 ]] JLE NOCH JLE NOCH ;前数小,不动;前数小,不动 XCHG AL,VARXCHG AL,VAR [[ SI +1 SI +1 ] ;大,则互换] ;大,则互换
XCHG AL,VARXCHG AL,VAR [[ SISI ] ] NOCH: INC SI NOCH: INC SI
LOOP RECMP LOOP RECMP ;CX←CX-1,;;CX←CX-1,; 若若 CXCX 不等 于不等 于 00则转则转
POP CX POP CX ;取出主程序循环变量;取出主程序循环变量 RET RET
SUBP: ENDP SUBP: ENDP
CSEG: ENDSCSEG: ENDS
END BEND B
(SI)= -1,(SI+1)=-10(AL)= -1
第一次互换
(SI+1)= -1(AL)= -10
第二次互换
(SI)= -10(AL)= -1
AL保留最大数据,不破坏内容
![Page 41: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/41.jpg)
STACK SEGMENT STAPN DW 100DUP (?)STACK ENDSDATA SEGMENT
NUM DB 06HSUM DB ?
DATA ENDSCODE SEGMENT_________________________START : MOV AX , DATA
MOV DS , AXCALL_____________MOV AH , 4CHINT 21H
KKK PROC FARXOR AX , AX MOV DX, AXINC DLMOV CL,NUMMOV CH , 0
BBB : ADD AL,DLINC DL
LOOP BBBMOV SUM, AL
KKK ENDPCODE ENDS END START
例 3 :在横线处填上适当语句,试确定: SP的初始值 _______, 数据段的字节数为 _________ ,当执行完 CALL 指令后,即将执行MOV 时,请回答: AX 内容为 ______ , DX 内容为 ______ ,说明程序的功能。
说明: LOOP
第一次加法,CX = 6 ;
CX = 5 ,第二次加法,
CX = 4→ 三次
CX = 3→ 四次
CX = 2→ 五次
CX = 1→ 六次
CX= 0→跳出
215H 6
ASSUME DS:DATA,SS:STACK
KKK
C8H
![Page 42: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/42.jpg)
ORG 100H
MOV CX , 5
MOV DI , 150H
BBB : MOV BL , 0FFH
MOV AL , [DI]
CMP AL , 3AH
JAE DONE
SUB AL , 30H
JB DONE
MOV BL , AL
DONE : MOV AL , BL
MOV [DI+0AH] , AL
INC DI
LOOP BBB
HLT
[DS] : [0150H] 36H
37H
42H
48H
30H
[DS] : [015AH] 6
_7
FF FF
0
例 4 :阅读程序,说明功能
![Page 43: 第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)](https://reader033.vdocuments.net/reader033/viewer/2022061423/56812b5c550346895d8f7e6d/html5/thumbnails/43.jpg)
作业:自学:字符串输入( 0AH ),P171
4.2 , 4.4 , 4.6