汇编语言第六章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LAST:MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI LOOP LAST
MOV CX,100 CLD REP MOVSW
LAST: MOVSB LOOP LAST
LAST:LODSB STOSB LOOP LAST
4.串比较指令 CMPS
显式格式:CMPS DST, SRC
隐含格式:CMPSB,CMPSW,CMPSD
功能:源-目标,即([SI])-(ES:[DI]),并 且根据指令执行结果设置标志位。 REPE/REPZ CMPS :指令结束后如果Zf为1, 表明两串数据相等,Zf为0,表明至少有一个元 素不相等。
上机作业:字符串比较
设数据区有两个字节串,串1的长度为5, 串2的长度为10。
思考: 下面的代码段完成什么功能?
MOV CX,20 LAST:MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI DEC CX JNZ LAST
第6章 循环程序设计
6.1 循环结构程序设计
一、循环结构程序概述 在程序中,凡能有规则重复执行的程 序段称作循环。
包含循环程序段的程序称为循环结构
功能:源→目标,即([SI])→ES:[DI], 且自动修改SI、DI指针。 标志:不影响标志位。
动画演示
思考:如何把自buf1开始的100个字节数据 传送到buf2开始的区域中(要求用串传送指 令)。 LEA LEA MOV CLD REP SI, buf1 DI, buf2 CX, 100 MOVSB
程序名:
exa.asm
例2:求1~N自然数的和,结果存在 X字单元。 程序如下: MOV MOV DONE:ADD LOOP MOV
AX, 0 CX, N AX,CX DONE ;和它等价的指令是? [X],AX
思考题: 1.下列描述错误的是_______。 A.LOOP指令以CX为循环控制计数器 B. LOOPNE指令循环的条件是CX≠0且ZF=0 C. LOOPE指令循环的条件是CX≠0且ZF=1 D. LOOPE指令循环的条件是CX≠0且ZF=0 2.下列指令中不能构成循环条件的是()。 A. JMP B. JNZ C. LOOP D. DEC CX
6.3
操作.
串操作指令
包括串传送、存取、比较、扫描等
利用串操作指令可以直接处理两个存储
器操作数,方便地处理字符串或数据块。
串指令的特点
(1)指令格式
串指令可以显式地带有操作数,也可以使 用隐含格式。如串传送指令MOVS,可以有以下 几种格式:
显式:MOVS
隐式:MOVSB
DST, SRC
;字节传送
DSP: MOV DL , AL MOV AH , 2 INT 21H DEC CH JNZ A5 ……
例6-2:从键盘接收十进制数并存入 BX
MOV BX, 0 NEWCHAR: MOV AH, 1 INT 21H SUB AL, 30H JL EXIT ; <0退出 AL, 9 (( ( 0×10)+1 )× CMP JG EXIT 10+2 )×10+5 Bx始终放转换 CBW XCHG AX, BX 后用的数 MOV CX, 10 MUL CX XCHG AX, BX ADD BX, AX 演示 JMP NEWCHAR EXIT: ……
XOR AX, AX MOV CX,100 .WHILE CX!=0 ADD AX,CX DEC CX .ENDW MOV SUM , AX
Mov cx,100 .repeat add ax,cx dec cx .until ——
Mov cx,100 .repeat ———— ———— .untilcxz
前面的例子中语句 REP MOVSB 和它等价的程序段是什么?
LAST:MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI LAST: MOVSB LOOP LAST
串传送演示
LOOP LAST
二、串指令
2.取串指令 LODS
显式格式:LODS SRC
例题演示
隐含格式:LODSB, LODSW, LODSD
例题3:在一首址为ARY,长度为20的字符串查找 字符“*”,如果找到,则将字节单元RESULT清0, 否则为 -1。 MOV BX , -1 MOV [RESULT],-1 ;假设没找到 MOV CX,20 MOV AL,’*’ DONE:INC BX CMP AL,ARY[BX] LOOPNE DONE JNZ END1 MOV [RESULT],0 END1: HLT
要求从键盘动态输入20个数,并且
都是两位数。(bj1.asm)
x dw 201,12,130,55,44,77,-15,180,190,20 y dw ? ……….. 思考: ………….. 此程序段完成什么 MOV AX , X 功能? MOV BX , OFFSET X MOV CX , 9 L1: INC BX INC BX CMP AX , [BX] JAE L2 XCHG AX , [BX] L2: LOOP L1 MOV Y , AX
功能:源→累Leabharlann Baidu器,
即([SI]) →AL(或AX、EAX),
且自动修改SI指针。
② 自buffer1开始的10个非压缩BCD码形式存放 的十进制数转换成ASCII码,按顺序显示在屏幕 上。设DS、ES已按要求设置
LEA SI, buffer1 MOV CX, 10 CLD MOV AH , 02H
例题 6-8(142页)
• 在数组X中查找-1,找到后删除,后 续元素前移,并修改数组元素长度。 • 要求用串扫描指令SCAS
④在一首址为ARY长度为20的字符串查找字符 “*”,如果找到,则将结果单元RESULT清0, 否则结果单元为全1。
LEA DI, ARY MOV [RESULT],0FFH MOV CX,20 MOV AL,’*’ REPNE SCASB JNZ END1 MOV [RESULT],0 END1: HLT
6.5 循环程序举例
例 6.1 :把 BX 中的二进制数以十六进制的 形式显示在屏幕上.
BX
1 2
3
4
…… MOV CH, 4 ; 遍数 A5: MOV CL, 4 ; 移位次数 ROL BX, CL MOV AL, BL AND AL, 0FH ADD AL, 30H ; ’0’~’9’ CMP AL, 3AH ;是否大于9 JL DSP ADD AL, 7H ; ’A’~’F’
动画
操 作 数 说 指令功能说明 明
(cx) (cx)-1,(cx≠ 0),循环 (CX) (CX)-1,(CX≠ 0), ZF=1, 循环 (CX) (CX)-1,(CX≠ 0), ZF=0, 循环
LOOP <标号 > LOOPZ <标号 > 均 为 短 标 LOOPE <标号 > 号 LOOPNZ <标号 > 范围: ( -128~127) +2 LOOPNE <标号 > JCXZ <标号 > 即:
请判断:
若串2的最后5 个字符和串1 相同,
则置FLAG单元为“Y”,否则置为“N”
STRING1 DB ‘ ….. ’ STRING2 DB ‘………..’ FLAG DB ‘Y’ MOV SI,OFFSET STRING1+4 MOV DI,OFFSET STRING2+9 MOV CX,5 STD REPE CMPSB JZ EXIT MOV FLAG , ‘N’ EXIT: MOV AH, 4CH INT 21H
例6-3:将正数 n 插入一个已整序的正数字数组(按递 增顺序)
x
dw
?
ary_head
x
ary_head dw 3,5….99 ary_end n dw dw 105 32
WHILE结构的循环控制伪指令的格式为: .WHILE 条件表达式 循环体 .ENDW UNTIL结构格式为: .REPEAT 循环体 .UNTIL 条件表达式 UNTIL结构还有一种格式: .REPEAT 循环体 .UNTILCXZ [条件表达式] ;cx←cx-1,直到cx=0或条件为真
下面代码段完成的功能?
作业
从自然数1开始累加,直到累加和大于500为止, 统计被累加的自然数的个数,并把统计的个 数送入单元 N 中,把累加和送入单元 SUM 中。 (sum1.asm) 分析:用两个寄存器,一个放累加的次数,一 个放累加的和,条件控制法.
上机作业:
把x单元开始存放的20个无符号数
中的最大数送z单元,并显示出最大数。
MOVSW
MOVSD
;字传送
;双字传送
(2)操作数
串指令可以处理累加寄存器和存储器操作
数。对于存储器操作数应先建立地址指针:
若为源操作数,则必须把源串首地址放入SI
寄存器,缺省情况寻址DS所指向的段。
若为目标操作数,则必须把目标串首地址放
入ES:DI寄存器,不允许使用段超越前缀。
(3)地址指针的修改 串指令执行后自动修改地址指针 SI、DI。 (4)方向标志 方向标志DF决定地址指针的增减 方向。 若DF=0,则地址指针增量; 若DF=1,则地址指针减量。
以下代码和前面例题的区别:
MOV BX , -1 MOV [RESULT],-1 MOV CX,20 MOV AL,’*’ DONE:INC BX CMP AL,ARY[BX] LOOPNE DONE JNZ END1 MOV [RESULT],0 END1: HLT
6.4
常用循环控制方法
1.计数器控制法: 循环次数已知 2.条件控制法 : 循环次数未知 3.逻辑尺控制法: 特殊的处理。
LEA LEA MOV CLD LOP: LODSB OR STOSB LOOP
SI, buffer1 DI, buffer2 CX, 10
AL, 30H LOP
例. 用4到5种方法编写实现以下功能的程序片断。 ① 把自buffer1开始的200个字节数据传送到 buffer2开始的区域中。
LEA SI, buffer1 LEA DI, buffer2 MOV CX,200 CLD ;===以上为公共语句======= REP MOVSB
5.串扫描指令 SCAS
(搜索关键字)
显式格式:SCAS DST
隐含格式:SCASB, SCASW, SCASD
功能:
累加器-目标,即(AL(或AX))-(ES:[DI]),并且
根据指令执行结果设置标志。
指令执行后,DI自动指向下一个元素,若Zf=1,说
明相等。
如果用REPE SCASB,指令执行后,DI自动指向下 一个元素,若Zf=1,说明串中每一个都与目标相等。
程序。
1、循环程序的组成
循环的初始状态:设置一些初值,如
设寄存器、计数器的初值等。
循环体:工作部分。
循环控制部分:控制循环的结束。
2、循环程序的结构形式:
循环初始化 循环初始化
循环控制条件
循环体
Y
循环体
循环控制条件
Y
N
6.2 循环指令 两个条件必须同时成
立,才继续循环
指令 LOOP LOOPZ LOOPE LOOPNZ LOOPNE JCXZ 指令格式
GET: LODSB OR AL ,30H MOV DL ,AL INT 21H LOOP GET
3.存串指令 STOS
显式格式:STOS DST
隐含格式:STOSB,STOSW,STOSD 功能:累加器→目标, (AL(或AX、EAX))→ES:[DI],
且自动修改DI指针。
③ 把自buffer1开始的非压缩BCD码存放的十进 制数转换成ASCII码,并放到buufer2中,字符串 长度为10字节。设DS、ES已按要求设置
-126~129
(CX)=0, 转
这些指令对状态标志位都没影响.
循环次数CX
循环次数CX
循环体
循环体
(CX)-1
CX
(CX)-1
CX
ZF=0?
N
(CX)=0?
Y
N
ZF=1?
Y N
LOOPNE/LOOPNZ
(CX)=0?
Y LOOPE/LOOPZ
LOOP操作图
例1:在屏幕上显示10行 “how do you do”,
(5)重复前缀
串指令前可以加重复前缀REPE/REPZ、 REP或REPNE/REPNZ,使后跟的串指令重复
执行。
重复次数应事先初始化在计数器CX。
二、串指令
串传送指令允许目的串和源串 都是存储器操作数,在这一点 上有别于M0V指令。
1.串传送指令 MOVS
显式格式:MOVS DST, SRC
隐含格式:MOVSB,MOVSW,MOVSD