33
第7第 IBM PC 80X86 汇汇汇汇汇汇汇汇汇汇汇汇汇汇汇 第第第 第第第第第第第第 7.1 汇汇汇汇汇 7.2 汇汇汇汇 7.3 汇汇汇汇汇汇 7.4 汇汇汇汇汇汇汇汇

第七章 简单程序设计应用

  • Upload
    bozica

  • View
    181

  • Download
    0

Embed Size (px)

DESCRIPTION

第七章 简单程序设计应用. 7.1 串操作程序 7.2 代码转换 7.3 冒泡排序举例 7.4 多精度数运算举例. 7.1 串操作程序. 一、串操作指令. 串操作指令 :对串中的字节 / 字 / 双字进行传送、比较、搜索等。 串: 由连续存放于内存的若干个字节 / 字 / 双字组成的数据块。. 注意: 串操作指令寻址与其他指令有很大不同,其源操作数( 源串 )和目的操作数( 目的串 )分别隐含由 DS : [SI] 和 ES : [DI] 提供。其中源串可以是 DS 以外的其他段,但 目的串只能在 ES 段 。. - PowerPoint PPT Presentation

Citation preview

Page 1: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第七章 简单程序设计应用

7.1 串操作程序

7.2 代码转换

7.3 冒泡排序举例

7.4 多精度数运算举例

Page 2: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

7.1 串操作程序

串操作指令:对串中的字节 / 字 / 双字进行传送、比较、搜索等。

串:由连续存放于内存的若干个字节 / 字 / 双字组成的数据块。

注意:串操作指令寻址与其他指令有很大不同,其源操作数(源串)和目的操作数(目的串)分别隐含由 DS : [SI] 和 ES : [DI] 提供。其中源串可以是 DS 以外的其他段,但目的串只能在 ES段。

一、串操作指令

Page 3: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

1 、与 REP 匹配使用的 MOVS 、 STOS 、 LODS 指令。

MOVS 串传送指令

格式: MOVS 目的串,源串

其中源串为 SI 指向的数据单元,目的串为 DI 所指向的附加段的数据单元。

所执行操作:

字节操作:[ DI] ←[SI] , SI←SI±1 , DI←DI±1

字操作: [ DI] ←[SI] , SI←SI±2 , DI←DI±2

Page 4: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

MOVSB (字节传送指令)

功能:[ DI] ←[SI] , SI←SI±1 , DI←DI±1

MOVSW (字传送指令)

功能:[ DI] ←[SI] , SI←SI±2 , DI←DI±2

MOVSD (双字传送指令)

功能:[ DI] ←[SI] , SI←SI±4 , DI←DI±4

Page 5: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

STOS (串存储指令)

格式: STOS 目的串

其中目的串必须为 DI 所指向的数据单元。

执行的操作:

字节操作: [DI] ←AL , DI←DI±1

字操作: [DI] ←AX , DI←DI±2

若已确定为字节操作或字操作,可采用无操作数指令。

Page 6: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

STOSB (字节存储指令)

功能: [DI] ←AL , DI←DI±1

STOSW (字存储指令)

功能: [DI] ←AX , DI←DI±2

STOSD (双字存储指令)

功能: [DI] ←EAX , DI←DI±4

Page 7: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

LODS (串读取指令)

格式: LODS 源串

其中源串为 SI 所指向的数据单元。

执行的操作:

字节操作: AL←[SI] , SI←SI±1

字操作: AX←[SI] , SI←SI±2

若已确定为字节或字操作,可采用无操作数指令。

Page 8: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

LODSB (字节读取指令)

功能: AL←[SI] , SI←SI±1

LODSW (字读取指令)

功能: AX←[SI] , SI←SI±2

LODSD (双字读取指令)

功能: EAX←[SI] , SI←SI±4

Page 9: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

REP (重复串操作指令)

操作:①先判断 CX=0 ?,若 CX=0 ,退出 REP 操作,否则转②执行

②CX←CX-1

③ 执行相配合的串指令

重复①→③CLD 清除方向标志指令

格式: CLD

功能: DF←0 ,可使地址自动增 1 、增 2 或增 4 。

Page 10: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

2 、与 REPE/REPZ 和 REPNE/REPNZ 联合工作的 CMPS 和SCAS 指令。

STD 清除方向标志指令

格式: STD

功能: DF←1 ,可使地址自动减 1 、减 2 或减 4 。

REPE/REPZ (相等或为零时重复)

即 CX=0 或 ZF=0 时退出,否则 CX←CX-1 ,重复执行。REPNE/REPNZ (不相等或不为零时重复)

即 CX=0 或 ZF=1 时退出,否则 CX←CX-1 ,重复执行。

Page 11: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

CMPS (串比较指令)

格式: CMPS 源,目; [SI]-[DI]

CMPSB 字节比较指令

功能: [SI]-[DI] , SI←SI±1 , DI←DI±1

CMPSW 字比较指令

功能: [SI]-[DI] , SI←SI±2 , DI←DI±2

CMPSD 双字比较指令

功能: [SI]-[DI] , SI←SI±4 , DI←DI±4

Page 12: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

SCAS (串搜索指令)

格式: SCAS 目

用于搜索在数据块中是否存在某一关键字。SCASB (字节搜索指令)

功能: AL-[DI] , DI←DI±1

SCASW (字搜索指令)

功能: AL-[DI] , DI←DI±2

SCASD (双字搜索指令)

功能: AL-[DI] , DI←DI±4

Page 13: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

例:要把数据段 1000 开始的 200 个字节内容传送到 1100H 开始处。用串处理指令来完成的程序段如下:

MOV SI , 1000H

MOV DI , 1100

MOV CX , 200

MOV AX , DS

MOV ES , AX

CLD

REP MOVSB

Page 14: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

不用串处理指令,可用下列程序段代替 REP MOVSB

AGAIN : JCXZ STOP

MOV AL , [SI]

MOV [DI] , AL

INC SI

INC DI

JMP AGAIN

STOP : ……

Page 15: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

二、串操作程序

例:数据串传送程序,把 SI 缓冲区的数据依次传送到 S2 缓冲区中。

DATA SEGMENT

S1 DB ‘AGIGDFSAASLJSFJSL’

LEN EQU $-S1

DATA ENDS

EXTRA SEGMENT

S2 DB LEN DUP (?)

EXTRA SEGMENT

Page 16: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

CODE SEGMENT

ASSUME CS : CODE , DS : DATA , ES : EXTRA

START : MOV AX , DATA

MOV DS , AX

MOV AX , EXTRA

MOV ES , AX

MOV SI , OFFSET S1

MOV DI , OFFSET S2

MOV CX , 26

CLD

REP MOVSB

MOV AH , 4CH

INT 21H

CODE ENDS

END START

Page 17: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

例:比较两个字符串,若相同,标志单元 FLAG 置 0 ,否则置 -1 。

DATA SEGMENT

STR1 DB ‘ABCDEFGH’

STR2 DB ‘ABCDEFGH’

COUNT EQU $-STR2

DATA ENDS

CODE SEGMENT

ASSUME CS : CODE , DS : DATA , ES : DATA

START : MOV AX , DATA

Page 18: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

MOV DS , AX

MOV ES , AX

MOV SI , OFFSET STR1

MOV DI , OFFSET STR2

MOV CX , COUNT

CLD

REPZ CMPSB

JNZ UNEQU

MOV AL , 0

JMP NEXT

UNEQU : MOV AL , 0FFH

NEXT : MOV FLAG , AL

MOV AH , 4CH

INT 21H

CODE ENDS

END START

Page 19: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

例 7.2 查找指定字符串中是否含有子字符串,若有,则给 RESU 单元置子字符串在串中的偏移地址,否则给 RESU 单元置- 1 。 DATA SEGMENT

STRING DB ‘this is an example’

TRLEN EQU $ - STRING

SUB DB ‘xamp’

SUBLEN EQU $ - SUB

RESU DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS : CODE , DS : DATA , ES : DATA

Page 20: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

START : MOV AX , DATA

MOV DS , AX

MOV EX , AX

MOV BX , STRLEN

LEA SI , STRING

MOV AX , SI

LOP : LEA DI , SUB

MOV CX , SUBLEN

CLD

REPZ CMPSB

JZ Y

INC AX

MOV SI , AX

DEC BX

JNZ LOP

MOV RESU , 0FFH

JMP EXIT

Y : SUB AX, OFFSET STRING

MOV RESU , AL

EXIT : MOV AH , 4CH

INT 21H

CODE ENDS

END START

Page 21: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

7.2 代码转换一、代码转换为数制

例 7.5 将 ASCII 码表示的八位二进制数转换成一字节二进制数。

其具体算法如下:

1 )取一字节 ASCII 码的值放入 BL 中

2 ) BL←BL - 30H ;转换成 0 或 1

3 ) AL←AL∨BL

4 ) AL 左移一位后仍放入 AL 中

5 )重复上面的 1 )—— 4 )步骤,直到 8 位二进制全部处理结束为止

Page 22: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

程序代码如下:

DATA SEGMENT

BEGIN DB ‘11010001’

COUNT EQU $ - BEGIN

CLOSE DB ?

DATA ENDS

STACK SEGMENT PARA STACK‘STACK’

DB 10DUP(?)

STACK EDNS

CODE SEGMENT

ASSUME CS : CODE , DS : DATA , SS : STACK

Page 23: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

MAIN PROC FAR

START : MOV AX , DATA

MOV DS , AX

LEA SI , BEGIN ; ASCII 码串地址送 SI

MOV CX , COUNT ;循环次数送 CX

XOR AL , AL ; AL 清 0

AGAIN : SAL AL , 1

MOV BL , [SI] ;取一个字符

INC SI ; 修改指针

SUB BL , 30H ;转换为数值

OR AL , BL

LOOP AGAIN

Page 24: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

MOV CLOSE , AL

RET

MAIN ENDP

CODE ENDS

END START

2 、数制转换为代码

例 7.6 将一字节二进制数转换成 8 字节二进制 ASCII 码字符串 。

程序清单如下:

Page 25: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

DATA SEGMENT

BEGIN DB 11011110B

CLOSE DB 8 DUP(?)

COUNT EQU $ - CLOSE

DATA ENDS

CODE SEGMENT

ASSUME DS : DATA , CS : CODE

MAIN PROC FAR

START : MOV CX , COUNT

LEA DI , CLOSE

AGAIN : MOV AL , 30H

MOV BL , BEGIN

Page 26: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

TEST BL , 10000000B

;测试 BL 中的最高位是否为 0

JZ NEXT ;是,转 NEXT

INC AL ;否, AL=AL+1

NEXT : MOV [DI] , AL ;存放结果

SAL BL , 1 ;取 BL 的下一位

INC DI ;修改结果指针

LOOP AGAIN

RET

MAIN ENDP

CODE ENDS

END START

Page 27: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

7.3 冒泡排序举例

算法:

具体实现过程:从第一个数开始依次对相邻两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。表 7.1 表示了这种算法的例子,可以看出,在做了第一遍的( N 一 1 )次比较后,最小的数已经放到了最后,所以第二遍比较只需要考虑( N 一 1 )个数,即只需要比较( N 一 2 )次,第三遍则只需要做( N 一 3 )次比较……总共最多( N 一 1 )遍比较就可以完成排序。

Page 28: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

例 7.8 有一个首地址为 a 的 N 字数组,请编制程序使该数组中的数按照从大到小的次序整序。

;冒泡排序程序清单如下:

DATA SEGMENT ;定义数据段

ARR DW 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,11 , 12 , 20

DW 18 , 14 , 17 , 16 , 15 , 13 , 19

COUT EQU ( $ - ARRAY ) / 2

DATA ENDS

CODE SEGMENT ;代码段开始

ASSUME CS : PROG , DS : DATA

Page 29: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

START :

MOV AX , DATA ; ;设置数据段初值

MOV DS , AX

MOV CX , COUT ;置循环次数

LAB1 : MOV DI , CX

MOV BX , 0

LAB2: MOV AX , ARR[BX] ;取数组第一个数

CMP AX , ARR[BX + 2] ;与第二个数比较

JGE CONTI ;大于转 CONT1

XCHG AX , ARR[BX + 2] ;交换顺序

MOV ARR[BX] , AX

Page 30: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

CONTI : ADD BX , 2 ;取下一个数

LOOP LAB2

MOV CX , DI

LOOP LAB1

MOV AH , 4CH ;返回 DOS

INT 21H

CODE ENDS ;代码段结束

END START

Page 31: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

7.4 多精度数运算举例

例 7.9 试编制一程序段,将一个多精度数变补。

Page 32: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

程序段如下:

XOR CH,CH ;CH 清 0

MOV BL,CL

MOV DI,SI

LP1: NOT BYTE PTR[SI] ; 各位取反

INC SI ;指针加 1

LOOP LP1 ;循环,直到处理完所有位数

MOV CL,BL

STC ; 标志寄存器 CF 位置“ 1”

LP2: ADC BYTE PTR[DI],0 ; 末位加 1

INC DI

LOOP LP2 ; 循环,直到处理完所有的位数

Page 33: 第七章  简单程序设计应用

第 7章

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社