第九讲 第四章 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
第九讲第四章 第四章 8086/80888086/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)
清除 IF 、 TF ,避免进入中断以后不被外面其它中断所打断
及进入中断以后按单步执行。例: . 某中断程序入口地址为 3375H : 1234H ,放置矢量表位置为 0000H : 0180H 。问此中断类型号为 ___ ,写出入口地址在矢量表中放置顺序 ( 由低到高 )____________________ 。
类型 0~3 的中断称为内部中断。
类型 0 :指令系统没有 INT0 这条指令
除数为 0 中断
除数为 0 :它既不是外部中断 也不是软件中断。
是由 CPU 自身产生的,所以无对应中断指令。
有符号数进行除法所得的商超出规定范围
有符号数进行除法运算,所得的商超出规定范围,
CPU 自动产生类型为 0 的中断,转入响应的中断处理程序。
。
内存内存 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)
∴ 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
六、处理器控制指令
(一)标志处理指令
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
4.1 概述4.2 汇编语言的基本语法4.3 汇编语言程序设计的基本方法4.4 DOS/BIOS 中断调用
4.1 概述汇编语言程序的上机处理过程
主要的汇编程序: MASM 、 TASM
第四章 第四章 8086/80888086/8088 汇编语言程序设计汇编语言程序设计
例:求从 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 伪指令定义各段寄存器
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 ;整个程序汇编结束
初始化
4.2 汇编语言的基本语法
1. 常量、变量和表达式常量
二进制 xxxxxxxxB 01000101B八进制 xxxO 或 xxxQ 721O 或 721Q十进制 xxxx 或 xxxxD 1991 或 1991D十六进制 xxxxH 0F1D4H字符串 ‘ xxx’ 或“ xxx” ‘AB’ 以 ASCII 编码数值常量、符号常量(用 EQU 或 = 定义)
变量
内存单元的名字 , 由 DB/DW/DD/DQ/DT 定义
BUF DB ?MOV BUF,AL
变量的三种属性:段值 SEG偏移量 OFFSET类型 BYTE/WORD/...
标号
指令存放单元的符号地址 , 是转移 / 调用 / 循环指令的操作数
标号的三种属性:段值 SEG偏移量 OFFSET类型 NEAR/FAR
表达式
由操作数和运算符组成的序列
操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量)
运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算符
数值返回运算符(分析运算符)
SEG 变量 / 标号OFFSET 变量 / 标号TYPE 变量 / 标号
变量返回类型: 1 字节、 2 字、 4 双字标号返回类型: -1NEAR 、 -2FAR
LENGTH 变量:返回变量的个数SIZE 变量:返回变量所占地字节数
2. 指令语句
标号: 指令助记符 操作数 ;注释
START : MOV AX , DATA;将 DS 初始化为数据段首
3. 伪指令语句
名字 伪操作命令 操作数 ;注释
符号定义语句定义符号常量
PRICE EQU 281PORT = 6PORT = PORT +1
数据定义语句
定义变量、分配存储单元等
变量名 DB/DW/DD/DQ/DT 操作数,…,操作数
操作数可以是:数值表达式或表、字符串、?、N DUP 表达式
VAR DW ?ARRAY DB 100 DUP(0) ; DUP 为重复符号ARR2 DB 100 DUP(0 , 2DUP(3,2))
定义 500 个字节并设初始值
段定义语句
过程定义语句(子程序定义)
程序结束语句
END 表达式
表达式为程序的第一条指令的地址
汇编语言的基本语法常量
数值常量 , 01000101B, 32, 0F1D4H符号常量(用 EQU 或 = 定义)
变量内存单元的名字 , 由 DB/DW/DD/DQ/DT 定义标号
指令存放单元的符号地址 , 是转移 / 调用 / 循环指令的操作数
指令语句
执行性的语句,汇编时汇编程序将其转换成机器目标代码标号: 指令助记符 操作数 ;注释伪指令语句
说明性的语句,为汇编程序提供进行汇编所需要的有关信息,如定义符号、分配存储单元等,不生成目标代码名字 伪操作命令 操作数 ;注释
分类 助记符• 符号定义伪指令 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*
•
实模式汇编语言源程序的结构——完整的段定义DATA SEGMENT …...DATA ENDSSTACK SEGMENT STACK …...STACK ENDSCODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODESTART: ……
CODE ENDS END START
段寄存器定义伪指令ASSUME 段寄存器 : 段名 [, 段寄存器 : 段名 ,...]
•ASSUME 语句习惯上作为代码段的第一条指令•ASSUME 语句是非执行性的伪指令,段寄存器的初值必须在程序中用指令设置。
CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG MOV AX, DSEG MOV DS, AX …...
•对 CS 的赋值由操作系统装入 EXE文件时自动完成
分支结构
程序段 Y 程序段 N
条件JZ LY
LY: …… …...
LN: …...
后继程序L0: …...
JMP L0
TEST AX, 1
Y N
IF … THEN … ELSE
4.3 程序设计的基本方法
程序段 N
后继程序段 Y
条件JZ LY
LY: …… …...
…...
TEST AX, 1
分支结构
N Y
IF … THEN
LN:
循环结构
DO-UNTIL
初始化部分
循环体
修改部分
条件
初始化部分
循环体
修改部分
条件
后继程序
WHILE-DO
循环控制:计数控制 LOOP/...条件控制 JZ/...
例:计算 1+2+3+…+100
MOV AX, 0MOV BX, 0MOV CX, 64HINC BXADD AX, BXLOOP SUM
SUM:
例:从 1 开始累加奇数,直到和大于 10000 为止,统计被累加的整数个数
MOV AX, 1MOV BX, 1MOV CX, 1HINC BXINC BXADD AX, BXINC CXCMP AX , 2710HJLE SUMHLT
SUM:
子程序设计过程定义过程名 PROC [ 类型 ] …… ; 指令序列 RET ; 过程返回指令过程名 ENDP
类型:NEAR——与主程序在同一个段FAR —— 可以与主程序不在同一个段
子程序设计过程调用
近程调用
CALL 过程名
•将当前 IP 寄存器内容进栈(保存 CALL 下一条指令的偏移地址)•将被调用过程的偏移地址送 IP 寄存器,控制程序转移到该过程
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
远程调用
CALL FAR PTR 过程名
•将当前 CS 寄存器内容进栈(保存 CALL 下一条指令的段地址)•将当前 IP 寄存器内容进栈(保存 CALL 下一条指令的偏移地址)•将被调用过程的偏移地址送 IP 寄存器,段地址送 CS 寄存器,控制程序转移到该过程
过程调用
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
子程序设计返回指令
REP
REP n实现返回功能,并调整 SP ,即
SP+n SP
例例 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
分析汇编语言程序
例 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
四次比较
第一轮
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
原始数据
第四轮
程序如下:程序如下: 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
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:
排序结果
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保留最大数据,不破坏内容
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
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 :阅读程序,说明功能
作业:自学:字符串输入( 0AH ),P171
4.2 , 4.4 , 4.6