第5章汇编语言中的字符串代码转换
汇编语言代码转换 大小写,二进制,十进制,16进制的相互转换
《微机原理与接口技术》课程设计(学年论文)说明书课题名称:代码转换程序设计(A3-2)学生学号:专业班级:学生姓名:学生成绩:指导教师:***课题工作时间: 2011-6-13 至 2011-6-18武汉工程大学教务处制填写说明:1. 一、二、三项由指导教师在课程设计(学年论文)开始前填写并交由学生保管;2. 四、五两项由学生在完成课程设计后填写,并将此表与课程设计一同装订成册交给指导教师;3. 成绩评定由指导教师按评定标准评分。
4. 此表格填写好后与正文一同装订成册。
课程设计评审标准(指导教师用)代码转换程序设计说明书1、方案论证(1)大小写字母、二进制与十六进制、十六进制与十进制的转换方法在计算机系统中有多种数制和编码,常用的有二进制,八进制以及16进制。
这些数制和编码虽然在储存形式上各有差异,但彼此也相互联系。
大小写转换,主要利用小写字母比大小字母大20H的关系,将小写字母减20H就转换为大写字母,将大写字母加20H就转换为小写字母。
二进制,十进制以及16进制,主要利用0到9的数值等于相应ASCALL码减30H,而A到F的数值等于相应ASCALL码减37H,这样即可利用移位,除十取余取整等方法实现其相互转换。
(2)宏汇编程序设计要点宏是源程序中的一段有独立功能的程序代码。
宏指令,用户自定义的指令。
编程序时候,将多次使用的功能用一条宏指令来代替。
汇编包括指令,伪指令,宏指令。
前两个都是规定的,最后一个是自己设计的。
好处是用起来方便定义,但是要先定义,后调用,其优点是可以随时随地的调用宏汇编程序。
2、程序设计(1)总体设计对“实现从键盘输入16位二进制数,转换成4位十六进制数显示出来。
”的分析处理。
首先将键盘输入的二进制数以二进制形式储存起来:每次输入,将其ASCALL码值将减去30H,然后左移一位,在然后与下个输入的减30H的数相加,这样就将键盘输入的值以二进制形式储存在寄存器中.二进制转换为16进制数输出:用循环指令左移四位,取出最低4位,利用16进制所对应的ASCALL码值比其本身大30H或37H的关系,将低位转换成对应的ASCALL码值,再调用DOS系统显示字符功能,将转换后的字符显示出来,如此循环四次即可.程序总流程图:(2)程序设计二进制转十六进制流程图:程序代码及注释:;PUBLIC XPEXTRN INFO4:BYTE,INFO1:BYTE,INFO2:BYTECODE SEGMENTXP PROC FARASSUME CS:CODECALL DEC2BIN ;调用将键盘输入的ASCALL值转换为二进制数LEA DX,INFO2MOV AH,9INT 21H ;显示提示信息CALL BIN2HEX;调用将储存的二进制转换为16进制函数MOV DL,'H'MOV AH,2INT 21HRETCAL: MOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HLEA DX,INFO4MOV AH,9INT 21H;输入非二进制数,显示错误DEC2BIN PROC NEARLEA DX,INFO1MOV AH,9INT 21H;显示提示信息XOR BX,BX ;BX清零NEWCHAR: MOV AH,1INT 21H ;键盘输入,存放在AL中CMP AL,0DHJE RE;如果输入回车键,键盘输入结束SUB AL,30HJL CALCMP AL,1JG CAL ;输入为非二进制数,显示错误并退出CBWXCHG AX,BXMOV CX,2MUL CXXCHG AX,BXADD BX,AXJMP NEWCHAR;将键盘输入的制转换为二进制数,存放在BX中,并且每输入一个值,先将BX左移一位再相加. RE: MOV DL,'B'MOV AH,2INT 21HRETDEC2BIN ENDPBIN2HEX PROC NEARMOV C H,4ROTATE: MOV CL,4ROL BX,CL ;BX每左移4位输出,四位二进制表示一位十六进制MOV A L,BLAND A L,0FHADD A L,30HCMP A L,3AHJL PRINTIT ;结果若为0到9的数,则加30H后直接输出ADD AL,07H ;结果若为A到F的数,则加30H后再加07H直接输出PRINTIT: MOV DL,ALMOV AH,2INT 21HDEC CHJNE ROTATERETBIN2HEX ENDPCRLF PROC NEARMOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21H ;回车换行RETCRLF ENDPXP ENDPCODE ENDSEND3、程序调试步骤与结果(1)编辑源程序(2)汇编源程序(3)连接程序(4)在TD中调试程序(5)程序运行结果结果说明:当输入小写字母(如a)时,就转换成相应的大写字母(如A),反之亦然;当如入二进制(如1011B),,就转换成相应的十六进数(000BH),反之亦然;如果输入的字母或数字不符合要求,就会显示“INPUT ERROR”4、结论。
汇编语言 大小写字母转换
DATA SEGMENT ;数据段ARRAY DW 5 DUP(0) ;数组名COUNT DW 5 ;数组大小RESULT DW 5 DUP(0) ;转换结果ADDRESS DW 3 DUP(0) ;地址表STRING1 DB 'Transportation$'STRING2 DB 'Please enter 5 small letters,press 0 TO exit:$'STRING3 DB 'Capital letters are :$'ATTENTION1 DB 'Can not transport the letters $'DATA ENDSENTER1 MACRO ; 宏定义回车MOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHINT 21HENDMSTACK1 SEGMENT ;堆栈段DW 40H DUP(0)STACK1 ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXSTART2:MOV DX,OFFSET STRING2 ;显示字符串 'Please enter 5 small letters,press 0 TO exit:'MOV AH,09HINT 21HXOR DX,DX ; 清空DXMOV SI,0 ; 清空SILP:MOV AH,01H ; 键盘输入并回显,AL中有输入字符INT 21HCMP AL,'0' ; 如果输入的是0,调转到退出段JE EXITCMP AL,'a' ; 小于则转移JB ATTENTIONCMP AL,'z'JA ATTENTION ; 大于转移MOV BYTE PTR ARRAY[SI],AL ; 将AL中的字符存入数组中INC SI ;si+1CMP SI,5 ; 判断是否已存入五个字符JNE LP ; 如果没存够继续循环输入并存储(当输入超过五的时候之前的存储会被覆盖)MOV ADDRESS,OFFSET ARRAY ; ARRAY地址存入地址表MOV ADDRESS+2,OFFSET COUNT ; COUNT地址存入地址表MOV ADDRESS+4,OFFSET RESULT ; RESULT地址存入地址表MOV BX,OFFSET ADDRESS ; 地址表装入BXCALL TRANSPORT ; 调用大小写转换的程序ENTER1JMP START2 ;可以循环执行输入和转换程序MOV AH,4CH ;退出INT 21HEXIT: ;退出段ENTER1MOV AH,4CHINT 21HATTENTION: ; 提示输入错误ENTER1LEA DX,ATTENTION1 ;显示字符串'Can not transport the letters $'MOV AH,09HINT 21HENTER1JMP START2 ;继续循环输入和转换程序TRANSPORT PROC ;proc 与 ENDP 子程序在伪指令中成对出现PUSH AX ; 保护现场PUSH BXPUSH SIPUSH DIMOV SI,[BX] ; ARRAY地址存入SIMOV DI,[BX+2] ; COUNT地址存入DIMOV CX,[DI] ; COUNT内容取出,存入CX作为计数器,为loop组准备MOV DI,[BX+4] ; RESULT地址存入DIXOR AX,AX ; 清空AXLOP:MOV AX,[SI] ; 从数组中取出一个字符并转换为大写SUB AX,20H ; 大小写字母ASC码相差32MOV [DI],AX ; 将转换结果存入RESULT中INC SI ; ARRAY数组标号+1INC DI ; RESULT数组标号+1LOOP LOP ; loop执行过程中CX自动减1直至0ENTER1MOV BYTE PTR[DI],'$' ;; ENTER1MOV DX,OFFSET STRING3 ; 显示字符串'Capital letters are :' MOV AH,09HINT 21HMOV DX,OFFSET RESULT ; 显示转换结果(RESULT数组内容)MOV AH,09HINT 21HPOP DI ; 恢复现场POP SIPOP BXPOP AXRET ;如果子程序中没有RET子程序会自陷TRANSPORT ENDPCODE ENDSEND START ;。
第5章 汇编语言程序中的字符串、代码转换与列表
例题: 例题:
1.求字符串的串长 求字符串的串长
【例5-1】内存STR单元中存放一字符串,结尾用00H作标记。 编程求其串长并存入LEN单元。 • 分析问题:由题意可知,只需按给定字符串的首地址,逐个与 00H比较,若不是, 则字符串长度计数器加1。若是,则将结果存于LEN单元。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度, 这和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的ASCII 码值是否大于00H,以此作为判定循环结束的控制条件。本题用 JMP指令实现循环。
3.LODS取串指令 . 取串指令
格式:可有三种 LODS SRC;源串元素由DS:SI指定的存储单元,目的串元素隐 含在由DS:AL或DS:AX指定的存储单元 LODSB; 8位字符串操作,省略源串和目的串不写 LODSW LODSW; 16位字符串操作,省略源串和目的串不写 16 功能:该指令把由SI指定的数据段中某单元[SI]的内容送到AL或 AX中,并根据方向标志及数据类型修改SI的内容。 说明: 1)如果是字节操作则先将由SI指定的单元内容送入AL中,然后 SI再自加/减1;如果是字操作则将[SI]送入AX,然后SI再自加/减 2。 2)该指令不影响标志位。
(1) 重复前缀指令REP(或REPE、REPZ、REPNE、REPNZ) 格式:REP strpri(strpri为串操作指令) 功能:运用该指令,先要设置重复操作次数于CX之中。每执行一 次,CX减1,直到CX = 0时,只要(CX) ≠ 0,就 (CX) ,就继续执行。 说明:REPE、REPZ、REPNE、REPNZ分别表示如满足条件(上 一步的结果:相等;为0;不相等;不为0),则继续执行。 (2)MOVS串传送指令 格式:可有三种 MOVS DST,SRC; DST代表目的串元素,SRC代表源串元素 MOVSB(字节); 8位字符串操作,省略源串和目的串不写 MOVSW(字); 16位字符串操作,省略源串和目的串不写 功能:该指令可以把由SI指向的数据段DS中的一个字(或字节) 送到由DI指向的附加段ES中的一个字(或字节,目的串)中去,同 时根据方向标志DF及数据格式(字或字节)对SI和DI进行修改。 说明: 1)如果是字节操作,则SI与DI变化时是±1;如果是字操作,则 SI与DI变化时是±2。 2)该指令不影响标志位。
代码转换汇编
二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。
4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。
最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。
点击此处将给出十进制数和8421BCD编码的对应关系表。
1、BCD码与十进制数的转换BCD码与十进制数的转换.关系直观,相互转换也很简单,将十进制数75.4转换为BCD码如:75.4=(0111 (0101.0100)BCD 若将BCD码1000 0101.0101转换为十进制数如: (1000 0101.0101)BCD=85.5注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。
例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时,其值为18。
又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD 码中,它是个非法编码 .2、BCD码的格式计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。
所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如数82的存放格式为:_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示无关值。
组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是1000 0010 3、BCD码的加减运算由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于计算机总是把数当作二进制数来运算,所以结果可能会出错。
例:用BCD码求38+49。
解决的办法是对二进制加法运算的结果采用"加6修正,这种修正称为BCD调整。
汇编语言---字符串操作指令
汇编语言---字符串操作指令汇编语言---字符串操作指令字符串操作指令的实质是对一片连续的存储单元进行处理,这片连续的存储单元由隐含指针DS:SI或ES:DI来指定;字符串操作指令可对内存单元按照字节、字、双字进行处理,并能根据操作对象的字节数使变址寄存器SI/DI增加或减少1、2、4字节;规定如下:A.当DF=0时,变址寄存器SI/DI增加1、2、4字节;即:变址寄存器SI/DI递增的步长可以是1、2、4字节;B.当DF=1时,变址寄存器SI/DI减少1、2、4字节;即:变址寄存器SI/DI递减的步长可以是1、2、4字节;一、取字符串数据指令(Load String Instruction)从指针DI:SI所指定的内存单元开始,取一个字节/字/双字,然后存入到AL/AX/EAX中,并根据标志位DF的值对寄存器SI 做相应的增减;把存放字符串数据的连续存储区当做是数据源,使用寄存器SI;该指令的执行不会影响任何标志位;指令格式: LODS 地址表达式LODSB/LODSW 地址表达式LODS 地址表达式;80386+在指令LODS中,它会根据"地址表达式"的属性来决定读取一个字节、字或双字;即:当该地址表达式的属性为字节、字或双字时,将从指针DI:SI处读取一个字节到AL中,或读取一个字到AX中,或读取一个双字到EAX中,与此同时,SI还将分别增减1、2、4字节;取字符串数据指令的功能示意图如下图所示:二、置字符串数据指令(Store String Instruction)该指令把寄存器AL/AX/EAX中的值存入指针ES:DI所指向内存单元开始的一片存储单元中,并根据标志位DF的值对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地,使用寄存器DI;该指令的执行并不会影响任何标志位;指令格式: STOS 地址表达式STOSB/STOSW 地址表达式STOSD 地址表达式;80386+置字符串数据指令的功能示意图如下图所示:三、字符串传送指令(Move String Instruction)该指令把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向的内存单元,并根据标志位DF的值对寄存器DI 和SI分别作相应的增减;该指令的执行并不会影响任何标志位;指令格式: MOVS 地址表达式1,地址表达式2MOVSB/MOVSW 地址表达式1,地址表达式2MOVSD 地址表达式1,地址表达式2 ;80386+字符串传送指令的功能示意图如下图所示:四、输入字符串指令(Input String Instruction)该指令是从某一指定端口接受一个字符串,并存入到一片连续的存储单元中;输入端口由寄存器DX指定,存储单元的首地址由指针ES:DI 来确定,读入的数据个数由寄存器CX来确定;在指令的执行过程中,还要根据标志位DF的值来对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地;该指令不会影响任何标志位;与指令有关的操作数ES、DI、DX和CX等都是隐含操作数; 指令格式: INS 地址表达式INSB/INSW 地址表达式INSD 地址表达式;80386+五、字符串输出指令(Output String Instruction)该指令是把一个给定的字符串输出到一个指定的端口中;输出端口由通用寄存器DX指定,输出数据的首地址由指针DS:SI确定,输出数据的个数由计数寄存器CX来确定;在指令执行的过程中,还要根据方向标志DF的值来对变址寄存器SI 做相应的增减;该指令的执行并不会影响任何标志位;与指令有关的操作数DS、SI、DX和CX等都是隐含操作数; 指令格式: OUTS 地址表达式OUTSB/OUTSW 地址表达式OUTSD 地址表达式;80386+六、字符串比较指令(Compare String Instruction)该指令是把指针DS:SI所指向的字节、字、双字的值与指针ES:DI 所指向的字节、字、双字的值相减,并用所得到的差来设置相关标志位;与此同时,变址寄存器SI和DI也将根据方向标志位DF的值做相应的增减;指令格式: CMPS 地址表达式1,地址表达式2CMPSB/CMPSW 地址表达式1,地址表达式2CMPSD 地址表达式1,地址表达式2 ;80386+受影响的标志位: AF,CF,OF,PF,SF,ZF字符串比较指令的功能示意图如下图所示:七、字符串扫描指令(Scan String Instruction)该指令是用指针ES:DI所指向字节/字/双字的值与相应的AL/AX/EAX的值相减,并依据所得到的差值来设置相关标志位;与此同时,变址寄存器DI还将根据方向标志DF的值来做相应的增减;指令格式: SCAS 地址表达式SCASB/SCASW 地址表达式SCASD 地址表达式;80386+受影响的标志位: AF,CF,OF,PF,SF,ZF字符串扫描指令的功能示意图如下图所示:八、重复字符串操作指令(Repeat String Instruction)前面的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较、字符串扫描,等指令,都是执行一次所具有的功能;但是,每个字符串通常都是由多个字符组成的,所以,需要重复执行这些字符串操作指令;为了满足这种需要,指令系统提供了一组重复前缀指令;虽然在这些字符串指令的前面都可以添加一个重复前缀指令,但是由于指令执行结果的差异,对某个具体的字符串指令又不用重复前缀指令而改用其它循环来实现重复的需要;重复字符串操作指令对标志位的影响是由被重复的字符串操作指令来决定;1.重复前缀指令REP(Repeat String Instruction) 重复前缀指令是重复其后指定的字符串操作指令,重复的次数由计数寄存器CX来决定;指令格式:REP LODS/LODSB/LODSW/LODSDREP STOS/STOSB/STOSW/STOSDREP MOVS/MOVSB/MOVSW/MOVSDREP INS/INSB/INSW/INSDREP OUTS/OUTSB/OUTSW/OUTSD重复前缀指令的执行步骤如下:STEP1:判断: CX=0STEP2:如果CX=0,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响相关标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;从上面的重复前缀指令格式来看,虽然我们可以使用重复前缀指令来重复取字符串数据指令(第一组指令),但是可能会因为指令的执行结果而在程序中几乎不会使用;例如:编写一段程序,计算字符串"12345abcdefg"中各个字符的ASCII之和;解:......MESS DB '12345abcdefg' ;在数据段进行变量说明......MOV AX,SEG MESSMOV DS,AXLEA SI,MESS ;用DS:SI来指向字符串的首地址;MOV CX,13D ;重复次数XOR BX,BX ;置求和的初值为0REP LODSB ;循环去处字符; ......从程序片段中看,虽然"REP LODSB"能从字符串中逐一取出每个字符,但这个操作是在同一条指令中完成的,程序的其它指令根本无法处理每次取出的字符数据,指令的执行结果是:AL中只保存了最后一次取出的字符'h'的ASCII码;所以,为了实现本例的要求,不能使用重复前缀指令,而要把指令"REP LODSB"改写成如下四条指令:XOR AH,AH ;为后面的累加做准备AGAIN:LODSBADD BX,AX ;AL是被取出的字符,AH已被清0LOOP AGAIN2.条件重复前缀指令(Repeat String Conditionally) 条件重复前缀指令与重复前缀指令的功能相似,所不同的是:条件重复前缀指令中的重复次数不仅由CX来决定,而且还会由标志位ZF的值来决定;根据ZF所起的作用又可分为两种:相等重复前缀指令和不等重复前缀指令;A.相等重复前缀指令:指令格式:REPE/REPZ SCAS/SCASB/SCASW/SCASDREPE/REPZ CMPS/CMPSB/CMPSW/CMPSD该重复前缀指令的执行步骤如下:STEP1:判断条件: CX!=0 且ZF=1STEP2:如果条件不成立,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行后,再转到步骤STEP1;B.不等重复前缀指令:指令格式:REPNE/REPNZ SCAS/SCASB/SCASW/SCASDREPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD该重复前缀指令的执行步骤如下:STEP1:判断条件:CX!=0 且ZF=0STEP2:如果条件不成立,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;。
汇编语言语法练习与代码转换
实验报告(2014/ 2015 学年第二学期)课程名称微型计算机原理与接口技术实验名称汇编语言语法练习与代码转换实验时间2016年10月13日指导单位计算机学院、软件学院指导教师顾磊学生姓名杜刚班级学号141103学院(系)通信工程专业信息工程实验报告三、实验过程描述与结果分析汇编语言源程序编写好以后,必须经过下列几个步骤才能在机器上运行:(1) 编辑源程序(生成.ASM文件)(2) 汇编源程序(.ASM →.OBJ)(3) 链接目标程序(.OBJ →.EXE )(4) 调试可执行程序(使用调试程序Debug调试生成的.EXE文件)(5) 运行程序输出结果。
排除语法错误要求通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序。
但有很多语法错误,要求按照原样对源程序进行编辑,汇编后,根据TASM给出的错误信息对源程序进行修改,直到没有语法错误为止,然后进行链接,并执行相应的可执行文件。
正确的执行结果是在屏幕上显示:25+9=34。
修改后代码:(分号后为修改);FILENAME:.486DATA SEGMENT USE16SUM DB '',''MESG DB '25+9='DB 0,0,'$' ;以'$'结尾,没有输出会乱码;FILENAME:.486DATA SEGMENT USE16MESG DB 'HELLO'DB 0,0,0DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATAMOV DS,AX。
汇编源程序-字符串输入输出
5.3 字符串输入输出方法 5.3.1 字符串输出 【入口参数】AH = 9,是DOS的子功能号 DS:DX = 待输出字符串的首字符的逻辑地址 【说明】 (1)被输出的字符串的长度不限,但必须连续存放在内存的某个地方,且以ASCII值为24H的字符'$'结束,中间可以含有回车符、换行符、响铃符等特殊功能符号,存放字符串的起始逻辑地址必须放在指定的寄存器DS和DX中。
03
10号子功能在调用时等待操作员从键盘上按键,直到按下回车键为止,按键情况会显示在屏幕上,最后按下的回车键会导致回车操作。如果在按回车键之前发现输入有错误,可以使用退格键或向左的箭头进行修改。
04
Hale Waihona Puke 输入缓冲区的最前面一个字节(图5.3中len1处)的值由用户程序填写,用以指出允许输入的最大字符数。该值是字节型无符号数,有效范围是0~255,最后按的回车键也计算在内。当已输入len1–1个字符后就只能按回车键了,按其它键都会被认为是不正确的输入而不被机器认可,并且喇叭还会发出“嘀”的一声响以示警告。如果len1=1,表示只能按1个键,这个键只能是回车键,按其它键都会有“嘀”的一声警告;如果len1=0,表示一个键都不能按,包括回车键在内的任何按键都会被拒绝并且发出“嘀”的警告声,但机器又在等待输入,这一矛盾将导致无限期等待,即死机。
04
03
01
02
‘$’符本身不输出到屏幕。
调用结果是把字符串中的各个字符从光标当前所在位置起,依次显示在屏幕上,直至遇到‘$’为止,光标停在最后一个输出符号的后面。
如果程序中需要输出‘$’,只能用2号子功能实现。
9号子功能调用将影响AL的内容,不改变其余寄存器及标志寄存器的值。
【例5.5】分析下面的程序,写出程序执行后的结果。 data SEGMENT buf1 DB 'Hello, ',13,10, 'this is an example.$ ',13,10 buf2 DB '-- END --$' data ENDS code SEGMENT ASSUME CS:code,DS:data main:MOV AX,data MOV DS,AX
字符串(string)与整型(int)、浮点型(float)等之间的转换
字符串(string)与整型(int)、浮点型(float)等之间的转换#include <stdlib.h>1.int/float to string/array:C语⾔提供了⼏个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下⾯列举了各函数的⽅法及其说明。
● itoa():将整型值转换为字符串。
● ltoa():将长整型值转换为字符串。
● ultoa():将⽆符号长整型值转换为字符串。
● gcvt():将浮点型数转换为字符串,取四舍五⼊。
● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含⼗进制⼩数点。
● fcvt():指定位数为转换精度,其余同ecvt()。
除此外,还可以使⽤sprintf系列函数把数字转换成字符串,其⽐itoa()系列函数运⾏速度慢2. string/array to int/floatC/C++语⾔提供了⼏个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。
● atof():将字符串转换为双精度浮点型值。
● atoi():将字符串转换为整型值。
● atol():将字符串转换为长整型值。
● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。
● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。
● strtoul():将字符串转换为⽆符号长整型值,并报告不能被转换的所有剩余数字。
以下是⽤itoa()函数将整数转换为字符串的⼀个例⼦:# include <stdio.h># include <stdlib.h>void main (void){int num = 100;char str[25];itoa(num, str, 10);printf("The number 'num' is %d and the string 'str' is %s. \n" ,num, str);}itoa()函数有3个参数:第⼀个参数是要转换的数字,第⼆个参数是要写⼊转换结果的⽬标字符串,第三个参数是转移数字时所⽤的基数。
微机原理第五章 程序设计-dsh
INT
COSEG
21H
ENDS END START
第三节 分支程序
计算机可根据不同条件进行逻辑判断,从而选择不同 的程序流向。程序的流向是由 CS和 IP决定的,当程序 的转移仅在同一段内进行时,只需修改偏移地址 IP的 值;如果程序的转移是在不同的段之间进行,则段基 址 CS和偏移地址 IP均需要修改。 转移指令分为无条件转移指令和条件转移指令。 在进行分支程序设计时,首先要根据处理的问题用比 较、测试的方式,或者用算术运算、逻辑运算使标志 寄存器产生相应的标志位,根据转移条件选择转移指 令。
INC INC DEC JNZ
BX BX CX LOP ; ;控制部分
修改部分
MOV YY,AX MOV AH,4CH INT CODE ENDS 21H
END
START
一.循环的基本结构
1.先执行,后判断结构
流程图如右:
入口
初始化部分
循环体
修改部分
N
循环 结束? Y 出口
例2. 编程统计数据块中正数的个数,
Y
RS END (DX)
DATA
SEGMENT
D1
COUNT RS DATA CODE
DB,-1,-3,5,7,-9,·,-6 · ·
EQU DW ENDS SEGMENT ASSUME CS:CODE,DS:DATA $-D1 ?
START:
MOV
AX,DATA
MOV
MOV MOV MOV
DS,AX
JMP JUS2
BIGD: JG JUS1 ;x>0转移 ;x=0
MOV AL, 0
JMP
JUS1: JUS2:
JUS2
使用汇编实现字符串的大小写转换
这篇文章主要介绍了使用汇编实现字符串的大小写转换文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值需要的朋友们下面随着小编来一起学习学习吧
使用汇编实现字符串的大小写转换
使用汇编编程,可以直接访问内存中的数据,对数据进行相关操作,现在需要通过汇编指令and,or对字符串数据进行大小写 转换。如下例,将BaSiC转换成大写,将iNforMaTiOn转换成小写。
例子:
assume cs:codesg,ds:datasg
datasg segment db 'BaSiC' db 'iNforMaTiOn' datasg ends
codesg segment start: mov ax,datasg mov ds,ax
mov c:[bx] and al,11011111b mov ds:[bx],al inc bx loop s1
mov cx,11 mov bx,5
s2: mov al,ds:[bx] or al,00100000b mov ds:[bx],al inc bx loop s2
mov ax,4c00h int 21h
codesg ends
end start
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
第五章_汇编语言程序设计基础
§5-1 汇编语言的基本概念
汇编 语言 源程 序 汇编 程序 A ss em bl er 机器 语言 目标 程序
汇编语言指令与机器指令之间有一一对应的关系,所以汇 编语言与具体的机器密切相关,是一种面向机器的语言。 不同机器(CPU)的汇编语言不同。 为方便编程,实际的汇编程序常还提供一些除机器指令以 外的命令,被称为伪指令。伪指令(Pseudo Instruction) 仅在汇编过程中指导汇编程序如何生成目的代码,自己本 身并没有对应的机器代码。 汇编语言的指令(语句)包含两类:硬指令或真指令(指 令语句)和伪指令(指示性语句) 。
12
§5-2 汇编语言的基本语言成分
6. 综合运算符(改变属性运算符):由已存在的存储器操作数 (变量/标号)生成一个段地址和位移量相同、类型不同的新 的存储器操作数(变量/标号)。 (1) 改变变量/标号的类型: 格式: 新类型 PTR 变量/标号 功能:把PTR左边的属性赋给右边的变量/标号 [例] 设变量XVAR是字节属性,现把它的两个字节内容送 到AX中起去。 MOV AX , WORD PTR XVAR (2) 定义当前存储单元的类型: 格式: THIS 类型 功能:可用于建立新类型的存储器变量,但不分配新的存 储空间,它的段地址和位移量是汇编时的当前值。 [例] WBUFFER EQU THIS WORD BUFFER DB 100 DUP(?)
17
§5-3 汇编语言源程序的结构
(3) 段的类别属性:通常使用的类别名是‘CODE’、 ‘DATA’、‘STACK’,分别指明是代码段、数据段、 堆栈段;但也允许用户自定义类别名。类别名必须用单引 号括起来。 连接程序在组织段时,将所有同类别的段集中在一起, 进行相邻分配。 2. 段寄存器说明伪指令(ASSUME): 格式: ASSUME 段寄存器:段名 [,段寄存器:段名] 功能:告诉汇编程序,段名所指的段由那一个段寄存器寻 址,即建立段与段寄存器的关系。 说明:段寄存器的实际值(CS除外)还要由数据传送令在 执行程序时赋值。
汇编语言系列之汇编实现各种码制的转换(思路详解)
汇编语⾔系列之汇编实现各种码制的转换(思路详解)⽬录1.⼗六进制转换为⼆进制数设计1.1设计要求:1.2设计思路:1.3程序清单:1.4程序运⾏结果及分析:2.⼗六进制转换为⼗进制数设计2.1设计要求:2.2设计思路:2.3程序清单:2.4程序运⾏结果及分析:3.⼗六进制转换为ASCII码3.1设计要求:3.2设计思路:3.3程序清单:3.4程序运⾏结果及分析:4.英⽂字母⼤⼩写转换设计4.1设计要求:4.2设计思路:4.3程序清单:4.4程序运⾏结果及分析:软件:emu8086语⾔:汇编语⾔(Assembly)注意:本⽂列出了⼗六进制转⼆进制、⼗进制、ASCII码及⼤⼩写字母转换的代码,全部代码为博主独⾃⼀⼈编写,会有瑕疵,谨慎使⽤。
1.⼗六进制转换为⼆进制数设计1.1设计要求:设计转换程序,将键盘键⼊的四位⼗六进制数据转换为等值的⼆进制数,并在终端显⽰。
要求:完善程序结构,设置程序错误出⼝。
输⼊的不是0-F间的值,显⽰错误提⽰信息,并要求重新输⼊。
1.2设计思路:依次输⼊四个⼗六进制数并依次存放到BX中,最后将BX中结果⼀位⼀位输出为⼆进制。
1.3程序清单:DATA SEGMENTpkey DB "pleas input 4 hex(0~F):$"ekey DB 0dh,0ah,'it is wrong!',0dh,0ah,'pleas input 4 hex(0~F) again:','$'huiche DB 0dh,0ah,'result is:',0dh,0ah,'$'numm DB 5 dup(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTATE:MOV AX,DATAMOV DS,AXMOV CX,4 ;输⼊⼗六进制数循环4次LEA SI,numm ;开辟变址寄存器SILEA DX,pkeyMOV AH,9INT 21H ;DOS功能调⽤,输出字符串lp: MOV AH, 1INT 21H ;DOS功能调⽤,输⼊4个⼗六进制数CMP AL,'9'JA abow9CMP AL,'0'JB eeroSUB AL,30h ;输⼊为0~9时ASCII码减30H存放JMP lopeero:LEA DX, ekey ;输⼊不在0~9且不在A~F时,显⽰错误MOV AH, 9INT 21HJMP lpabow9:CMP AL,'A'JNB abowaJMP eeroabowa:CMP AL,'F'JA eeroSUB AL,37h ;输⼊为A~F时ASCII码减37H存放JMP loplop: MOV [SI],ALROL BX,4ADD BX,[SI] ;将输⼊的数据存⼊BX寄存器中INC SIDEC CXJNZ lpMOV CX,16 ;输出⼆进制数循环16次LEA DX,huicheMOV AH,9INT 21H ;DOS功能调⽤,输出字符串lp1: ROL BX,1 ;左移1位后显⽰的是最⾼位MOV DL,BLAND DL,01H ;屏蔽DL⾼7位ADD DL,30H ;加30H对应ASCII码MOV AH,2INT 21H ;DOS功能调⽤,将内容按位输出DEC CXJNZ lp1CODE ENDSEND STATE1.4程序运⾏结果及分析:存放和输出时会遇到⼀些⼩问题,本程序通过移位和加法指令实现存放,⽐较⿇烦但可以实现,后⾯的程序有所改进。
汇编实现大小写字母转换程序
汇编实现⼤⼩写字母转换程序⼀、题⽬要求编写程序,接收键盘输⼊的字符串,将其中⼤写字母转化为⼩写字母,并显⽰转化后的字符串。
键盘输⼊的字符串存于STRBUF缓冲区中,最多输⼊30个字符。
⼆、实现原理字符串是由若⼲个字符构成,⽽字符在计算机中以ASCII码形式存储,因此字符串是⼀个ASCII码序列。
⼩写字符’a’…’z’的ASCII是61H~7AH,⼤写字符A’…’Z’的ASCII是41H~5AH,因此将⼤写字母转化为⼩写字母的⽅法是:⼤写字母ASCII加上20H。
三、实验程序及流程图程序⾸先调⽤0A号功能,等待⽤户输⼊字符串,并存⼊STRBUF中。
然后对输⼊字符逐个检测,若为⼤写字符,则将其转化为⼩写字符,否则不变。
最后采⽤循环结构,使⽤02号调⽤,逐个显⽰字符串中的字符。
流程图如图4.11所⽰。
–1–图4.11 程序流程图程序代码如下。
DATA SEGMENTSTRBUF DB 30,?,31 DUP (?) ;定义键盘接收缓冲区DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:–2–第27章单⽚机实现密码锁MOV AX,DA TAMOV DS,AXLEA DX,STRBUFMOV AH,0AHINT 21H ;0A号调⽤,等待⽤户输⼊字符串MOV CL,STRBUF+1CMP CL,00JZ EXITPMOV CH,00HMOV SI,2XX1:MOV AL,STRBUF[SI] ;读取⼀个字符CMP AL,’A’JB NEXTCMP AL,’Z’JA NEXT ;判断是否是⼤写字符,ASCII在41H~5AH之间ADD STRBUF[SI],’a’-‘A’;⼤写字母ASCII值加20H NEXT:INC SILOOP XX1MOV DL,0AHMOV AH,02HINT 21H ;控制换⾏MOV CH,00MOV CL,STRBUF+1MOV SI,2XX2:MOV DL,STRBUF[SI]MOV AH,02HINT 21HINC SILOOP XX2 ;显⽰字符串EXITP: MOV AH,4CH INT 21H CODE ENDS END START –3–。
编码转换 汇编 易语言
编码转换汇编易语言
编码转换是一种将一种字符集的编码方式转换成另一种字符集的
方式。
在计算机科学中,常见的编码方式有ASCII、Unicode、GBK等。
当我们从一个编码方式转换到另一个编码方式时,我们需要遵循一定
的规则和算法。
在汇编和易语言中,也可以进行编码转换。
在汇编语言中,我们可以使用一些指令进行编码转换。
例如,MOV指令可以将数据从一个寄存器移动到另一个寄存器,从而实现编码转换。
在具体实现时,我们需要知道字符在不同编码方式下的存储方式,并将其转换成我们需要的编码方式。
在易语言中,我们可以使用一些库函数进行编码转换。
例如,GBK转UTF-8可以使用库函数GBKToUTF8,UTF-8转GBK可以使用库函
数UTF8ToGBK。
在使用这些库函数时,我们需要保证输入的编码方式和输出的编码方式正确,并通过函数返回值判断转换是否成功。
编码转换在实际应用中非常常见。
例如,在网页制作中,我们需
要将网页内容转换成浏览器支持的编码方式;在字符串操作中,我们
需要将字符串从一个编码方式转换成另一个编码方式。
因此,掌握编
码转换的相关知识和技能对于计算机编程工作者非常重要。
总之,编码转换是计算机科学中一个非常重要的概念。
无论是在
汇编语言还是易语言中,都需要掌握相关的知识和技能。
通过编码转换,我们可以轻松地将不同编码方式的数据进行转换,为我们的工作
带来极大的便利。
汇编语言-实验四字符串的匹配与替换程序设计
汇编语言-实验四字符串的匹配与替换程序设计实验四字符串的匹配与替换程序设计一、实验目的1)掌握串操作指令的使用方法。
2)掌握串处理程序的设计方法。
3)熟练使用各种程序结构。
二、实验内容1)编制两个字符串比较子程序。
2)编制在一个字符串中查找给定字符串的程序。
3)编写程序把从键盘输入的以回车为结束符的字符串中的空格去掉并按相反的顺序输出。
4)编写程序在字符串STRING1中指定位置插入字符串STRING2。
5)编写程序在字符串STRING1中指定位置删除子串。
三、源程序EXAM4-1DATA SEGMENTSTR1 DB 'MES'STR2 DB 'MESS'STR3 DB 'MATCH$'STR4 DB 'NOT MATCH$'DATA ENDSCODE SEGMENTASSUME CS:CODE ,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,4MOV DI,OFFSET STR1MOV SI,OFFSET STR2REPZ CMPSBJZ LAB1JNZ LAB2LAB1:MOV DX,OFFSET STR3MOV AH,09HINT 21HMOV AH,4CHINT 21HLAB2:MOV DX,OFFSET STR4MOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND STARTEXAM4-2DATA SEGMENTMESS1 DB 'ENTER KEYWORD:','$'MESS2 DB 'ENTER SENTENCE:','$'MESS3 DB 'NO MATCH!',13,10,'$'MESS4 DB 'MATCH AT LOCATION:','$'MESS5 DB 'H OF THE SENTENCE、',13,10,'$' CHANGE DB 13,10,'$'SEN1 LABEL BYTEMAX1 DB 14ACT1 DB ?STOKN1 DB 14 DUP(?)SEN2 LABEL BYTEMAX2 DB 100ACT2 DB ?STOKN2 DB 100 DUP(?)DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATAMOV DS,AXLEA DX,MESS1MOV AH,09HINT 21HLEA DX,SEN1MOV AH,0AHINT 21HLEA DX,CHANGEMOV AH,09HINT 21HSUB CX,CXA10:LEA DX,MESS2MOV AH,09HINT 21HLEA DX,SEN2MOV AH,0AHINT 21HLEA DX,CHANGEMOV AH,09HINT 21HCMP ACT2,0 JE EXITMOV BX,0A20:MOV CL,[ACT1] LEA SI,STOKN1 LEA AX,STOKN2 ADD AL,BL MOV DI,AX CLDREP CMPSBJZ A30INC BLCMP BL,ACT2 JE A40JMP A20A30:LEA DX,MESS4 MOV AH,09H INT 21HMOV AH,02H ADD BL,1 MOV CL,4 ROL AL,CL MOV CL,2 JMP A50A1:LEA DX,MESS5 MOV AH,09H INT 21HJMP A10A40:LEA DX,MESS3MOV AH,09HINT 21HJMP A10A50:DEC CLAND AL,0FHCMP AL,10JNB A60ADD AL,'0'A2:MOV DL,ALMOV AH,02HINT 21HCMP CL,0JE A1MOV AL,BLJMP A50A60:SUB AL,10ADD AL,'A'JMP A2 EXIT:RETMAIN ENDP CODE ENDS END START。
汇编代码转换程序(字母转换,进制转换)
湖南农业大学课程设计报告学院:信息科学技术学院班级:2010级计算机3班姓名:杨田娇学号:201041842312课程设计题目:代码转换程序设计课程名称:汇编语言与微机原理指导老师:唐小勇评阅成绩:评阅意见:成绩评定教师签名:日期:年月日目录概述 (1)一设计题目 (1)二设计内容与要求 (1)三设计思想 (1)四程序流程图 (3)五程序源代码 (5)六设计过程中遇到的问题及解决方法 (14)七设计心得 (15)代码转换程序设计概述:代码转换程序主要是实现字母间的转换和数值之间的转换。
其中字母转换是大小写字母之间的互换,二进制转换则是二进制,十进制,十六进制之间的转换。
程序设计成一个代码转换系统,给出一个可供选择的菜单,根据界面的信息选择不同的子功能。
通过做这个程序,加强汇编语言编程的能力,更好的了解其基本原理,基本的思想,基本的方法以及相关的注意事项。
一、设计题目代码转换程序设计二、设计内容与要求完成一个字母或数制之间的转化程序,主程序分别具有 5 种可选择的子功能,按相应的字符可分别进入相应的子功能并在屏幕上显示结果,按“q”键退出。
5 种可选择的子功能分别为:1)实现小写字母向大写字母的转换2)实现大写字母向小写字母的转换3)实现二进制数向十六进制数的转换4)实现十六进制数向二进制数的转换5)实现十六进制数向十进制数的转换三、设计思想运行程序,首先会显示主界面,用户可依据提示选择不同的编号,实现不同的子功能。
1、大写字母向小写字母的转换。
当用户选择编号a,便选中了这一个子功能。
通过判断标识符,程序跳转到标识符所在的位置。
根据提示输入一个大写字母,会有一个判断输入是否合法的过程,若输入的是非大写字母,则会提示输入错误,请重新输入,直到输入正确为止。
通过改变assic码值,实现大写字母向小写字母的转换。
显示转换后的字母,然后跳转到主菜单。
2、小写字母向大写字母的转换。
当用户选择编号b,便选择了这一个子功能。
汇编_字符串中指定字符的替换(附源代码)
output prompt2
output string
INVOKE ExitProcess, 0
PUBLIC _start
END
实
验
原
理
(
算
法流程ຫໍສະໝຸດ )(对算法设计进行描述,变量定义和寄存器分配情况,画出程序流程图或给出伪代码)
(写不完时,可另加附页。)
组
内
分
工
(
可
选
)
实
验
结
果
分
析
及
心
得
体
会
(给出测试过程和测试结果,并对实验结果进行分析。心得体会可以写设计和实现整个过程中的心得)
实验测试:
1.提示输入
2.输入字符串,输出结果。
结果分析:从输入及输出看,结果正确。
lea esi, string
lea edi, string
forIndex:
cmp BYTE ptr [esi],0
je endwhile
lodsb
cmp al, 41h
je forDo ;等于则转移
stosb
loop forIndex
forDo:
mov al, 61h
stosb
jmp forIndex
对算法设计进行描述变量定义和寄存器分配情况画出程序流程图或给出伪代码写不完时可另加附页
年级
班号
学号
专业
姓名
实验
名称
字符串中指定字符的替换
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
实验目的:
汇编语言课程设计代码转换程序
汇编语言课程设计代码转换程序一、引言汇编语言是一种底层编程语言,它直接操作计算机硬件,具有高效性和灵活性。
在汇编语言课程中,学生通常需要完成一些代码转换的任务,比如将高级语言代码转换为汇编语言代码。
本文将介绍一个汇编语言课程设计的代码转换程序,该程序能够将C语言代码转换为汇编语言代码。
二、程序设计要求1. 输入:从文件中读取C语言代码;2. 输出:将转换后的汇编语言代码写入文件;3. 转换规则:根据C语言代码的语法和语义规则,将其转换为等效的汇编语言代码;4. 支持的语法和语义:程序需要支持C语言的基本语法和语义,包括变量声明、赋值语句、条件语句、循环语句等;5. 错误处理:程序需要能够检测并处理C语言代码中的语法错误和语义错误,给出相应的错误提示。
三、程序设计思路1. 读取C语言代码:程序首先需要从文件中读取C语言代码,可以使用文件输入流来实现。
读取的代码可以存储在内存中的数据结构中,比如字符串数组或者链表;2. 词法分析:程序需要对读取的C语言代码进行词法分析,将其分解为一个个的词法单元,比如关键字、标识符、运算符、常量等。
可以使用正则表达式或者有限状态机来实现词法分析;3. 语法分析:程序需要对词法单元进行语法分析,根据C语言的语法规则构建语法树。
可以使用递归下降法、LL(1)分析法或者LR(1)分析法来实现语法分析;4. 语义分析:程序需要对语法树进行语义分析,检查代码中的语义错误。
比如检查变量是否声明、类型是否匹配等。
可以使用符号表和类型检查来实现语义分析;5. 代码生成:程序需要根据语法树生成等效的汇编语言代码。
可以使用模板匹配或者中间代码生成来实现代码生成;6. 错误处理:程序需要实现错误处理机制,检测并处理C语言代码中的语法错误和语义错误。
可以使用异常处理或者错误码返回来实现错误处理。
四、程序设计实现1. 文件读取:使用文件输入流来读取C语言代码文件,将读取的代码存储在字符串数组中;2. 词法分析:使用正则表达式来实现词法分析,将C语言代码分解为词法单元,并存储在词法单元数组中;3. 语法分析:使用递归下降法来实现语法分析,根据C语言的语法规则构建语法树;4. 语义分析:使用符号表和类型检查来实现语义分析,检查代码中的语义错误,并给出错误提示;5. 代码生成:根据语法树生成等效的汇编语言代码,将代码写入文件中;6. 错误处理:使用异常处理机制来检测并处理C语言代码中的语法错误和语义错误,给出相应的错误提示。
使用汇编语言将输入的字符串大写转换为小写
使⽤汇编语⾔将输⼊的字符串⼤写转换为⼩写 1;=====================2;字符串中⼤写变⼩写3 DATAS segment4 String db 10, ?, 10 dup(?) ;最多接收10个字符,最后的回车算⼀个字符5 DATAS ends67 CODES segment8START:9mov AX,DATAS10mov DS,AX11;正式代码部分1213mov dx,offset String14mov ah,0ah ;10号功能调⽤设置15int 21h ;调⽤10号DOS中断,输⼊字符串1617mov si,offset String+1;获取记录输⼊字符个数内容的偏移地址18xor cx,cx ;cx清零 loop循环的次数由cx设置19mov cl,[si] ;设置循环次数将: DS:si中的内容取出来放⼊cl中20lp:21inc si ;si⾃增122mov al,[si] ;把si地址中存放的数据传给al23cmp al,'A';字符⽐较24jb next ;如果⼩于'A'则跳转到next:25cmp al,'Z'26ja next ;如果⼤于'Z'则跳转到next:27add al,20h ;在'A'~'Z'范围内,加20h变成⼩写28mov [si],al ;将内容重新存放进内存空间29next:30 loop lp ;循环调⽤31mov byte ptr [si+1],'$';字符串最后加个'$'便于⽤9号功能输出避免输出许多⽆关内容3233mov ah,234mov dl,0ah35int 21h ;换⾏36mov dl,0dh37int 21h ;换⾏38;为什么+2?因为录⼊字符串的时候string 指向的内存地址空间依次存放的 0ah,录⼊的39;个数,录⼊的字符串40mov dx,offset String+241mov ah,942int 21h ;调⽤9号DOS中断,显⽰⾸地址为DS:DX的字符串4344mov al,045mov AH,4CH46INT 21H47 CODES ends48 end START。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例题:
1.求字符串的串长
【例5-1】内存STR单元中存放一字符串,结尾用00H作标记。 编程求其串长并存入LEN单元。 • 分析问题:由题意可知,只需按给定字符串的首地址,逐个 与00H比较,若不是, 则字符串长度计数器加1。若是,则将结果存于LEN单元。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度 ,这和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的 ASCII码值是否大于00H,以此作为判定循环结束的控制条件。本 题用JMP指令实现循环。
4. CMPS串比较指令
格式:可有三种 CMPS SRC,DST;源串元素在由DS:SI指定的存储单元,目的串 元素在由ES:DI指定的存储单元 CMPSB; 8位字符串操作,省略源串和目的串不写 CMPSW; 16位字符串操作,省略源串和目的串不写 功能:指令把由SI指向的数据段中的一个字(或字节)与由DI指向 的附加段中的一个字(或字节)相减,但不保存结果,只根据结果 置条件码((CX) ≠ 0,ZF = 1,表示字符串未比较完,且已比较的字符段 完全相同,尚未找到不同之处,还要继续比较。直到(CX) = 0,ZF = 0为止)。 说明: 1)每次操作后,自动修改SI和DI。如果是字操作,则SI和DI分别自 动加/减1;如果是字操作,则SI和DI分别自动加/减2。 2)该指令影响SF、ZF、AF、PF、CF和OF标志位。
5. SCAS串搜索指令
格式:可有三种 SCAS DST;源串隐含在由DS:AL或DS:AX指定的存储单元, 目的串隐含在由ES:DI指定的存储单元 SCASB;8位字符串操作,省略源串和目的串不写 SCASW;16位字符串操作,省略源串和目的串不写 功能:该指令把AL(或AX)的内容与由DI指定的在附加段中的 一个字节(或字)相减,但不保存结果,只根据结果置条件码。 ((CX) ≠ 0,ZF = 0,表示字符串未比较完,且已比较的字符元素不相 同,尚未找到完全相同的字符串元素,还要继续比较。直到(CX) = 0,ZF = 1为止)。 说明: 1)每次操作后,自动修改SI和DI。如果是字操作,则SI和DI分 别自动加/减1;如果是字操作,则SI和DI分别自动加/减2。 2)该指令影响SF、ZF、AF、PF、CF和OF标志位。
2.串操作指令
串操作指令完成对字符串的各种操作,操作是对一个一个字 符(称为元素)而言的。因此,每一次操作都是针对一个字或一 个字节进行的。 其寻址方式多采用隐含寻址,源串元素固定使用 SI,通常在现行的数据段,隐含段寄存器DS,但也允许段超越。 目的串元素固定使用DI,隐含段寄存器ES,不允许段超越。在每 次基本操作后,能够借助方向标志DF,自动修改地址指针。为下 一次操作作准备。 当DF=0时,地址指针增量,即字节操作时,地址指针加1;字操 作时,地址指针加2。当DF=1时,地址指针减量,即字节操作时, 地址指针减1;字操作时,地址指针减2。 为此,8086处理器有两条方向标志指令: CLD(Clear Direction flag):置DF=0; STD (Set Direction flag ):置DF=1; 串操作是通过加重复前缀实现的,每次操作只对一个字或一个字 符。为此,我们先讲重复前缀指令REP。
• 编写程序,可以想得到,需要MOV、LEA 、CMP 、JZ、INC 、DEC和JMP等指 令。最后要返回DOS。未想到的,在编写过程中随时添加, 如XOR指令等。 具体程序如下: DATA SEGMENT STR l DB ’I am a student’,00H STR2 DB ’I AM A STUDENT’,00H FLAG DB ? LEN DB ? DATA ENDS CODE SEGMENT ASSUME DS:DSEG,CS:CODE
(1) 重复前缀指令REP(或REPE、REPZ、REPNE、REPNZ) 格式:REP strpri(strpri为串操作指令) 功能:运用该指令,先要设置重复操作次数于CX之中。每执行一 次,CX减1,直到CX = 0时,只要(CX) ≠ 0,就继续执行。 说明:REPE、REPZ、REPNE、REPNZ分别表示如满足条件(上 一步的结果:相等;为0;不相等;不为0),则继续执行。 (2)MOVS串传送指令 格式:可有三种 MOVS DST,SRC; DST代表目的串元素,SRC代表源串元素 MOVSB(字节); 8位字符串操作,省略源串和目的串不写 MOVSW(字); 16位字符串操作,省略源串和目的串不写 功能:该指令可以把由SI指向的数据段DS中的一个字(或字节) 送到由DI指向的附加段ES中的一个字(或字节,目的串)中去,同 时根据方向标志DF及数据格式(字或字节)对SI和DI进行修改。 说明: 1)如果是字节操作,则SI与DI变化时是±1;如果是字操作,则 SI与DI变化时是±2。 2)该指令不影响标志位。
• 编写程序,可以想得到,需要MOV、LEA 、CMP 、JZ、INC和 JMP等指令。最后要返回DOS。未想到的,在编写过程中随时添加 ,如XOR指令等。 具体程序如下: DATA SEGMENT STR DB ’I live in Anshan’,00H ;定义字符串STR,以00H结 束 LEN DB ? ;定义存放字符串长度的存储单元LEN DATA ENDS CODE SEGMENT ASSUME CS:CSEG,DS:DSEG START: SLEN: MOV AX,DATA MOV DS,AX ;数据段初始化 LEA SI,STR ;取字符串起始偏移地址送寄存器SI,定位 XOR AL,AL ;字符串长度计数器AL清0
•画程序流程图:略。解题步骤如下: (1)设置串首址指针1和指针2; (2)置FLAG单元为0; (3)串1或串2结束吗?是,转8; (4)指针1指向内容等于指针2指向内容?否,转7; (5)指针1和指针2;0IJl; (6)转(3); (7)若指针1指向内容>指针2指向内容?则FLAG为1,否则为FFH; (8)结束。 •确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架 至少要两个段: 数据段和代码段。数据段中至少定义4个变量:两个字符串变量STR 1和STR 2,实际上是两个数组变量,每个字符的ASCII码为(7+1 )位数,应选DB 类型。分别用寄存器SI和BX定位。还有两个变量 FLAG 和LEN,分别定义为结果标志和存放字符串长度的存储单元 ,8位数已足够,选DB类型。其中间结果放在寄存器AH、AL,CH 、CL。
LOP: CMP BYTE PTR[SI],00H ;逐个比较字符串的每个字符, 看其的ASCII 值是否大于00H,以此判定串结束与否 JZ DONE ;若不大于00H,而是等于,则转DONE语句 INC AL ;AL ←AL +1,计数器AL累加 INC SI ;SI ←SI+1,移到下一个字符 JMP LOP ;跳到LOP语句循环 DONE:MOV LEN,AL ;保存结果 MOV AH,4CH INT 21H CODE ENDS END SLEN 计算串长的程序也可以通过串搜索指令来实现,程序会更简洁,读 者可自己试写出程序。
•画程序流程图:略。解题步骤如下: (1)取串首地址作指针; (2)设置计数器,供计算串长之用; (3)指针指向内容为00H ? 是,转6; (4)计数器加1,指针加1; (5)转3; (6)保存计数结果; (7)结束。 •确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架 至少要两个段: 数据段和代码段。数据段中至少定义2个变量:一个字符串变量STR ,实际上是一个数组变量,每个字符的ASCII码为(7+1)位数, 应选DB 类型。用寄存器SI定位。还有一个变量LEN,定义为存放 字符串长度的存储单元,8位数已足够,选DB类型。其中间结果放所能包含的字符,依赖于具体机器的字符集。目前世 界上应用最广的字符集是ASCII码字符集。 存储字符串的方法也就是存储列表的一般方法。最简单最普遍的 方法是顺序存储,还有链接存储等,这里仅讨论顺序存储的字符 串。 字符串的表示在8086/8088宏汇编语言中,可以借助数据定义语 句DB(因一个ASCII码是7位)来定义,字符串的特征表示一般有 两种,一种是在字符串的尾部用00H作标记,另一种是在字符串的 前面空出一个单元,放置字符串的长度。例: STRI DB ’ I am a student’,0 STR2 DB 4,’ABCD’
2.字符串的比较
【例5-2】 编程比较内存中两个字符串:STR l和STR2,分别存 放在不同单元,以00H作为结束标志。将比较结果存于FLAG单元。 如果两串相等,FLAG为0;如果STR l>STR 2,则FLAG为1;如果 STR 1< STR 2,则FLAG为FFH。 • 分析问题:由题意可知,实际上试比较两个字符串的ASCII码值 。方法:按给定 字符串的首地址,将两个字符串的相应字符逐个比较,找出第一 个不同字符。若未找到,则串相等;否则,根据不同字符的ASCII 码,决定哪个串大。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度,这 和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的ASCII 码值是否大于00H,以此作为判定循环结束的控制条件。本题用 JMP指令实现循环。
3.LODS取串指令
格式:可有三种 LODS SRC;源串元素由DS:SI指定的存储单元,目的串元素隐 含在由DS:AL或DS:AX指定的存储单元 LODSB; 8位字符串操作,省略源串和目的串不写 LODSW; 16位字符串操作,省略源串和目的串不写 功能:该指令把由SI指定的数据段中某单元[SI]的内容送到AL或 AX中,并根据方向标志及数据类型修改SI的内容。 说明: 1)如果是字节操作则先将由SI指定的单元内容送入AL中,然后 SI再自加/减1;如果是字操作则将[SI]送入AX,然后SI再自加/减 2。 2)该指令不影响标志位。
第 5章 汇编语言程序中的字符串、代码转换 与列表
5.1 汇编语言的字符串
5.2 数据的分类和统计程序