第5章汇编语言中的字符串代码转换
例题:
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 数据的分类和统计程序
汇编语言代码转换 大小写,二进制,十进制,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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
