第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)

Preview:

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 Presentation

Citation preview

第九讲第四章 第四章 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