微机原理:顺序、分支、循环、子程序设计
微机原理与接口技术-第4-1章

例4-3 用键盘最多输入10个字符,并存 入内存变量Buff中,若按“Enter”键,则 表示输入结束。
用BIOS层功能调用实现 层功能调用实现 的源程序: 的源程序: .MODEL SMALL CR EQU 0DH .STACK 200H .DATA Buff DB 10 DUP(?) .CODE .STARTUP MOV CX, 0AH LEA BX, Buff
Windows层功能模块的调用
Win32 API使用堆栈来传递参数 API函数调用 C语言的消息框函数的声明: int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in message box LPCTSTR lpCaption, // message box title UINT uType // message box style );//参数 最后还有一句说明: Library: Use User32.lib.//说明这个函数的位置
API 函数的返回值
有的API 函数有返回值,如MessageBox 定义 函数有返回值, 有的 的返回值是int类型的数,返回值的类型对汇编 的返回值是 类型的数, 类型的数 程序来说也只有dword 一种类型,它永远放在 一种类型, 程序来说也只有 eax 中。如果要返回的内容不是一个 如果要返回的内容不是一个eax所能 所能 容纳的, 容纳的,Win32 API 采用的方法一般是返回一 个指针, 个指针,或者在调用参数中提供一个缓冲区地 干脆把数据直接返回到缓冲区中去。 址,干脆把数据直接返回到缓冲区中去。
.REPEAT MOV AH, 0H INT 16H .BREAK .IF AL==CR MOV [BX],AL INC BX .UNTILCXZ .EXIT 0 END
汇编语言程序设计方法

C 名字前加 下划线
从右到左 调用程序
是
SYSCALL
从右到左 被调用程序
是
STDCALL 名字前加
下划线 (注)
被调用程序
是
PASCAL 名字变大写
BASIC 名字大写
FORTRAN 名字大写
从左到右 被调用程序
是
从左到右 被调用程序
是
从左到右 被调用程序
是
12
PROTO是过程声明伪指令,用于事先声明过程的结构。它的格 式如下:
结束处理部分
AGAIN: ADD AX,CX
;从20,19,……2,1倒序累加到AX
LOOP AGAIN ;每循环一遍,CX自动减1
MOV SUM,AX ;将累加和送入SUM单元
.EXIT 0
END
初始化部分
循环结束? 是 否
工作部分 修改部分 结束处理部分
7
二、用MASM 6.x循环控制伪指令实现循环结构
.CODE
.STARTUP
MOV AL, B
IMUL AL
MOV BX,AX MOV AL,A
;BX中为B的平方
IMUL C
MOV CX,4
IMUL CX
;AX中为4AC
.IF SWORD PTR BX>=AX ;比较B的平方和4AC的大小
MOV SIGN,1
;条件成立,SIGN得到1
.ELSE
MOV SIGN,0
.IF 条件表达式 ;条件为真(非0),执行分支体
分支体
[.ELSEIF 条件表达式
分支体
;前面IF条件为假,并且当前ELSEIF条件为真执行分支体
[.ELSE
;前面IF条件为假执行分支体
微机原理微型计算机的程序设计

2024/9/30
43
例6.2
将内存(10050)单元旳内容拆成两段,每段4位,并将它 们分别 存入内存(10051)和(10052)单元。即(10050) 单 元 中 旳 低 4 位 放 入 ( 10051 ) 单 元 中 旳 低 4 位 , 而 (10050)单元中旳高4位放入(10052)单元中旳低4位。
INT 21H
2024/9/30
42
作业8.17 编写求输入算式’加数1+加数2’旳和并送显。
(加数及其和均为4位(即指压缩)BCD数,P262)
分析:要求先有屏幕显示输出‘加数1+加 数2:’,然后从键盘输入两个4个字节旳 BCD数,加完后送显。
用到旳变量:W1和W2因为从键盘输入,均 不拟定是几位十进制,故需拟定其最大位 数不超出要用
2024/9/30
12
MOV AX, W1
;AX=0809H,W2为0607H
ADD AL, BYTE PTR W2 ;AL=10H, CF=0,AF=1
AAA ; 属于第一种情况,故
; AL为(AL+06H)&0FH=10H+06H )&0FH
;
=16H&0FH=06H=AL;
;AH加1且CF置CF=1,所以AH=08H+1=09H,则AX=0906H
2024/9/30
34
2024/9/30
35
2024/9/30
36
2024/9/30
37
2024/9/30
38
作业8.4 编写求两个4位非压缩BCD数之和,
将和送显示屏显示旳程序。(P261)
分析:两加数各要4个字节单元,可觉得DD 类型;考虑到进位,和要5个字节单元,另 外,输出到显示器旳结束符号’$’需要一 个单元存放,故共需6个字节。 所以,数据段定义为:
030731004《微机原理与汇编语言》教学大纲

《微机原理与汇编语言》课程教学大纲课程代码:030731004课程英文名称:Computer Principles and Assembly Language课程总学时: 56 讲课: 44 实验:12适用专业:电子信息科学与技术大纲编写(修订)时间:2010一、大纲使用说明(一)、课程地位及教学目标本课程是电子信息科学与技术专业的必修的专业基础课,主要任务是使学生掌握8088/8086系列汇编程序设计和PC机硬件原理知识,并具有一定的应用能力。
(二)、知识,能力及技能方面的基本要求通过本课程学习,要求学生从理论上和实践上掌握计算机的基本组成、工作原理、硬件的连接等内容,会编写较简单的汇编语言程序,并能利用PC总线进行I/O扩展及编程,建立微机系统的整体概念,使学生具有应用微机系统软硬件开发的初步能力,为后续课程单片机、数字系统设计、ARM等打下理论基础。
(三)、实施说明由于本课程是主要专业基础课,对先修课基础要求较高,在讲授具体内容时,应注重基础原理内容和实际应用介绍,使学生在掌握基本原理的基础上,具有一定解决实际问题的能力。
要提高学生的基本素质和应用能力,必须改变传统的教学手段。
要利用多媒体授课;增加自学讨论部分,使学生从被动吸收知识的状态下,转化到主动索取知识的状态中来。
同时,应不断增加新知识。
总学时:56学时;讲课:44学时;实验:12学时。
(四)、对习题,实验,实践环节的要求本大纲立足于实施素质教育为目标培养的。
习题从教材中选取,按时交作业,编程习题尽量上机验证。
实验强调应用性,学生应独立完成,实验前预习实验内容。
(五)、对先修课程的要求1.计算机导论课程中的计算机数的编码,二、十六进制,BCD,ASCII码;2.数字电子技术课程中的逻辑电路基础。
(六)、考核方式及成绩评定方式1.考核方式:考试。
2.考试方法:闭卷。
3.课程总成绩:最终理论考试与平时考核(包括实验、期中考试、作业、出勤、提问等)的总和。
微机原理课程设计

微机原理 课程设计一、课程目标知识目标:1. 让学生理解微机的基本原理和结构,掌握微处理器的工作机制。
2. 使学生掌握汇编语言的基本指令,能够阅读和编写简单的汇编程序。
3. 帮助学生了解微机系统中内存、I/O设备的基本原理及其与CPU的交互方式。
技能目标:1. 培养学生运用汇编语言进行程序设计的能力,能够实现基本的输入输出、逻辑判断和循环等操作。
2. 培养学生分析和解决微机系统常见问题的能力,如调试程序、处理硬件故障等。
3. 提高学生动手实践能力,通过课程设计项目,使学生能够独立完成一个简单的微机系统设计与实现。
情感态度价值观目标:1. 培养学生对微机原理及计算机科学的兴趣,激发他们探索精神和技术创新意识。
2. 培养学生团队协作精神,学会与他人共同分析问题、解决问题,提高沟通能力。
3. 引导学生认识到微机技术在国家经济发展和国防建设中的重要作用,增强学生的社会责任感和使命感。
课程性质:本课程为理论与实践相结合的课程,注重培养学生的实际操作能力和实际应用能力。
学生特点:学生已具备一定的电子技术和计算机基础知识,对微机原理有一定了解,但缺乏实践经验。
教学要求:教师需结合课程性质、学生特点,采用案例教学、项目驱动等教学方法,引导学生主动学习,提高学生的实践能力和综合素质。
在教学过程中,注重分解课程目标,确保学生能够达到预定的学习成果。
二、教学内容1. 微机原理概述:介绍微机的发展历程、基本结构及工作原理,重点讲解CPU、内存、I/O设备等核心组件的作用和相互关系。
相关教材章节:第一章 微机原理概述2. 汇编语言基础:讲解汇编语言的基本概念、语法和指令系统,使学生掌握汇编程序的编写和调试方法。
相关教材章节:第二章 汇编语言基础3. 微机系统编程:学习微机系统中的程序设计方法,包括顺序程序设计、分支程序设计、循环程序设计等。
相关教材章节:第三章 微机系统编程4. 内存与I/O设备:介绍内存管理、I/O设备控制原理,分析微机系统中内存、I/O设备的访问方法。
微机原理第五章 程序设计-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
微机原理与应用ch04-汇编语言

汇编语言程序到机器语言程序的转换过程称为汇编。 1.手工汇编:人工查指令表汇编。用于设计短小程 序或调试程序的场合。 2.机器汇编:用汇编程序进行汇编。
2007-11-27 张臣 15
《微机原理与应用》课件
2. 汇编语言的汇编
2007-11-27
张臣
16
《微机原理与应用》课件
(1)人工编译
人工查指令 机器码表 汇编语言 源程序
2007-11-27
张臣
20
《微机原理与应用》课件
源程序的汇编结果实例
2007-11-27
张臣
21
《微机原理与应用》课件
练习
设(59H)=50H; MOV A, 59H MOV R0, A MOV A, #0 MOV @R0, A MOV A, #25H MOV 51H, A MOV 52H, #70H A= ; (50H)= (51H)= (52H)=
2007-11-27 张臣 32
《微机原理与应用》课件
(2) 子程序结构
MAIN : LCALL SUB …… SUB: PUSH PSW ;现场保护 PUSH Acc 子程序处理程序段 POP Acc ;现场恢复 POP PSW RET
2007-11-27
; 主程序
1、子程序应取名,即子程 序的入口应加标号,以 便主程序调用时使用 2、注意使用堆栈保护现场 (PUSH)和恢复现场 (POP) 3、子程序的设计中要考虑 参数的传递,即要满足 入口条件和出口状态。 4、子程序的结尾必须是子 程序的返回指令RET。
2007-11-27 张臣 7
《微机原理与应用》课件
2. 汇编语言的指令格式
[标号: ] 操作码 [操作数] [; 注释]
实验报告

南通大学计算机科学与技术学院微机原理实验报告书班级:智控151学号:***********名:***南通大学计算机类课程实验报告南通大学计算机科学与技术学院微机原理实验报告书班级:智控151学号:1512042022姓名:王建棋南通大学计算机类课程实验报告六、实验结果<一><二>七、实验存在问题和解决办法程序一:检查发现第16行的“ADD AL,20H”将数字0写成了大写字母O,排除错误后可正常运行。
字符串后忘了加$,导致转换为小写字母后出现如下乱码:字符串后加结束符$后乱码消除。
程序二:分析表明第28行“CMP BL,0FFH”中FFH前要加0八、实验心得和建议南通大学计算机科学与技术学院微机原理实验报告书班级:智控151学号:1512042022姓名:王建棋南通大学计算机类课程实验报告ADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AX,4C00HINT 21HCODE ENDSEND START(如不够,请另附纸)六、实验结果七、实验存在问题和解决办法分析表明错误原因如下:(1)O写成0;(2)相对寻址只限于用SI、DI、BX、BP,而程序中却用了其它寄存器。
修改后仍有错误如下:错误原因:使用“INC BYTE PTR[BX+2]”忘了加BYTE PTR修改后仍得不到正确结果,错误如下:错误原因:“CMP [DI],'0'”应改成“CMP BYTE PTR[DI],'0'”错误全部修改后得到所要的结果八、实验心得和建议南通大学计算机科学与技术学院微机原理实验报告书班级:智控151学号:1512042022姓名:王建棋南通大学计算机类课程实验报告MOV AX,4C00HINT 21HCODE ENDSEND START(如不够,请另附纸)六、实验结果七、实验存在问题和解决办法出错原因:(1)DEC,DW 是保留字;(2)“MOV CL,10000”中10000超过范围CL的最大范围。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[公司名称]实验二顺序、分支、循环、子程序设计微机原理上机实验[作者姓名][日期]预习报告零、相关知识1,LEA指令和MOV指令的区别一、顺序结构计算m*n-w,最终结果保存在AX其中m=12, n=12, w=4最终结果为AX=008CH=140Dname "sequence strcture"org 100hMOV AX, 1000HMOV DS, AXMOV SI, 1000HMOV [SI], 12MOV [SI+1], 12MOV [SI+2], 4MOV AL, [SI]MOV BL, [SI+1]MUL BLMOV BX, 0MOV BL, [SI+2]SUB AX, BXHLT二、分支结构在DS数据段偏移地址为DATA开始的顺序80个单元中,存放着某班80个同学的微机原理考试成绩。
现欲编程序统计>=90、89~70、69~60和<60分的人数,并将统计的结果存放在当前数据段偏移地址为BUFFER的顺序单元中name “branch structure”START:MOV DX, 0000HMOV BX, 0000HMOV CX, 80LEA SI, DATALEA DI, BUFFERGOON:MOV AL, [SI]CMP AL, 90JC NEXT3INC DHJMP STORNEXT3:CMP AL, 70JC NEXT5INC DLJMP STORNEXT5:CMP AL, 60JC NEXT7INC BHJMP STORNEXT7:INC BLSTOR:INC SILOOP GOONMOV [DI], DHMOV [DI+1], DLMOV [DI+2], BHMOV [DI+3], BLHLT三、循环结构在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号16位数。
现欲编程序将这100个数按大小顺序排序(以下程序使用的是快速排序算法,也可以使用冒泡排序,嵌套两层循环)name “circle structure”LEA DI, BUFFERMOV BL, 99NEXT0:MOV SI, DIMOV CL, BLNEXT3:MOV AX, [SI]ADD, SI, 2CMP AX, [SI]JNC NEXT 5MOV DX, [SI]MOV [SI-2], DXMOV [SI], AXNEXT5:DEC CLJNZ NEXT3DEC BLJNZ NEXT0HLT四、子程序编写程序,完成将一组BCD数转换成16位二进制数。
(BCD数转换成16位二进制数用子程序实现)下面提供三种方案,分别用寄存器、储存器和堆栈传递参数①使用寄存器传递参数name "text subprogram using register"STACK SEGMENT STACKDB 256 DUP(?)STACK ENDSDATA SEGMENTBCD1 DB 07H, 06H, 07H, 02H, 03HLENG1 DB 5RESULT DW ?DATA ENDSCODEM SEGMENTASSUME CS:CODEM, DS:DATA, SS:STACKSTART:MOV AX, DATAMOV DS, AXLEA SI, BCD1MOV CX, LENG1CALL FAR PTR BCD-16BMOV RESULT, DXMOV AH, 4CHINT 21HCODEM ENDSCODES SEGMENTASSUME CS:CODES;the part of subprogramBCD-16B PROC FARPUSH BXPUSH AXADD SI, CXMOV DX, 0BCDL:DEC SIPUSH CXMOV AL, [SI]AND AL, 0FHCBWMOV BX, AXMOV AX, DXMOV CX, 10MUL CXMOV DX, AXADD DX, BXPOP CXLOOP BCDLPOP AXPOP BXRETBCD-16B ENDPCODES ENDSEND START②使用储存器传递参数name "text subprogram using store" STACK SEGMENT STACKDB 256 DUP(?)STACK ENDSDATA SEGMENTBCD1 DB 07H, 06H, 07H, 02H, 03HADSEG DW ?ADOFST DW ?LENG1 DW ?RESULT DW ?DATA ENDSCODEM SEGMENTASSUME CS:CODEM, DS:DATA, SS:STACK START:MOV AX, DATAMOV DS, AX;entrance parameterMOV AX, SEG BCD1MOV ADSEG, AXMOV AX, OFFSET BCD1MOV ADOFST, AXMOV LENG1, 5CALL FAR PTR BCD-16BMOV AH, 4CHINT 21HCODEM ENDSCODES SEGMENTASSUME CS:CODES;the part of subprogramBCD-16B PROC FARPUSH BXPUSH AXPUSH SIPUSH DSMOV DS, ADSEGMOV SI, ADOFSTMOV CX, LENG1XOR DX, DXADD SI, CXBCDL:DEC SIPUSH CXMOV AL, [SI]AND AL, 0FHCBWMOV BX, AXMOV AX, DXMOV CX, 10MUL CXMOV DX, AXADD DX, BXPOP CXLOOP BCDLPOP AXPOP BXPOP DSPOP SIRETBCD-16B ENDPCODES ENDSEND START③使用堆栈传递参数name "text subprogram using stack"STACK SEGMENT STACKDB 256 DUP(?)STACK ENDSDATA SEGMENTBCD1 DB 07H, 06H, 07H, 02H, 03HLENG1 DW ?RESULT DW ?DATA ENDSCODEM SEGMENTASSUME CS:CODEM, DS:DATA, SS:STACK START:MOV AX, DATAMOV DS, AX;pushPUSH DSLEA SI, BCD1PUSH SIMOV CX, LENG1PUSH CXCALL FAR PTR BCD-16BPOP DXMOV RESULT, DXMOV AH, 4CHINT 21HCODEM ENDSCODES SEGMENTASSUME CS:CODES;the part of subprogramBCD-16B PROC FARPUSH BPMOV BP, SPPUSH DSPUSH SIPUSH CXPUSH BXPUSH AXMOV CX, [BP]+6MOV SI, [BP]+8MOV DS, [BP]+10ADD SI, CXMOV DX, 0BCDL:DEC SIPUSH CXMOV AL, [SI]AND AL, 0FHCBWMOV BX, AXMOV AX, DXMOV CX, 10MUL CXMOV DX, AXADD DX, BXPOP CXLOOP BCDLPOP AXPOP BXPOP CXPOP DSPOP SIPOP BPRET ABCD-16B ENDP CODES ENDSEND START正式实验报告一、实验要求1.教材P74例1。
m=6,n=4,w=7。
结果Q也放在内存中。
2.教材P75例3。
3.从键盘上输入1个数,判断其奇偶性,如果是奇数,屏幕上显示”It is odd”,否则显示”It is even”。
4.从键盘上输入N个字符(N<16),求这N个字符中’A’的个数,并将’A’的个数显示在屏幕上。
5. 已知BUF1中有N1个按从小到大的顺序排列的互不相等的无符号数,BUF2中有N2个从小到大的顺序排列的互不相等的无符号数。
编写程序将BUF1和BUF2中的数合并到BUF3中,使在BUF3中存放的数互不相等且按从小到大的顺序排列。
6. 需要预习报告。
二、实验目的学习顺序、分支、循环结构以及子程序的编程设计。
三、实验过程(调试分析)3.1 textbook page74-1最后的计算结果应该为AX=6*4-7=17D=11Horg 100hMOV AX, 1000HMOV DS, AXMOV SI, 1000HMOV [SI], 6MOV [SI+1], 4MOV [SI+2], 7MOV AL, [SI]MOV BL, [SI+1]MUL BL; 6*4-->ALMOV BX, 0MOV BL, [SI+2]SUB AX, BXHLT3.2 textbook page75-3用"0","1","C","D","E","O","P","Q","R","S","$"的ASCII值代表10位学生的分数,分别为48/49/67/68/69/79/80/81/82/83分name "textbook page75-3"data segmentSCORES DB "0","1","C","D","E","O","P","Q","R","S","$";48/49/67/68/69/79/80/81/82/83endscode segmentstart:ASSUME DS:DATA, CS:CODEMOV AX, DATAMOV DS, AXMOV CX, 10MOV SI, OFFSET SCORES;<--> MOV SI, OFFSET SCORES MOV DI, 0000HGOON:MOV AL, [SI]CMP AL, 90JC NEXT3INC DHJMP STORNEXT3:CMP AL, 70JC NEXT5INC DLJMP STORNEXT5:CMP AL, 60JC NEXT7INC BHJMP STORNEXT7:INC BLSTOR:INC SILOOP GOONMOV [DI], DHMOV [DI+1], DLMOV [DI+2], BHMOV [DI+3], BLendsend start由结果可知:DH=0,DL=5,BH=3,BL=2说明90以上0人,89~70有5人,69~60有3人,小于60有2人3.3 experiment 2-3name "experiment 2-3"data segmentHEX1 DB 0AH,0DH,"It is even$"HEX2 DB 0AH,0DH,"It is odd$";0AH,0DH换行+回车endscode segmentstart:ASSUME DS:DATAMOV AX, DATAMOV DS, AX;read from the keyboardMOV CX, 16DO:MOV AH, 01HINT 21HCMP AL, 13JZ NEXT0MOV BL, ALLOOP DONEXT0:SUB BL, 48MOV AL, BLMOV BL, 2DIV BLCMP AH, 1JNZ NEXT1JZ NEXT2NEXT1:LEA DX, HEX1MOV AH, 09HINT 21HHLTNEXT2:LEA DX, HEX2MOV AH, 09HINT 21H endsend start若输入的为偶数若输入的为奇数3.4 experiment 2-4 name "experiment 2-4" data segmentHEX DB 16 DUP(0) endscode segmentstart:ASSUME DS:DATAMOV AX, DATAMOV DS, AXMOV CX, 16;read from keyboard read:CMP CX, 1JZ STOPMOV AH, 01HINT 21HCMP AL, 65JZ countCMP AL, 13JZ STOPLOOP read;count 'A' characterscount:INC BLLOOP readSTOP:MOV AH, 02HMOV DL, 0AHINT 21H; 打印换行MOV DL, 0DHINT 21H;打印回车ADD BL, 48MOV DL, BLINT 21Hendsend start3.5 experiment 2-5①冒泡排序,没有在BUF3中除去重复的字符此题设两个字符串为BUF1 = ”ACEGIK”BUF2 = ”BDFJLHMN”name "experiment 2-5";此程序不需要压入堆栈保护的数据data segmentBUF1 DB "ACEGIK$"BUF2 DB "BDFJLHMN$"BUF3 DB 14 DUP(0)endsstack segmentDB 256 DUP(0)endscode segmentstart:ASSUME DS:DATA, CS:CODEL, SS:STACKMOV AX, DATAMOV DS, AXLEA BX, BUF1LEA SI, BUF2LEA DI, BUF3CALL removeCALL reorder;段内转移,若段间转移,测试一下格式;print on the screenLEA DX, BUF3MOV AH, 09HINT 21HHLTremove proc nearMOV CX, 6DO1:MOV AX, [BX]MOV [DI], AXINC BXINC DILOOP DO1MOV CX, 8DO2:MOV AX, [SI]MOV [DI], AXINC SIINC DILOOP DO2RETremove endpreorder proc nearMOV CX, 13;注意是13,思考清楚JUDGE1:LEA DI, BUF3PUSH CXMOV CX, 13JUDGE2:MOV AL, [DI]MOV BL, [DI+1]CMP AL, BLJC NEXT1MOV [DI+1], ALMOV [DI], BLNEXT1:INC DILOOP JUDGE2POP CXLOOP JUDGE1RETreorder endpend start②采用串的合并的算法,可以除去BUF3中重复的字符name "experiment 2-5plus"data segmentBUF1 DB "ACEGIK$"BUF2 DB "BCFHILMN$"BUF3 DB 14 DUP(0)endsstack segmentDB 256 DUP(0)endscode segmentstart:ASSUME DS:DATA, CS:CODEL, SS:STACKMOV AX, DATAMOV DS, AXLEA BX, BUF1LEA SI, BUF2LEA DI, BUF3NEXT0:MOV AX, [BX]MOV DX, [SI]CMP AL, DL; 写成CMP AX, DX会出错JC NEXT1JZ NEXT1_5JA NEXT2NEXT1:MOV [DI], AXINC DIINC BXJMP NEXT3NEXT1_5:MOV [DI], AXINC BXINC SIINC DIJMP NEXT3NEXT2:MOV [DI], DXINC DIINC SIJMP NEXT3NEXT3:CMP [BX+1], 36JZ NEXT5CMP [SI+1], 36JZ NEXT6LOOP NEXT0NEXT5:INC SICMP [SI], 36JZ PRINTMOV DX, [SI]MOV [DI], DXINC DILOOP NEXT5NEXT6:INC BXCMP [BX], 36JZ PRINTMOV AX, [BX]MOV [DI], AXINC DILOOP NEXT6。