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

43
第第第 第第第 第第第 8086/8088 8086/8088 第第第第第第第第 第第第第第第第第 2006.11.14 第第第第 () 第第第第1. 第第第第 2. 第第第第第第第第

Upload: julian-patterson

Post on 30-Dec-2015

106 views

Category:

Documents


14 download

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

TRANSCRIPT

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

第九讲第四章 第四章 8086/80888086/8088 汇编语言程序设计汇编语言程序设计

2006.11.14 (星期二)

主要内容:

1. 中断指令

2. 汇编语言程序设计

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

介绍几条指令: 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 (星期二)

类型 0~3 的中断称为内部中断。

类型 0 :指令系统没有 INT0 这条指令

除数为 0 中断

除数为 0 :它既不是外部中断 也不是软件中断。

是由 CPU 自身产生的,所以无对应中断指令。

有符号数进行除法所得的商超出规定范围

有符号数进行除法运算,所得的商超出规定范围,

CPU 自动产生类型为 0 的中断,转入响应的中断处理程序。

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

内存内存 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 (星期二)

∴ 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 (星期二)

六、处理器控制指令

(一)标志处理指令

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 (星期二)

4.1 概述4.2 汇编语言的基本语法4.3 汇编语言程序设计的基本方法4.4 DOS/BIOS 中断调用

4.1 概述汇编语言程序的上机处理过程

主要的汇编程序: MASM 、 TASM

第四章 第四章 8086/80888086/8088 汇编语言程序设计汇编语言程序设计

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

例:求从 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 (星期二)

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 (星期二)

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 (星期二)

变量

内存单元的名字 , 由 DB/DW/DD/DQ/DT 定义

BUF DB ?MOV BUF,AL

变量的三种属性:段值 SEG偏移量 OFFSET类型 BYTE/WORD/...

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

标号

指令存放单元的符号地址 , 是转移 / 调用 / 循环指令的操作数

标号的三种属性:段值 SEG偏移量 OFFSET类型 NEAR/FAR

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

表达式

由操作数和运算符组成的序列

操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量)

运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算符

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

数值返回运算符(分析运算符)

SEG 变量 / 标号OFFSET 变量 / 标号TYPE 变量 / 标号

变量返回类型: 1 字节、 2 字、 4 双字标号返回类型: -1NEAR 、 -2FAR

LENGTH 变量:返回变量的个数SIZE 变量:返回变量所占地字节数

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

2. 指令语句

标号: 指令助记符 操作数 ;注释

START : MOV AX , DATA;将 DS 初始化为数据段首

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

3. 伪指令语句

名字 伪操作命令 操作数 ;注释

符号定义语句定义符号常量

PRICE EQU 281PORT = 6PORT = PORT +1

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

数据定义语句

定义变量、分配存储单元等

变量名 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 (星期二)

段定义语句

过程定义语句(子程序定义)

程序结束语句

END 表达式

表达式为程序的第一条指令的地址

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

汇编语言的基本语法常量

数值常量 , 01000101B, 32, 0F1D4H符号常量(用 EQU 或 = 定义)

变量内存单元的名字 , 由 DB/DW/DD/DQ/DT 定义标号

指令存放单元的符号地址 , 是转移 / 调用 / 循环指令的操作数

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

指令语句

执行性的语句,汇编时汇编程序将其转换成机器目标代码标号: 指令助记符 操作数 ;注释伪指令语句

说明性的语句,为汇编程序提供进行汇编所需要的有关信息,如定义符号、分配存储单元等,不生成目标代码名字 伪操作命令 操作数 ;注释

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

分类 助记符• 符号定义伪指令 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 (星期二)

实模式汇编语言源程序的结构——完整的段定义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 (星期二)

段寄存器定义伪指令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 (星期二)

分支结构

程序段 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 (星期二)

程序段 N

后继程序段 Y

条件JZ LY

LY: …… …...

…...

TEST AX, 1

分支结构

N Y

IF … THEN

LN:

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

循环结构

DO-UNTIL

初始化部分

循环体

修改部分

条件

初始化部分

循环体

修改部分

条件

后继程序

WHILE-DO

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

循环控制:计数控制 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 (星期二)

例:从 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 (星期二)

子程序设计过程定义过程名 PROC [ 类型 ] …… ; 指令序列 RET ; 过程返回指令过程名 ENDP

类型:NEAR——与主程序在同一个段FAR —— 可以与主程序不在同一个段

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

子程序设计过程调用

近程调用

CALL 过程名

•将当前 IP 寄存器内容进栈(保存 CALL 下一条指令的偏移地址)•将被调用过程的偏移地址送 IP 寄存器,控制程序转移到该过程

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

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 (星期二)

远程调用

CALL FAR PTR 过程名

•将当前 CS 寄存器内容进栈(保存 CALL 下一条指令的段地址)•将当前 IP 寄存器内容进栈(保存 CALL 下一条指令的偏移地址)•将被调用过程的偏移地址送 IP 寄存器,段地址送 CS 寄存器,控制程序转移到该过程

过程调用

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

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 (星期二)

子程序设计返回指令

REP

REP n实现返回功能,并调整 SP ,即

SP+n SP

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

例例 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 (星期二)

例 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 (星期二)

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 (星期二)

程序如下:程序如下: 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 (星期二)

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 (星期二)

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 (星期二)

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 (星期二)

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 (星期二)

作业:自学:字符串输入( 0AH ),P171

4.2 , 4.4 , 4.6