字符串操作指令_第1页
字符串操作指令_第2页
字符串操作指令_第3页
字符串操作指令_第4页
字符串操作指令_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3隐含规定源串必须放在数据段,用SI寻址。DS:[SI]表示元素;

目的串必须在附加段,用DI寻址。ES:[DI]表示元素;要习惯元素(存储单元)的表达方式!4

配合使用重复前缀REP

指令加上重复前缀,如虎添翼。

串计数器必须用CX

先从总体上了解此类指令的操作。源:::目:SI+NSIDI+NDISISI-NDIDI-N用CLD(ClearDF)设置DF=0,增址修改;也可用STD,设置减址AL/AX/EAXAL/AX/EAX关键字AL/AX/EAXDF:标志寄存器中的D10string1

string2

N=1/2/4

数据段

附加段

DS

ES

串传送MOVSB/W/DDS:[SI]

ES:[DI]串装入LODSB/W/DDS:[SI]AL/AX/EAX串存储STOSB/W/DAL/AX/EAX

ES:[DI]串比较CMPSB/W/DDS:[SI]—

ES:[DI]串扫描SCASB/W/D关键字(AL/AX/EAX)—ES:[DI](1)串传送指令MOVeString基本格式

MOVSB/MOVSW/MOVSD

字节字双字

指令的三个‘动作’:

DS:[SI]

ES:[DI](传送)

SI±NSI(修改“源”)

DI±NDI(修改“目的”)CLD

CLearDFDF=0,增址修改STDSeTDF

DF=1,减址修改使用该指令的辅助指令(使用该指令的准备工作)1)SI,DI赋值;2)确定增址或减址;3)传送长度

*带有重复前缀REP的格式(

REPeat前缀助记符,不能独立使用)格式:REP

MOVSB/W/D(重复次数由CX内容确定)功能:每传送一个字节,修改指针。CX-1,如果CX≠0,继续传送例:把数据段BLOCK单元开始的100个字节,依次传送到附加段BUF开始的内存区。用三种方法完成传送,目的:学习指令,比较指令。MOVSB解1:用MOV指令

MOVSI,OFFSETBLOCK ;指向源串

MOVDI,OFFSETBUF ;指向目的串

MOVCX,100 ;计数器初值LAST:. MOVAL,[SI]

;从源串取一字节

MOVES:[DI],AL

;送入目的串

INCSI

;指向源串下一个字符

INCDI

;指向目的串下一个字符

LOOPLAST

;传送100个字节

……….. ;CX-1,不为0转LAST解2:用MOVSB指令配合核心指令的辅助指令

MOVSI,OFFSETBLOCK

;指向源串

MOVDI,OFFSETBUF

;指向目的串

CLD

;增址修改.. MOVCX,100 ;计数器初值

LAST:.MOVSB

;传送,修改地址指针

LOOPLAST ;100个字节未完,继续

………. ;已完,……..解3用带重复前缀的传送指令REPMOVSB配合核心指令的辅助指令

MOVSI,OFFSETBLOCK

;指向源串

MOVDI,OFFSETBUF

;指向目的串

MOVCX,100

;计数器初值

CLD

;增址修改

REP.MOVSB

;传送100个字节

……….(2)取串指令LOaDfromString

基本格式LODSB/W/DDS:[SI]

AL/AX/EAX

把DS:[SI]中的一个元素送入AL/AX/EAX*没有带前缀的格式(3)存串指令STOreintoString

基本格式STOSB/W/DAL/AX/EAXES:[DI]

把一个元素AL/AX/EAX送入目的存储区*带有重复前缀REP的形式REPSTOSB/W/D(4)串比较指令CoMPareString*基本格式CMPSB/W/DDS:[SI]

和ES:[DI]的当前元素比较,并按DF标志修改地址。当前元素相等?ZF标志置1ZF标志置0指令结束CMPS指令功能示意*指令的三个‘动作’:

DS:[SI]―ES:[DI](比较)

SI±NSI(修改)

DI±NDI(修改)*带有重复前缀的串比较指令

格式1:REPE

CMPSB/W/D(REPE=REPZ)

比较,如果相等且CX≠0,重复基本指令CMPSB/W/DCX=0?CX-1CX

比较当前元素根据DF,修改SI,DI当前元素相等?停止重复操作的条件:重复次数计数器CX等于0或ZF=0;

CX等于0:计数器为0,应当停;

ZF=0:表明不相等,不满足继续比较的条件,即使CX不为0也应当停。继续重复执行的条件:重复次数计数器CX不等于0且标志ZF=1

在比较次数没有完成的情况下(CX不等于0),又满足继续比较的条件(ZF=1),所以应当继续。

指令结束,若ZF=1,表明两个串完全相等;若ZF=0,表明至少有一个元素不相等格式2:REPNE

CMPSB/W/D

比较,不相等且CX≠0,重复执行基本指令CMPSB/W/D

停止重复的条件:重复次数计数器CX等于0或ZF=1;

CX等于0:计数器为0,应当停;

ZF=1:表明相等,不满足继续比较的条件,也应当停。继续重复执行的条件:重复次数计数器CX不等于0且标志ZF=0

在比较次数没有完成的情况下(CX不等于0),又满足继续比较的条件(ZF=0),所以应当继续。CX=0?CX-1CX

比较当前元素根据DF,修改SI,DI当前元素相等?指令结束,若ZF=0,表明两个串对应元素都不相等;若ZF=1,表明至少有一个元素相等配合核心指令REPECMPSB的辅助指令例:比较ST1,ST2两个字符串,若二者相等,令AL=0;不相等令AL=FFH。设长度为20字节。MOVSI,OFFSETST1MOVDI,OFFSETST2MOVCX,20CLD

REPECMPSB;元素相等,重复比较,CX=0退出。

;如果有元素不相等,也退出

JNZNEQU;两个串不相等,转

XORAL,AL;串相等,设置AL=0JMPFINISH;无条件转

NEQU:MOVAL,0FFH;不相等,AL=FFFINISH:HLT;HALT,暂停执行指令

配合核心指令的辅助指令(5)串搜索指令SCAnString*基本格式:SCASB/W/D

功能:关键字―ES:[DI](搜索/比较)DI±N→DI(修改)*带重复前缀串搜索指令格式1REPE

SCASB/W/D

功能:比较结果相等,重复执行基本指令SCASB/W/D

格式1REPNE

SCASB/W/D

功能:比较结果不相等,重复执行基本指令SCASB/W/D例:FIRSTDB-1,35,-75,55,5,-100,0,92,-8,10

MOVCX,10;

MOVDI,OFFSETFIRSTMOVAL,0;关键字

REPNESCASB自己看(6)从端口输入字符串指令(7)向端口输出字符串指令3.2.5控制转移指令

(1)无条件转移指令JMP

。。。。。。。

JMP目的地址 。。。。。。。 。。。。。。。

目的地址: 。。。。。。。此类指令解决:如何向CPU提供目的地址的有关信息①短转移(SHORT):在段内的短距离(-128~127)转移。

②段内转移(NEAR):目标地址与转移指令都在同一段内。

③段间转移(FAR):目标地址与转移指令分别位于不同的段内,转移时CS和IP(EIP)中的值都要发生改变。格式1:段内直接转移

JMP标号

*在指令字节中,直接提供目的地址的偏移地址(有效地址)格式2:段内间接转移

JMP寄存器操作数

JMP存储器操作数*在指令字节中,把目的地址的偏移地址(有效地址)存放在寄存器或存储器中。在指令中向CPU提供的是寄存器或存储器地址信息。例:段内间接转移指令的应用DATASEGMENTORG1000HPNTRDWP11;汇编后,P11的偏移地址送PNTR字单元

DWP12;P12的偏移地址送PNTR+2字单元;(设汇编后

P11偏移地址=0039H

;P12的偏移地址=003BH)DATAENDSTD窗口

DS:1000H3900

3B00CODESEGMENTASSUMECS:CODE,DS:DATA

START:………..

MOVBX,OFFSETPNTR;BX=1000H JMP[BX];从1000H,1001H中取16位地址;0039送IP,即转向P11

;目的地址的偏移地址在存储器中。

……….. MOVSI,PNTR+2;取偏移地址,SI=003BH JMPSI

;目的地址的偏移地址在寄存器中。

…………P11: ………… …………P12: …………

格式3:段间直接转移

JMP标号.

段间间接转移

JMP内存操作数*段内转移只需把偏移地址送到IP即可,而段寄存器CS不变。段间转移CS和IP都要发生变化!(2)条件转移指令

JCC

格式:JCC

OP1

条件转移地址标号功能:满足所给条件,转移;不满足,顺序执行下一条指令

条件

P69表3.3必须会查

1)无符号数条件转移

JA 被减数大于减数 JNBEJNA 被减数小于或等于减数 JBEJNC 被减数大于或等于减数. JNB/JAEJC 被减数小于减数 JB/JNAE2)有符号数条件转移

JG 被减数(真值)大于减数(真值) JNLEJGE

被减数(真值)大于或等于减数(真值)

JNLJL 被减数(真值)小于减数(真值) JNGEJLE

被减数(真值)小于或等于减数(真值) JNG备注:JB

JumponBelow;低于JNAE

JumponNotAboveorEqual;不高于或等于JNB.JumponNotBelow.;不低于JAE..JumponAboveorEqual.;高于或等于JE

JumponEqual;等于JNE.JumponNotEqual.;不等于JPE…JumponParityEven;偶JPO.JumponParityOdd.;奇JA

JumponAbove.;高于JNBE…JumponNotBeloworEqual.;不低于或等于JNA.JumponNotAbove;不高于JBE.JumponBeloworEqual;低于或等于JNLE

JumponNotLessorEqual;不小于或等于JNL.JumponNotLess;不小于转JNGE

JumponNotGreaterorEqual;不大于或等于转JNG.JumponNotGreater.;不大于转说明:*转移范围在16位寻址方式下为64K;32位寻址方式下为4G*均不影响标志位*对于8086范围为-128~+127(3)循环控制指令LOOP

格式:LOOP

短标号

LOOPE/LOOPZ

短标号

LOOPNZ/LOOPNE

短标号

LCXZ

(CX=0)短标号

P70表3.4给出了循环控制指令的循环条件4)过程调用/返回指令*过程:子程序*调用子程序和转移的区别:是否返回。

*子程序入口地址:子程序第一条指令的第一个字节所在存储单元的地址。所谓调用子程序,就是把其入口地址送入IP或CS:IP

*CALL类指令有两个操作:保存返回地址传送入口地址*调用指令CALL格式:CALLOP1(子程序入口地址)功能:1)段内调用

把返回地址的偏移地址压入堆栈,完成“记迹”(记住回家的路),为返回主调程序作准备。把子程序的入口地址的偏移地址送入IP,转入子程序

2)段间调用*把返回地址的段基址和偏移地址都压入堆栈*IP入口地址的偏移地址

CS入口地址的段基址从寻址角度说明OP1的内容:a)段内直接调用(用得很普遍)CALL子程序名

。。。。。

CALL0023H

。。。。。0023H

子程序第一条指令。。。。。汇编后,子程序名就是子程序的入口地址例:。。。。。

CALLHEXASC

。。。。。

HEXASC

子程序第一条指令。。。。。汇编后,如果分配给HEXASC的有效地址是0023H,那么以上程序段相当于b)段内间接调用

CALL寄存器操作数

CALL存储器操作数例:CALLBX;子程序入口地址应当存放在BX中

CALLPTER;入口地址应当存放在存储器PTER字单元中c)段间直接调用

CALL子程序名d)段间间接调用

CALL存储器操作数例:注意看段间调用的汇编语言源程序格式

.486DATASEGMENTUSE16(逻辑段最大长度为64K)

PNTERDDDISP;存放子程序入口地址

DATAENDS

CODE1SEGMENTUSE16;主程序在代码段CODE1ASSUMECS:CODE1,DS:DATABEG:MOVAX,DATAMOVDS,AX

CALLFARPTRDISP;段间直接调用

CALLPNTER;段间间接调用两种调用方法,调用同一个子程序。注意体会寻址方式CODE2ENDS;子程序代码段结束

ENDBEG;整个程序结束MOVAH,4CHINT21HCODE1ENDS;主程序代码段结束;

CODE2SEGMENTUSE16;子程序在代码段CODE2ASSUMECS:CODE2

ORG0020H

DISP PROCFAR;定义子程序为远过程

MOVAH,2;DOS功能2

MOVDL,‘A’;显示‘A’ INT21H RET;返回主程序

DISP ENDP;子程序结束说明:1)CALLFARPTRDISP;段间直接调用注意:DISP的段基址和偏移地址是怎么确定的?在指令中又是怎么表达的?

必须用属性修改运算符PTR说明子程序是远过程,否则不能返回断点。

。。。。。。

CALL2812:0020

CALLFAR[0000]

。。。。。。

子程序从存储器中取入口地址,包括:基地址:偏移地址CALLFARPTRDISP段基址2812,由系统分配;偏移地址0020,由ORG确定2)该例用两种寻址方式调用同一个子程序,在屏幕上显示两个‘A’。直接寻址

间接寻址

2812:0020DS:0000

2000

1228TD窗口(5)返回指令RET1)段内返回:把返回地址的偏移地址送IP,返回主调程序

2)段间返回:把返回地址的偏移地址送IP

把返回地址的基地址送CS

2)再进行SP+N→SP的操作。(以便使SP指向堆栈中存放参数的单元,这样,在主程序中可以用POP指令很方便地取出参数。)(3)带参数的返回指令格式:RETN(N为偶数)功能:1)把返回地址送入IP或CS:IP后,RET是指令系统中唯一有不同操作码(CB/C3)的指令。当汇编程序处理“FAR”过程时,RET的代码是CB,CALL压入4字节返回地址,RET弹出4字节返回地址;处理“NEAR”过程时,RET的代码是C3,CALL压入2字节返回地址,RET弹出2字节返回地址例(RET)

。。。。。CALLSUBRLSUBRH。。。。。。。。。。。。。。。。。。。。子程序。。。。。

RET调用指令有两个动作:*把返回地址0013压入堆栈;*把子程序入口地址SUBR送入IP0010001100120013SUBR

RET指令把返回地址0013H送入IP返回断点;如果是段间调用,则段基址送入CS,0013H送入IP例(RETN):设返回地址为2815:0023,CCCC是子程序回送主程序的参数,堆栈内容如图示。执行RET4

指令1)2815:0023

送CS:IP,SP+4SP指向FFFAH

2)SP+4SP指向FFFEH,

如果执行POPAX

则:AX=CCCC主程序堆栈子程序参数

FFFF

XXFFFDCCFFFC

FF

FFFB

DD

SP+4..

FFFA

BB

FFF9EE

RET4FFF8

..28

FFF7..25

SP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论