View
181
Download
0
Category
Preview:
DESCRIPTION
第七章 简单程序设计应用. 7.1 串操作程序 7.2 代码转换 7.3 冒泡排序举例 7.4 多精度数运算举例. 7.1 串操作程序. 一、串操作指令. 串操作指令 :对串中的字节 / 字 / 双字进行传送、比较、搜索等。 串: 由连续存放于内存的若干个字节 / 字 / 双字组成的数据块。. 注意: 串操作指令寻址与其他指令有很大不同,其源操作数( 源串 )和目的操作数( 目的串 )分别隐含由 DS : [SI] 和 ES : [DI] 提供。其中源串可以是 DS 以外的其他段,但 目的串只能在 ES 段 。. - PowerPoint PPT Presentation
Citation preview
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
第七章 简单程序设计应用
7.1 串操作程序
7.2 代码转换
7.3 冒泡排序举例
7.4 多精度数运算举例
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
7.1 串操作程序
串操作指令:对串中的字节 / 字 / 双字进行传送、比较、搜索等。
串:由连续存放于内存的若干个字节 / 字 / 双字组成的数据块。
注意:串操作指令寻址与其他指令有很大不同,其源操作数(源串)和目的操作数(目的串)分别隐含由 DS : [SI] 和 ES : [DI] 提供。其中源串可以是 DS 以外的其他段,但目的串只能在 ES段。
一、串操作指令
第 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
第 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
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
STOS (串存储指令)
格式: STOS 目的串
其中目的串必须为 DI 所指向的数据单元。
执行的操作:
字节操作: [DI] ←AL , DI←DI±1
字操作: [DI] ←AX , DI←DI±2
若已确定为字节操作或字操作,可采用无操作数指令。
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
STOSB (字节存储指令)
功能: [DI] ←AL , DI←DI±1
STOSW (字存储指令)
功能: [DI] ←AX , DI←DI±2
STOSD (双字存储指令)
功能: [DI] ←EAX , DI←DI±4
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
LODS (串读取指令)
格式: LODS 源串
其中源串为 SI 所指向的数据单元。
执行的操作:
字节操作: AL←[SI] , SI←SI±1
字操作: AX←[SI] , SI←SI±2
若已确定为字节或字操作,可采用无操作数指令。
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
LODSB (字节读取指令)
功能: AL←[SI] , SI←SI±1
LODSW (字读取指令)
功能: AX←[SI] , SI←SI±2
LODSD (双字读取指令)
功能: EAX←[SI] , SI←SI±4
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
REP (重复串操作指令)
操作:①先判断 CX=0 ?,若 CX=0 ,退出 REP 操作,否则转②执行
②CX←CX-1
③ 执行相配合的串指令
重复①→③CLD 清除方向标志指令
格式: CLD
功能: DF←0 ,可使地址自动增 1 、增 2 或增 4 。
第 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 ,重复执行。
第 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
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
SCAS (串搜索指令)
格式: SCAS 目
用于搜索在数据块中是否存在某一关键字。SCASB (字节搜索指令)
功能: AL-[DI] , DI←DI±1
SCASW (字搜索指令)
功能: AL-[DI] , DI←DI±2
SCASD (双字搜索指令)
功能: AL-[DI] , DI←DI±4
第 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
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
不用串处理指令,可用下列程序段代替 REP MOVSB
AGAIN : JCXZ STOP
MOV AL , [SI]
MOV [DI] , AL
INC SI
INC DI
JMP AGAIN
STOP : ……
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
二、串操作程序
例:数据串传送程序,把 SI 缓冲区的数据依次传送到 S2 缓冲区中。
DATA SEGMENT
S1 DB ‘AGIGDFSAASLJSFJSL’
LEN EQU $-S1
DATA ENDS
EXTRA SEGMENT
S2 DB LEN DUP (?)
EXTRA SEGMENT
第 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
第 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
第 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
第 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
第 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
第 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 位二进制全部处理结束为止
第 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
第 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
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
MOV CLOSE , AL
RET
MAIN ENDP
CODE ENDS
END START
2 、数制转换为代码
例 7.6 将一字节二进制数转换成 8 字节二进制 ASCII 码字符串 。
程序清单如下:
第 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
第 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
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
7.3 冒泡排序举例
算法:
具体实现过程:从第一个数开始依次对相邻两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。表 7.1 表示了这种算法的例子,可以看出,在做了第一遍的( N 一 1 )次比较后,最小的数已经放到了最后,所以第二遍比较只需要考虑( N 一 1 )个数,即只需要比较( N 一 2 )次,第三遍则只需要做( N 一 3 )次比较……总共最多( N 一 1 )遍比较就可以完成排序。
第 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
第 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
第 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
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
7.4 多精度数运算举例
例 7.9 试编制一程序段,将一个多精度数变补。
第 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 ; 循环,直到处理完所有的位数
第 7章
《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社
Recommended