汇编语言 重复字符串操作前缀
汇编语言试卷
2010-2011 汇编语言程序设计期末试卷A 卷一、填空题(每空 1 分,共计10 分)1.“MOV AX,0”可寄存器AX 清0。
另外再写出三条可使寄存器AX 清0 的指令。
(1)(2)(3)2.标号可以有两种类型属性。
它们是___ 和。
3.程序设计的三种基本结构是:、、。
4.分别用一条语句实现下述指明的功能(1)双字变量DWVAR 存放的地址指针送ES 和SI。
;(2)地址表达式VAR[4]的偏移地址送字变量ADDR 。
;二、判断下列指令的正确性。
如果错误,请指出错误的原因。
(每题1 分,共计10 分)(1)MOV CX,DL(2)XCHG [SI] ,3(3)MOV AX, BX+3(4)POP CS(5)SHL AX, CX(6)MUL 16(7)AND 7FFFH,AX(8)MOV CS,AX(9)SUB [SI] ,[DI](10)MOV [SI], 20H三、简答题(每题 5 分,共计20 分)1.简述指令AND 和TEST 、NOT 和NEG 之间的区别?2.简述段内转移和段间转移的区别?3.存储器寻址方式可分为哪几种?存储单元的有效地址有什么意义?4.REP 前缀的作用是什么?能否用指令REP LODSB 读取DS:SI 所指内存中的每个字符来进行处理?若不能,试说明原因。
四、指令分析题(每题10 分,共计20 分)1.下列程序段中,各指令执行后AX 、CF、OF、ZF 和SF 的内容如何变化。
MOV AX, 0DEC AXNOT AXAND AX, 0FFFFHCMP AX, 0FFFFHSUB AX, 1200HMOV CL , 5SAR AX, 1SAR AX, CLADD AX, 0FFFFHNEG AX2.假设各寄存器及物理地址中的内容如下,(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,指出各条指令源操作数的寻址方式,以及完成后AX 寄存器中的内容(1)MOV AX,1200H(2)MOV AX,BX(3) MOV AX,[1200H](4)MOV AX,[BX](5)MOV AX,1100H[BX](6)MOV AX,[BX][SI](7)MOV AX,1100H[BX][SI]五、程序分析题(每题 5 分,共计20 分)1.下列程序段运行后,Y 单元开始的存储区存放的数据是什么?X DB 78HY DB 3 DUP(?)…LEA SI, YMOV CX, 3MOV AL, XLP: SAR AL, 1MOV [SI], ALINC SILOOP LP2.分析下列程序段的功能OR DX, DXJNS L1NOT DXNOT AXADD AX, 1ADC DX, 0L1:3.下列程序片段完成什么功能,试采用堆栈的操作实现同样的功能。
总汇编语言基础精彩试题
第一章基本知识一、单项选择题(共40分,每题2分)1.若十进制数为132.75,则其十六进制数为(B)A.21.3B.84.CC.4.6D.62.若[X补]=11111,则其十进制真值为(C)A.-31B.-15C.-1D.313.某定点整数64位,含1位符号位,补码表示,则其绝对值最大负数为(A)A.-263B.-264C.-(263-1)D.-(263-1)4.原码乘法是(D)A.用原码表示操作数,然后直接相乘B.被乘数用原码表示,乘数取绝对值,然后相乘C.乘数用原码表示,被乘数取绝对值,然后相乘D.先取操作数绝对值相乘,符号位单独处理5.在微机系统中分析并控制指令执行的部件是(C)A.寄存器B.数据寄存器C.CPUD.EU6.已知X=76,则[X]补=(B)A.76HB.4CHC.0B4HD.0CCH7.已知[X]补=80H, 则X=(D)A.80HB.0C.0FFHD.-80H8.已知[X]补=98H, 则[X]补/2=(A)A.0CCHB.4CHC.49HD.31H9.已知X=78,Y=-83则[X+Y]补=(C)A.0F5HB.0A1HC.0FBHD.65H10.在计算机的CPU中执行算术逻辑运算的部件是(A)A.ALUB.PCC.ALD.AR11.将125转换成二进制数的结果(A)A.7DHB.7CHC.7EHD.7BH12.将93H看成一个组合BCD码,其结果是(B)A.10010101B.10010011C.10000011D.1000000113.能被计算机直接识别的语言是(C)A.C语言B.汇编语言C.机器语言D.面向对象语言14.第四代计算机的逻辑电路采用的是(D)。
A.电子管B.晶体管C.中小规模集成电路D.大规模和超大规模集成电路15.可以写入数据的内存储器是(B)。
A.ROMB.RAMC.软盘D.大规模和超大规模集成电路16.掉电后存储信息消失的存储器是(B)。
A.ROMB.RAMC.软盘D.硬盘17.读写速度最慢的辅助存储器是(C)。
串操作指令与重复前缀--习题
课堂练习题目:23.若要在BUF缓冲区中寻找与AL中不相等的数据,应使用()SCASB串操作指令。
A.REPNE B.REP C.REPE D.REPNZ26.在串操作指令中,SI指向串,DI指向串。
27.如果要查找某串中与AL寄存器中有相同的字符(数),则在SCASB指令前应配合使用重复前缀。
29.段内调用指令改变中的内容。
30.段间调用指令改变中的内容。
12.现有程序段如下:CLDMOV SI,OFFSET BUF1MOV DI,OFFSET BUF2MOV CX,100REP MOVSB请回答:该程序段完成的功能是什么?13.现有程序段如下:CLDLEA DI,BUFMOV AL,20HMOV CX,100REPNZ SCASB请回答:(1)该程序段完成的功能是什么?(2)若ZF=1,表示BUF中值为20H数据(3)若BUF的首地址为0,ZF=0,执行完该程序段后DI= 。
1.使用串操作指令,将BUF缓冲区中的100个字节清0。
2.比较5个字节的字符串A和B,若两个串相等则字节标志单元FLG置0;否则清1。
答案=========================================课堂练习题目:23.若要在BUF缓冲区中寻找与AL中不相等的数据,应使用()SCASB串操作指令。
A.REPNE B.REP C.REPE D.REPNZ26.在串操作指令中,SI指向串,DI指向串。
27.如果要查找某串中与AL寄存器中有相同的字符(数),则在SCASB指令前应配合使用重复前缀。
29.段内调用指令改变中的内容。
30.段间调用指令改变中的内容。
参考答案:26.源,目的27.REPNE(REPNZ)29.IP30.CS和IP12.现有程序段如下:CLDMOV SI,OFFSET BUF1MOV DI,OFFSET BUF2MOV CX,100REP MOVSB请回答:该程序段完成的功能是什么?12.将BUF1中100个字节的数据传送到BUF2中。
北京理工大学汇编语言实验报告实验三字符串操作实验
北京理工大学汇编语言实验报告实验三字符串操作实验实验三字符串操作实验一、实验目的1)熟悉串操作指令的功能与应用;2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序;3)了解汇编语言字符串处理基本流程;二、实验软硬件环境1)硬件环境:惠普64位一体化计算机及局域网; 2)软件环境:windows 8,红蜘蛛管理系统,MASM for Win dows三、实验相关知识1)字符串操作流程SI寄存器保存源串首地址;DI寄存器保存目的串首地址;CX寄存器保存字符串长度;CLD或STD指令设置字符串处理方向;2)重复前缀指令重复次数由计数寄存器CX中存放的值决定,指令每重复执行一次,计数器CX中值减1,当CX 中值减至0时,停止重复执行,继续执行下一条指令。
寄存器的E内容条件为复前罡重复与操作直配合工作的字符串处理指令有MOVSSTOS^ LODS当REPE/REP判断计数寄存器的内容CX是否为0或ZF=O(即比较的两个操作数不等)亠只要满足一个则重复执行结束,否则继续执行。
可以与REPE/REP配合工作的串指令有CMP和SCAS0或體茴比较P判个操数数相等的内容要满足一个则重复执行结束,否则继续执行。
可以与REPE/REP配合工作的串指令有CMPS口SCAS3)字符串操作指令lodsb、lodsw :把DS:SI 指向的存储单元中的数据装入AL或AX然后根据DF标志增减SI ;stosb、stosw :把AL 或AX 中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI ;movsb movsw把DS:SI 指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF 标志分别增减SI和DI ;scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI ;cmpsb cmpsw把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI ;rep :重复其后的串操作指令。
微计算机原理基础填空题附答案
第一章:概述●计算机时钟脉冲的频率称为(主频),它的倒数称为(时钟周期)。
●冯. 诺依曼原理是基于(程序存储)和(程序控制)。
●计算机中的总线包括(地址总线)、(数据总线)和(控制总线)。
●CPU有(运算器)、(控制器)、(寄存器)和(接口单元)。
●计算机硬件系统由(CPU )、(存储器)和(I/O接口)组成。
●计算机系统由(硬件)系统和(软件)系统两大部分组成。
●CPU的字长与(数据线宽度)有关;寻址空间与(地址线宽度)有关。
●若CPU的数据线宽度为8位,则它的字长为(8 )位;地址线宽度为16位,则它的寻址空间为(64K )。
●计算机语言分为(机器)语言、(汇编)语言和(高级)语言。
●计算机软件分为(系统)软件和(应用)软件两大类。
●将源程序翻译为目标程序的语言处理程序有(汇编)程序、(解释)程序和(编译)程序。
●指令通常包含(操作码)和(操作数)两部分;不同功能指令的有序集合称为(程序)。
●正数的原、反、补码(相同);负数的原、反、补码(不同)。
●十进制数17的二进制数表示为(00010001B )。
●十六进制数17H的二进制数表示为(00010111B )。
●十进制符号数+5在计算机中的8位二进制补码表示为(00000101 )。
●十进制符号数-5在计算机中的8位二进制补码表示为(11111011 )。
●机内符号数01111000的真值为(+120 );机内符号数11111000的真值为(-8 )。
●计算机处理小数有(定点)表示法和(浮点)表示法。
●在小数的定点表示中有(纯小数)表示和(纯整数)表示。
●基本ASCII码为(7 )位编码,共(128 )个码值;含(32 )个控制码和(94 )个符号码。
●字符A的ASCII码值为41H;字符a的ASCII码值为(61H );字符B的ASCII码值为(42H )。
●十进制数89的二进制表示为(01011001 );十六进制表示为(59H )。
●十六进制数7BH的十进制数表示为(124 );二进制表示为(01111011B )。
CLDSTD汇编指令
CLDSTD汇编指令在计算机中,⼤部分数据存放在主存中,8086CPU提供了⼀组处理主存中连续存放的数据串的指令——串操作指令。
串操作指令中,源操作数⽤寄存器SI寻址,默认在数据段DS中,但允许段超越;⽬的操作数⽤寄存器DI寻址,默认在附加段ES中,不允许段超越。
每执⾏⼀次串操作指令,作为源地址指针的SI和作为⽬的地址指针的DI将⾃动修改:+/-1(对于字节串)或+/-2(对于字串)。
地址指针时增加还是减少取决于⽅向标志DF。
在系统初始化后或者执⾏指令CLD指令后,DF=0,此时地址指针增1或2;在执⾏指令STD后,DF=1,此时地址指针减1或2。
1、串传送指令MOVSMOVSB ;字节串传送:ES:[DI]←DS:[SI],SI←SI+/-1,DI←DI+/-1MOVSW ;字串传送:ES:[DI]←DS:[SI],SI←SI+/-2,DI←DI+/-2MOVS ⽬的串名,源串名;这种格式需要使⽤前缀WORD PTR或BYTE PTR指明例:将数据段SOURCE指⽰的100个字节数据传送到附加段DESTINATION指⽰的主存区MOV SI,OFFSET SOURCEMOV DI,OFFSET DESTINATIONMOV CX,100CLDAGAIN: MOVSBDEC CXJNZ AGAIN2、串存储指令STOSSTOSB ;字节串存储:ES:[DI]←AL,DI←DI+/-1STOSW ;字串存储:ES:[DI]←AX,DI←DI+/-2船存储指令将AL或AX寄存器的内容存⼊由DI指定的附加段主存单元中,并根据DF和传送单位修改DI寄存器。
STOS不影响标志。
3、串读取指令LODSLODSB ;字节串读取:AL←DS:[SI],SI←SI+/-1LODSW ;字串读取:AX←DS:[SI],SI←SI+/=2LODS指令和STOS指令功能互逆,它将SI寄存器指向的主存单元的内容送⾄AL或AX寄存器,并相应修改SI使其指向下⼀个元素。
汇编语言符号及教材符号汇总大全
""∶教材符号+、-、*、/∶算术运算符。
&∶宏处理操作符。
宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个&记号,宏汇编程序就能够用实在参数代替这个形式参数了。
$∶地址计数器的值——记录正在被汇编程序翻译的语句地址。
每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。
?∶操作数。
在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。
=∶等号伪指令——符号定义。
对符号进行定义和赋值,功能与EQU相似,但允许(重复)再定义。
:∶修改属性运算符(操作符)——段操作符。
用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。
注意,段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS。
;∶注释符号。
%∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。
()∶1.运算符——用来改变运算符的优先级别。
2.教材符号,表示括号内存储单元(或寄存器)的内容。
<>∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。
[]∶1.运算符。
方括号括起来的数是数组变量的下标或地址表达式。
带方括号的地址表达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不允许BX和BP出现在同一个方括号内;③SI和DI可以单独出现在各方括号内,也可以与常数、BP或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。
汇编复习-原题(1)1
汇编复习-原题(1)1汇编语⾔期末复习题第⼀部分:基础知识1、在汇编语⾔程序的开发过程中使⽤宏功能的顺序是( )。
A、宏定义,宏调⽤B、宏定义,宏展开C、宏定义,宏调⽤,宏展开D、宏定义,宏展开,宏调⽤2、汇编语⾔源程序中,每个语句由四项组成,如语句要完成⼀定功能,那么该语句中不可省略的项是( )。
A、名字项B、操作项C、操作数项D、注释项3、可屏蔽中断就是它的请求是否被CPU响应要受()的控制。
4、使⽤LINK连接命令,执⾏后可⽣成⽂件的扩展名为()。
5、在寄存器间接寻址中,如果指令中指定的寄存器为BP,则操作数在段中,段地址在寄存器中。
6、注释项⽤于说明程序段或是⼀条和⼏条指令的功能,⼀般⽤表⽰注释的开始。
7、DOS系统功能调⽤⽅式为:(1)置⼊⼝参数;(2)中断程序编号送寄存器后执⾏INT 21H。
8、通常主程序和⼦程序间参数传送的⽅法有三种:、、。
9、是CPU暂停当前程序的执⾏,转⽽执⾏处理紧急事务的程序,并在该事务处理完后能⾃动恢复执⾏原先程序的过程。
在此,称引起紧急事务的事件为。
10、在字符串操作指令中,DS∶指向源串,ES∶指向⽬的串。
11、计算机系统通过与外围设备通信。
12、键盘I/O、显⽰I/O和打印I/O分别对应、和号中断。
13、字符显⽰模式缓冲区中的⼀个字对应于屏幕上的⼀个字符。
每个字的第⼀个字节为显⽰字符的,第⼆个字节为显⽰字符的。
14、简述上机运⾏汇编语⾔程序的过程。
15、简述程序中指令和伪指令的区别。
16、⼗六进制数88H,可表⽰成下⾯⼏种形式,请找出错误的表⽰()。
①⽆符号⼗进制数136 ②带符号⼗进制数-120③压缩型BCD码⼗进制数88 ④ 8位⼆进制数-8的补码表⽰17、指令指针寄存器是。
B.名字的第⼀个字符可以是字母、数字及、@、_C.名字的有效长度≤31个字符D.在名字中不允许出现$19、CS寄存器属于。
20、已知物理地址(371F0H)=12H,(371F1H)=34H,(371F2H)=56H,如从地址371F0H中取出⼀个字的内容是。
北京理工大学汇编语言实验报告3字符串操作实验(设计性实验)
组 号:
同组搭档:
成 绩:
一、实验要求和目的
1.了解汇编语言字符串处理基本流程; 2.熟悉汇编语言字符串处理基本指令的使用方法; 3.掌握利用汇编语言实现字符串处理的程序设计方法。
二、软硬件环境
1、硬件环境:计算机系统 windows; 2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
str1 db 'fs3qas' count equ $-str1 DATAS ENDS copy segment
str2 db count dup(?) copy ends
CODES SEGMENT ASSUME CS:CODES,DS:DATAS,es:copy
START: MOV AX,DATAS MOV DS,AX mov es,dx;开始复制 mov cx,count cld rep movsb MOV AH,4CH INT 21H
这里面显示的bx=1,符合实际情况 若修改一下源代码,把字符串多加几个‘.’则结果如下:
代码中有3个‘.’运行结果中bx=3,符合实际情况,源代码题设要求
五、实验要求与提示
1、实验要求 (1)画出各程序流程图; (2)列出程序清单,加上适量注释; (3)回答思考问题; (4)记录实验结果; (5) 完成实验报告(实验材料上的内容简写,自己的工作要详尽)。 2、实验提示: A)自动获取字符串长度,可以利用地址计数器$ 表达式获得。 B)字符/字符串输入输出 主要利用 DOS 的INT 21H 系统功能调用来实现字符或字符串的输入/输出操作,其中1 号功能表示输入字符;2 号功能表示输出字符;0A 号功能表示输入字符串;09 号功能表 示 输出字符串。如果大家想现在使用可以详细查阅相关资料,在后面的课程内容和实验上会详 细学习,这里简单示例提示一下: (1)显示单个字符可以用DOS 的INT 21H 的2 号功能,将字符放在DL 寄存器中,2 号放在AH 寄存器中。 MOV AL, ’*’ MOV AH,2 INT 21H (2)数据区中的字符串应以$结尾,DS:DX=串地址;如果提前已经定义需要显示的字 符串,显示字符串可以用如下功能调用: LEA DX,STR MOV AH,9 INT 21H
汇编语言:x86汇编指令大全及其注意事项
汇编语⾔:x86汇编指令⼤全及其注意事项⽬录Part 1:instructionPart 22.1 (逻辑)运算、移位等常⽤指令2.1 (逻辑)运算、移位等常⽤指令2.2 循环移位指令2.3 数据串操作指令2.4 逻辑运算指令2.5 基于⼤⼩关系的跳转指令2.6 基于单标志位的转移指令Part 1:instruction积少成多,持续更新。
(这将会是⼀个极其漫长的过程)表格中各条指令的顺序根据笔者所认为的重要或常⽤程度进⾏排序,仅供参考。
Part 2本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以此类推。
2.1 (逻辑)运算、移位等常⽤指令这⼀部分记录汇编语⾔程序设计当中使⽤频率最⾼的⼀部分指令。
2.1 (逻辑)运算、移位等常⽤指令这⼀部分记录汇编语⾔程序设计当中使⽤频率最⾼的⼀部分指令。
指令作⽤注意事项⽰例mov dest,src传送指令1.dest和src不能同时为存储器操作数2.CS不能作为dest3.段寄存器之间不能互相传送4.⽴即数不能送⼊段寄存器mov ax,wordptr[bx+si+2]adddest,src加法指令dest,src不能同时为存储器操作数或段寄存器add ax,cx adcdest,src带进位加法指令dest=dest+src+CF,常⽤于多字节加法inc dest加⼀指令 1.此操作不影响CF的状态inc byte ptr[si]subdest,src减法指令1.dest,src的要求与add相同2.触发OF:异号相减且结果的符号为与被减数不同sub ax,cxsbbdest,src带进位减法常⽤于多字节减法dec dest减⼀指令不影响CF的状态,但其他⼏个标志位都会受到影响dec axmul dest⽆符号乘法指1.dest为字节数据,则与AL相乘,结果放⼊AX2.dest为字数据,与AX相乘结果低16位放⼊AX,⾼16位放⼊DX3.dest不能是⽴即数mul aximul dest有符号乘法细节与mul完全相同,对最⾼位的解释不同imul axdiv dest⽆符号除法1.dest为字节数据,⽤AX除以dest,商放在AL,余数放在AH2.dest为字数据,⽤低16位为AX,⾼16位为DX的双字数据除以dest,商放在AX,余数放在DXidiv dest带符号除法与⽆符号完全相同。
【汇编】字符串处理指令stosb、lodsb、movsw、scasb、rep
【汇编】字符串处理指令stosb、lodsb、movsw、scasb、rep ⼀、字符串处理指令(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装⼊AL或AX,然后根据DF标志增减SI(2) stosb、stosw:把AL或AX中的数据装⼊ES:DI指向的存储单元,然后根据DF标志增减DI(3) movsb、movsw:把DS:SI指向的存储单元中的数据装⼊ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI(4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI(5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI(6) rep:重复其后的串操作指令。
重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。
主要⽤在MOVS和STOS前。
⼀般不⽤在LODS前。
上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX涉及的标志位:DF、AF、CF、OF、PF、SF、ZF⼆、使⽤举例(1) 把当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中CLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,100NEXT: LODSBSTOSBDEC CXJNZ NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,100NEXT: MOVSBDEC CXJNZ NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,3NEXT: MOVSBLOOP NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,3REP MOVSB(2) 判断AL中的数字是否为16进制数STRING DB '0123456789ABCDEFabcdef' STRLEN EQU $-STRING...CLDMOV DX,SEG STRINGMOV ES,DXMOV CX,STRLENMOV DI,OFFSET STRING NEXT: SCASBLOOPNZ NEXTJNZ NOT_FOUNDFOUND:...NOT_FOUND:...(3) 其它实例start:mov ax,#BOOTSEGmov ds,axmov ax,#INITSEGmov es,axmov cx,#256sub si,sisub di,direpmovwmovl $1024*5,%ecxxorl %eax,%eaxxorl %edi,%edicld;rep;stoslmovl $pg0+7,_pg_dirmovl $pg1+7,_pg_dir+4movl $pg2+7,_pg_dir+8movl $pg3+7,_pg_dir+12movl $pg3+4092,%edimovl $0xfff007,%eaxstd1: stoslsubl $0x1000,%eaxjge 1b。
汇编语言指令大全
语法: MOVSB MOVSW MOVSD
标志位: 无
CMPSB,CMPSW,CMPSD
功能: 字符串比较指令
语法: CMPSB CMPSW CMPSD
标志位: C,P,Z,S,O
SCASB,SCASW
功能: 字符串搜索指令
语法: SCASB SCASW
LES(Load ES with pointer) 指针送寄存器和ES指令P35
LAHF(Load AH with Flags) 标志位送AH指令P36
SAHF(Store AH into Flgs) AH送标志寄存器指令P36
PUSHF(PUSH the Flags) 标志进栈指令P36
SEGMENT,ENDS 段定义指令P95
ASSUME 段地址分配指令P95
ORG 起始偏移地址设置指令P96
$ 地址计数器的当前值P97
PROC,ENDP 过程定义语句P97
NAME,TITLE,END 程序开始结束语句P98
MACRO,ENDM 宏定义指令P99
8086/8088汇编语言指令集
标志位: C,P,Z,S,O
LODSB,LODSW,STOSB,STOSW
功能: 字符串载入或存贮指令
语法: LODSB LODSW STOSB STOSW
标志位: 无
REP,REPE,REPNE
功能: 重复前缀指令集
语法: REP 指令S REPE 指令S REPNE 指令S
AAA 非压缩的BCD码加法十进制调整指令P54
AAS 非压缩的BCD码加法十进制调整指令P54
AND 逻辑与指令P54
重复的子字符串
重复的子字符串在计算机科学中,字符串是一种基本的数据类型,它由一系列字符组成。
在字符串中,有一种特殊的现象,即重复的子字符串。
重复的子字符串是指在一个字符串中出现了至少两次的子字符串。
这种现象在实际应用中经常出现,例如DNA序列分析、文本搜索等领域。
本文将从不同的角度探讨重复的子字符串。
一、暴力枚举法暴力枚举法是最简单的解决重复子字符串问题的方法。
它的基本思想是枚举所有可能的子字符串,然后判断是否有重复的子字符串。
具体实现时,可以使用两个嵌套的循环枚举所有的子字符串,然后使用字符串匹配算法判断是否有重复的子字符串。
这种方法的时间复杂度为O(n^3),空间复杂度为O(1)。
虽然时间复杂度较高,但是它的实现简单,适用于小规模的字符串。
二、哈希法哈希法是一种常用的解决重复子字符串问题的方法。
它的基本思想是将字符串映射到一个哈希表中,然后判断是否有重复的子字符串。
具体实现时,可以使用滑动窗口的方法,将字符串分成若干个子串,然后将每个子串映射到哈希表中。
如果发现哈希表中已经存在相同的子串,则说明有重复的子字符串。
这种方法的时间复杂度为O(n),空间复杂度为O(n)。
虽然时间复杂度较低,但是需要考虑哈希冲突的问题。
三、后缀数组法后缀数组是一种常用的字符串处理方法,它可以用来解决重复子字符串问题。
后缀数组是一个数组,它记录了字符串的所有后缀的起始位置。
具体实现时,可以使用后缀数组构建LCP数组,LCP数组记录了相邻两个后缀的最长公共前缀。
如果LCP数组中存在长度大于等于子串长度的值,则说明有重复的子字符串。
这种方法的时间复杂度为O(nlogn),空间复杂度为O(n)。
虽然时间复杂度较低,但是实现较为复杂。
四、应用重复的子字符串在实际应用中经常出现。
例如,在DNA序列分析中,需要寻找相同的DNA序列,以确定它们的功能和结构。
在文本搜索中,需要寻找相同的单词或短语,以确定它们的出现频率和位置。
在数据压缩中,需要寻找相同的子串,以减少数据的存储空间。
汇编语言之“复制字符串”
汇编语⾔之“复制字符串”汇编语⾔之“复制字符串”主要分为两个思路,⼀种是写循环,可细分为间接寻址和直接寻址;另⼀种是⽤指令,也是⽐较简单⽅便的做法⼀、前⾔我认为有必要先记录⼀下字符串的定义⽅式分为源字符串和⽬的字符串源字符串:srcmsg db 'fuzhou university',0⽬的字符串:dstmsg db sizeof srcmsg dup(?) \n db 0在定义字符串时,末尾最好要加上结束符‘0’,但是有时因为dup(?)表⽰默认全是0,可能就会没有加,最好养成良好习惯。
⼆、循环法三、指令法代码释义:lea 表⽰取到msg1的⾸地址,存⼊esi,msg2的⾸地址存⼊edi(存⼊的时特定的寄存器,是有实际意义的,后⾯会说明)然后⽤ecx存放msg1的长度,也就是存放复制字符的长度CLD(CLear Direction flag)则是清⽅向标志位,也就是使DF值为0,在执⾏串操作时,使地址按递增的⽅式变化,这样便于调整相关段的的当前指针。
这条指令与STD(SeT Direction flag)的执⾏结果相反,即置DF的值为1rep movsb 是重复移动复制的意思此时msg2已经完全复制得到了msg1的字符,由于writestring的输出需要放在edx寄存器中,所以这⾥也是mov到特定寄存器edx。
以下为参考资料,可以有助于理解cld \n rep movsb \n是如何替代循环的;from:————————————— ——————— 分割线 ———————— ——————————————先说说MOVSB(MOVe String Byte):即字符串传送指令,这条指令按字节传送数据。
通过SI和DI这两个寄存器控制字符串的源地址和⽬标地址,⽐如DS:SI这段地址的N 个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。
⽽REP(REPeat)指令就是“重复”的意思,术语叫做“重复前缀指令”,因为既然是传递字符串,则不可能⼀个字(节)⼀个字(节)地传送,所以需要有⼀个寄存器来控制串长度。
汇编语言程序段前缀总结
程序段前缀(program segment prefix )program segment prefix ,简称PSP(程序段的前缀)当输入一个外部命令或通过EXEC子功能(系统功能调用INF 21h的子功能号为4BH)加载一子程序时,COMMAND确定当时内存可用空间的最低端作为程序段起点。
在程序所占内存空间的前256个字节中,系统会为程序创建程序的前缀(PSP)的数据区,DOS要利用PSP 来和被加载程序进行通信;PSP内有程序返回、程序文件名等信息,可以通过研究psp定位文件名信息,进而获取文件名。
从这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为SA+10H:0 (其中SA为系统为程序分配内存的起始位置的段地址即当前寄存器DS的内容);(注意:PSP区和程序区虽然物理地址连续,却有不同的段地址。
)该PSP中包含以下三部分信息:(1)供被加载程序使用的DOS入口,如PSP+0、+2、+5和+2CH字段;(2)供DOS本身使用的DOS入口,如PSP+0AH、+0EH、+12H和+2CH字段;(3)供被加载程序使用传递参数,如PSP+5CH,+6CH和80H字段。
PSP结构与CP/M中的“控制区域”是十分相近的。
这是因为,DOS本身便是从CP/M演变而来的。
!程序段前缀PSP格式:PSP结构如下:偏移量长度描述00H 1 WORD 指令INT 20H02H 1 WORD 程序分配块的底部04H 1 BYTE 保留05H 5 BYTE CALL功能调用入口0AH 2 WORD INT 22H结束地址0EH 2 WORD INT 23H CTRL-BREAK处理程序地址12H 2 WORD INT 24H 标准错误处理程序地址16H 1 WORD 父进程PSP18H 20 BYTE 句柄表2CH 1 WORD 环境块地址2EH 2 WORD 保留32H 1 WORD 句柄表大小34H 2 WORD 句柄表地址38H 24 BYTE 保留50H 1 WORD INT 21H DOS 调用52H 1 BYTE FAR RET53H 9 BYTE 保留5CH 16 BYTE 为未打开的FCB1使用6CH 20 BYTE 为未打开的FCB2使用80H 1 BYTE 命令行参数的长度81H 127 BYTE 命令行参数( 另外:保存INT 22/INT 23/INT 24H的值使得用户在程序中可修改这些中断的值,病毒就曾利用这种技术防止不能传染时引起出错信息。
repne scasb指令
repne scasb指令
"repne scasb"是x86汇编语言中的一条指令。
这条指令的功能是在字符串中搜索某个字节的第一次出现。
"repne"是一个前缀,表示反转零标志位的情况下进行重复执行。
它用于在"scasb"指令执行期间检查ZF(零标志位)的值。
"scasb"是一个串比较指令,用于比较字符串中的一个字节与AL寄存器中的值。
它执行以下操作:
1. 将AL寄存器中的值与字符串中的一个字节进行比较。
2. 更新ZF(零标志位)以指示比较结果:若相等,ZF置为1;若不相等,ZF置为0。
3. DI寄存器向前移动或向后移动,取决于方向标志位DF(方向标志位)的值。
如果DF=0,则DI增加;如果DF=1,则DI减少。
该指令通常用于字符串处理,例如在查找子串、计算字符串长度等操作中。
AT&T汇编语言语法
AT&T汇编语言语法1.Register Reference引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。
80386 有如下寄存器:[1] 8 个32-bit 寄存器%eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp;( 8 个16-bit 寄存器,它们事实上是上面8 个32-bit 寄存器的低16 位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp;8 个8-bit 寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。
它们事实上是寄存器%ax,%bx,%cx,%dx 的高8 位和低8 位;)[2] 6 个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;[3] 3 个控制寄存器:%cr0,%cr2,%cr3;[4] 6 个debug 寄存器:%db0,%db1,%db2,%db3,%db6,%db7;[5] 2 个测试寄存器:%tr6,%tr7;[6] 8 个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。
2. Operator Sequence操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)”3. Immediately Operator使用立即数,要在数前面加符号$, 如“movl $0x04, %ebx”或者:para = 0x04movl $para, %ebx指令执行的结果是将立即数0x04 装入寄存器ebx。
4. Symbol Constant符号常数直接引用如value: .long 0x12a3f2demovl value , %ebx指令执行的结果是将常数0x12a3f2de 装入寄存器ebx。
引用符号地址在符号前加符号$, 如“movl $value, % ebx”则是将符号value 的地址装入寄存器ebx。
循环前缀cp的主要作用
循环前缀cp的主要作用循环前缀(cp)是一种在字符串匹配算法中广泛应用的技术。
它在KMP字符串匹配算法的实现中,起到了非常重要的作用,可以极大地优化KMP算法的匹配速度。
同时,在其他字符串处理算法中,如AC自动机、字典树等算法中,循环前缀也被普遍地应用。
一、构建KMP自动匹配机KMP算法是一种在字符串匹配中常用的算法,它的核心思想是维护一个匹配字符串的前缀数组,用来表示在对于一个字符串中,匹配的前缀有哪些重复的部分。
这个前缀数组就是循环前缀数组。
循环前缀数组的构建过程,是通过不断地比较字符串中的每一个字符,在遇到不匹配的字符时,模式串向右移动一定的距离,然后重新比较。
这样,就可以快速地在目标串中查找模式串。
二、加速字符串匹配循环前缀算法也可以用于其他的字符串匹配算法中,比如Rabin-Karp字符串匹配算法,它的核心思想是将字符串转换为数字,通过比较数字来判断字符串是否匹配。
使用循环前缀算法,可以更快地将字符串转换为数字,从而加速Rabin-Karp算法。
此外,在BM字符串匹配算法中,也可以使用循环前缀算法,加速字符串匹配的过程。
通过循环前缀算法,可以更快地从模式串中查找匹配的位置,并将匹配的位置与目标串中的位置相对应。
循环前缀算法不仅可以用于字符串匹配,它还可以用于其他的字符串处理问题中,比如字符串自动机、单词频率统计等问题。
在这些问题中,循环前缀算法可以快速地处理字符串,从而加速算法的执行效率。
四、提高代码可读性使用循环前缀算法,能够使代码更加简洁和易懂,降低代码的复杂度和难度。
因为循环前缀算法将字符串的匹配过程抽象成了一个简单的模型,可以直观地理解和使用。
总体来说,循环前缀算法在字符串处理中占据着重要的地位,其主要作用是优化字符串匹配算法,加速处理字符串匹配问题,提高代码的可读性。
在实际的开发中,开发者应该熟练掌握循环前缀算法,以便更好地处理字符串处理问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
REP/REPE/REPZ/REPNE/REPNZ - 重复字符串操作前缀
操作码指令说明
F3 6C REP INS r/m8, DX 将(E)CX 个字节从端口DX 输入到ES:[(E)DI]
F3 6D REP INS r/m16,DX 将(E)CX 个字从端口DX 输入到ES:[(E)DI]
F3 6D REP INS r/m32,DX 将(E)CX 个双字从端口DX 输入到ES:[(E)DI]
F3 A4 REP MOVS m8,m8将(E)CX 个字节从DS:[(E)SI] 移到ES:[(E)DI]
F3 A5 REP MOVS m16,m16将(E)CX 个字从DS:[(E)SI] 移到ES:[(E)DI]
F3 A5 REP MOVS m32,m32将(E)CX 个双字从DS:[(E)SI] 移到ES:[(E)DI]
F3 6E REP OUTS DX,r/m8将(E)CX 个字节从DS:[(E)SI] 输出到端口DX
F3 6F REP OUTS DX,r/m16将(E)CX 个字从DS:[(E)SI] 输出到端口DX
F3 6F REP OUTS DX,r/m32将(E)CX 个双字从DS:[(E)SI] 输出到端口DX
F3 AC REP LODS AL 将(E)CX 个字节从DS:[(E)SI] 加载到AL
F3 AD REP LODS AX 将(E)CX 个字从DS:[(E)SI] 加载到AX
F3 AD REP LODS EAX 将(E)CX 个双字从DS:[(E)SI] 加载到EAX
F3 AA REP STOS m8使用AL 填写位于ES:[(E)DI] 的(E)CX 个字节
F3 AB REP STOS m16使用AX 填写位于ES:[(E)DI] 的(E)CX 个字
F3 AB REP STOS m32使用EAX 填写位于ES:[(E)DI] 的(E)CX 个双字
F3 A6 REPE CMPS m8,m8在ES:[(E)DI] 与DS:[(E)SI] 中查找不匹配的字
节
F3 A7 REPE CMPS m16,m16在ES:[(E)DI] 与DS:[(E)SI] 中查找不匹配的字
F3 A7 REPE CMPS m32,m32在ES:[(E)DI] 与DS:[(E)SI] 中查找不匹配的双
字
F3 AE REPE SCAS m8从ES:[(E)DI] 开始查找非AL 字节
F3 AF REPE SCAS m16从ES:[(E)DI] 开始查找非AX 字
F3 AF REPE SCAS m32从ES:[(E)DI] 开始查找非EAX 双字
F2 A6 REPNE CMPS m8,m8在ES:[(E)DI] 与DS:[(E)SI] 中查找匹配字节
F2 A7 REPNE CMPS
m16,m16在ES:[(E)DI] 与DS:[(E)SI] 中查找匹配字
F2 A7 REPNE CMPS
m32,m32在ES:[(E)DI] 与DS:[(E)SI] 中查找匹配双字
F2 AE REPNE SCAS m8从ES:[(E)DI] 开始查找AL
F2 AF REPNE SCAS m16从ES:[(E)DI] 开始查找AX
F2 AF REPNE SCAS m32从ES:[(E)DI] 开始查找EAX
说明
按计数寄存器((E)CX) 中指定的次数重复执行字符串指令,或是重复到ZF 标志不再满足指定的条件。
REP(重复)、REPE(相等时重复)、REPNE(不相等时重复)、REPZ(为零时重复)及REPNZ(不为零时重复)助记符都是可以添加到一些字符串指令中的前缀。
REP 前缀可以添加到INS、OUTS、MOVS、LODS 及STOS 指令,REPE、REPNE、REPZ 及REPNZ 前缀可以添加到CMPS 与SCAS 指令。
(REPZ 与REPNZ 前缀分别是REPE 与REPNE 前缀的同义形式)。
同非字符串指令一起使用时,REP 前缀的行为未定义。
REP 前缀一次只能应用于一条字符串指令。
要重复指令块,请使用LOOP 指令或其它循环结构。
所有这些重复前缀都会使关联的指令重复执行,直到寄存器(E)CX 中的计数递减到0(请参阅下表)。
(如果当前地址大小属性为32,则将寄存器ECX 用作计数器;如果大小属性为16,则将CX 寄存器用作计数器)。
在每次迭代之后,REPE、REPNE、REPZ 及REPNZ 前缀还会检查ZF 标志的状态,如果ZF 标志未处于指定的状态,则终止重复循环。
同时测试两个终止条件时,终止重复的原因可以通过使用JECXZ 指令来测试(E)CX 寄存器进行确定,也可以通过使用JZ、JNZ 及JNE 指令来测试ZF 标志进行确定。
重复前缀终止条件1终止条件2
REP ECX=0 无
REPE/REPZ ECX=0 ZF=0
REPNE/REPNZ ECX=0 ZF=1
使用REPE/REPZ 与REPNE/REPNZ 前缀时,由于CMPS 与SCAS 指令都会根据它们的比较结果设置ZF 标志,因此ZF 标志不需要初始化。
正在重复的字符串操作可以因异常或中断而暂停。
发生这种情况时,将保存寄存器的状态,以便从异常或中断处理程序返回时,字符串操作能够恢复。
源寄存器与目标寄存器指向下一个要操作的字符串元素,EIP 寄存器指向字符串指令,ECX 寄存器保存的是上一次成功迭代指令之后的值。
通过此种机制,就可以执行很长的字符串操作,而不会影响系统的中断响应时间。
在执行以REPE 或REPNE 为前缀的CMPS 或SCAS 指令期间,如果发生错误,EFLAGS 值还原为指令执行之前的状态。
由于SCAS 与CMPS 指令不会将EFLAGS 用作输入,因此,处理器可以在页错误处理程序完成之后恢复执行指令。
谨慎使用REP INS 与REP OUTS 指令。
并非所有的I/O 端口都可以处理这些指令的执行速率。
初始化大块内存最快的方法是使用REP STOS 指令。
操作
IF AddressSize 16
THEN
use CX for CountReg;
ELSE (* AddressSize 32 *)
use ECX for CountReg;
FI;
WHILE CountReg 0
DO
service pending interrupts (if any);
execute associated string instruction;
CountReg CountReg - 1;
IF CountReg 0
THEN exit WHILE loop
FI;
IF (repeat prefix is REPZ or REPE) AND (ZF=0)
OR (repeat prefix is REPNZ or REPNE) AND (ZF=1)
THEN exit WHILE loop
FI;
OD;
影响的标志
无;不过CMPS 与SCAS 指令会设置EFLAGS 寄存器中的状态标志。
异常(所有操作模式)
无;不过重复前缀关联的指令可能会生成异常。