北邮微机原理软件实验报告
北京邮电大学 微机原理软件实验2

北京邮电大学微机原理软件实验·第二次实验目录题目一: (2)一、实验目的 (2)二、实验内容 (2)三、设计思路 (2)四、源程序 (3)五、实验结果(反色) (4)题目二: (5)一、实验目的 (5)二、实验内容 (5)三、设计思路 (5)四、源程序 (7)五、程序运行结果(反色) (9)题目三: (10)一、实验目的 (10)二、实验内容 (10)三、设计思路 (10)四、源程序 (11)五、程序运行结果(反色) (14)实验总结: (14)题目一:一、实验目的1、开始独立进行汇编语言程序设计,熟悉debug使用;2、掌握基本分支(如cmp,jmp,jne等),循环程序设计(如loop);3、掌握最简单的DOS 功能调用,如int 21h。
二、实验内容编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格三、设计思路2、可能使用到的函数①传送指令格式:MOV DEST,SRC功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
②加1减1指令格式:INC DESTDEC DEST功能:INC指令将目的操作数加1,结果送目的操作数。
DEC指令将目的操作数减1,结果送目的操作数。
目的操作数为通用寄存器或存储器操作数。
③无条件转移指令格式:JMP TARGET功能:使程序无条件地转移到指令规定的目的地址TARGET去执行指令。
转移分为短转移、段内转移(近程转移)和段间转移(远程转移)。
④条件转移指令该类指令是根据上一条指令对标志寄存器中标志位的影响来决定程序执行的流程,若满足指令规定的条件,则程序转移;否则程序顺序执行。
⑤输出单字符这是2号系统功能调用,其使用格式为:MOV DL,‘A’MOV AH,2INT 21H执行2号系统功能调用,将置入DL寄存器中的字符(以ASCII码形式表示)通过显示器显示出来(或从打印机输出)。
北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。
二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。
3. 用DEBUG 将可执行文件调入,并进行调试。
1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。
2) 用U 命令对目标代码反汇编,观察反汇编后的结果。
注意发现源程序的起始位置,并记录这个起始地址。
3) 用T 命令作单步跟踪调试。
比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。
北邮微机原理硬件实验报告

北邮微机原理硬件实验报告实验目的本次实验主要是通过对微机原理的学习,掌握多种硬件器件的基本使用,包括程序寄存器(PRG)、数据寄存器(DR)、累加器(AC)等,也希望能够初步了解微机系统的结构和工作原理。
实验内容1. 按以下程序编写汇编程序ORG 0HLOOP: MOV A,NUMADD BINC R5MOV MEM,R5SJMP LOOPENDNUM: DB 50HB: DB 35HR5: EQU 25HMEM: DS 1编写程序后,运行该程序,观察程序在8051微处理器上执行的情况。
2. 制作简易流水灯电路使用LED等元器件,制作一个简单的流水灯电路。
同时,编写相应的汇编程序,实现流水灯的基本效果。
3. 实现双向流水灯效果在完成流水灯电路的基础上,通过改变程序实现双向流水灯的效果。
在这个过程中,需要仔细分析程序的实现方式,并且结合8615芯片的具体情况,理解程序在底层机器中的工作方式。
4. 实现用数码管显示数字的功能使用7段数码管,将程序输出的结果显示在数码管上。
在这个过程中,我们需要灵活处理I/O端口和存储器的读写,以及处理各类中断信号。
实验过程1. 编写并调试汇编程序我们首先使用Keil软件编写了相应的汇编程序,并在8051单片机上运行。
在运行过程中发现,程序能够成功地对NUM与B进行加法运算,并将结果存储在MEM中。
2. 制作流水灯电路我们使用LED、电阻等元器件,制作了一个简单的流水灯电路,并测试了该电路的基本工作情况。
由于电路较为简单,因此没有出现特别明显的问题。
3. 实现双向流水灯效果为了实现双向流水灯效果,我们对程序进行了修改。
在这个过程中,初步出现了一些问题,包括倒计时初始值不正确、程序中断启动终止不及时等。
经过反复调试,我们成功地实现了这一功能。
4. 实现用数码管显示数字的功能最后,我们将流水灯程序变更为用数码管显示数字的程序。
在这个过程中,我们主要用到了表格查找和存储器读写等基本操作,成功将结果在数码管上显示。
北邮微机原理软件实验报告(精)

北邮微机原理软件实验报告(精)微机原理软件实验报告实验二分支、循环程序设计一.实验目的1.启动独立的汇编语言编程。
2.掌握基本分支和循环编程。
3.掌握最简单的DOS函数调用。
二、实验内容1.安排一个数据区,内存有若干个正数,负数和零。
每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
三.流程图IV源代码datasegmentzdw0;数据adw0中的零数;大于0 bdw0的数据数;数据中小于0的数量numdw9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1;设定的一组数据,其中4个0,7个正数,6个负数,符合题目要求NDW($-num/2);此组中的数据数量为类型0DB0DH,0ah,‘零的数量:$’类型1DB0DH,0ah,‘格雷特的数量:$'type2db0dh,0ah,'numberoflessthan0:$'locatedwtype0,type1,type2dataendsstacksegmentstackdw128dup(?stackendscodesegmentassumeds:data,ss:stack,cs:codestart:movax,datamovds,axmovax,stack莫夫斯,斧头;初始化DS和Ss以指向stamovbx,offsetnum;将num中第一个数字的地址送入bxmovcx,n;将n中数字个数送入cxloop1:movax[bx];取出num中的第一个数字cmpax,0;与零相比jzifz;判断结果为是0,跳转到ifz处继续执行salax,1jcifl;如果判断结果小于0,跳转到IFLincwordptra;否则,a自加,然后继续执行程序jmpcontinueifl:incwordptrb;B计数加上1jmpcontinueifz:incz;Z计数加1继续:addbx,2;指针+2,继续送入下一数字looploop1;循环cx次判断movcx,3;共显示3个字符串xorbx,bxdisp:movdx,定位[bx]movah,09h;dos09号功能调用,显示字符串int21hmovdx,z[bx]adddx,'0';转换为ASCII码movah,02h;dos02号功能调用,显示字符int21haddbx,2;指针+2(DW)loopdispmovax,4c00hint21h;返回dos系统codeendsendstart五.运行结果Vi预览问题1.十进制数0--9所对应的ascii码是什么?如何将十进制数0--9在屏幕上显示出来?。
推荐-北邮—微原软件实验报告 精品

微机原理软件实验报告学院:信息与通信工程学院班级:班内序号:姓名:学号:实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二.实验内容:1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题:1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:0—9对应的ASCII 码是30H—39H;在屏幕上显示0—9,需要将对应字符的ASCII 码赋给DL,并进行DOS的2号功能调用,0—9的ASCII 码正是其本身的数值加上30H。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:①用CMP命令和0比较,如果ZF为1,则该数为零;再用该数和8000H相与,取出符号位判断,可区分正负;②用CMP命令和0比较,结果不小于0时用JGE命令进行跳转,否则为负数;用JGE 命令跳转后,如果为0再用JZ命令跳转,否则为正数。
四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五.实验过程1.流程图2.源代码DATA SEGMENTNUM DW 0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9 ;有2个0,6 个正数,5 个负数N DW ($-NUM)/2 ;该组数据的个数Z DB 0 ;0 的个数P DB 0 ;正数的个数PO DB 0 ;正奇数的个数PE DB 0;正偶数的个数M DB 0 ;负数的个数MO DB 0;负奇数的个数ME DB 0 ;负偶数的个数STR0 DB 'number of zeros : $' ;STR0-4为用于显示的字符串STR1 DB 0DH, 0AH, 'number of positive numbers : $'STR2 DB 0DH, 0AH, 'number of negative numbers : $'STR3 DB 0DH, 0AH, ' odd : $'STR4 DB ' even : $'DATA ENDSSTACK SEGMENT STACKDW 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODESTART: MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AX ;初始化DS、SSLEA BX, NUM ;将NUM 中第一个数字的地址送入BXMOV CX, N ;将数据个数送入CXAGAIN: MOV AX, [BX] ;取出NUM 中的第一个数字CMP AX, 0 ;和0比较JGE PLU ;大于等于0时转PLUINC M ;负数的个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为负奇数JNZ MINODD ;ZF为0时转MINODD,该数为负奇数INC ME ;负偶数个数加1JMP NEXTMINODD: INC MO ;负奇数个数加1JMP NEXTPLU: JZ ZER ;等于0时转ZERINC P ;正数个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为正奇数JNZ PLUODD ;ZF为0时转PLUODD,该数为正奇数INC PE ;正偶数个数加1JMP NEXTPLUODD: INC PO ;正奇数个数加1JMP NEXTZER: INC Z ;零的个数加1NEXT: ADD BX,2 ;偏移地址加2,指向下一数字LOOP AGAIN ;CX自减,CX≠0时继续循环DISPLAY: ;在屏幕上显示统计结果MOV AH, 09H ;9号功能调用,显示字符串MOV DX, OFFSET STR0 ;将字符串的首地址的偏移地址送到DX,DS已;是其段基址INT 21HMOV AH, 02H ;2号功能调用,显示单个字符MOV DL, Z ;将零的个数送到DLADD DL, 30H ;0—9数字本身加上30H即为其ASCII 码INT 21HMOV AH, 09H ;正数部分统计结果显示,原理同上MOV DX, OFFSET STR1INT 21HMOV AH, 02HMOV DL, PADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, POADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, PEADD DL, 30HINT 21HMOV AH, 09H ;负数部分统计结果显示,原理同上MOV DX, OFFSET STR2INT 21HMOV AH, 02HMOV DL, MADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, MOADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, MEADD DL, 30HINT 21HMOV AX, 4C00H ;返回DOSINT 21HCODE ENDSEND START3.运行结果数据为:0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9运行结果:zero表示零的个数,为2;positive number表示正数的个数,为6,其中奇数odd为4个,偶数even为2个;negative number表示负数的个数,为5,其中奇数odd为2个,偶数even 为3个。
北京邮电大学微机原理软件

微机原理软件实验报告班级:姓名:学号:班内序号:指导老师:实验二分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用.二、实验内容1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过 9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.4.(选作)统计出正奇数,正偶数,负奇数,负偶数以及零的个数.三、实验设计四、源代码DATA SEGMENTARRAY DB -1,-2,-3,-4,-5,-6,0,1,2,3,5,4,5,6,0COUNT EQU $-ARRAYPOSI DB 0 ;正数NEGA DB 0 ;负数ZERO DB 0 ;零ODDPOS DB 0 ;正奇数EVENPOS DB 0 ;正偶数ODDNEG DB 0 ;负奇数EVENNEG DB 0 ;负偶数STRING1 DB '正数个数:','$' ;把最后的统计结果显示在屏幕上STRING2 DB '负数个数:','$' ;下同STRING3 DB '零的个数:','$'STRING4 DB '正奇数个数:','$'STRING5 DB '正偶数个数:','$'STRING6 DB '负奇数个数:','$'STRING7 DB '负偶数个数:','$'DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,COUNTLEA BX,ARRAY ;把数据段的偏移地址给BXLOOP1: CMP BYTE PTR [BX],0JGE POSINC NEGA ;统计负数TEST BYTE PTR [BX],01H ;利用奇数的二进制表示式最后一位必为1的特JZ ENEG ;点来判断奇偶INC ODDNEG ;统计负奇数JMP NEXTENEG: INC EVENNEG ;统计负偶数JMP NEXTPOS: JZ ZERINC POSI ;统计正数TEST BYTE PTR [BX],01HJZ EPOSINC ODDPOS ;统计正奇数JMP NEXTEPOS: INC EVENPOS ;统计正偶数JMP NEXTZER: INC ZERO ;统计零NEXT: INC BXLOOP LOOP1MOV AH,09H ;显示正数MOV DX,SEG STRING1MOV DS,DXLEA DX,STRING1INT 21HMOV AH,02HMOV DL,POSIADD DL,30HINT 21HMOV DL,0AH ;显示空格INT 21H ;显示回车MOV DL,0DHINT 21HMOV AH,09H ;显示负数MOV DX,SEG STRING2MOV DS,DXLEA DX,STRING2INT 21HMOV AH,02HMOV DL,NEGAADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示零MOV DX,SEG STRING3MOV DS,DXLEA DX,STRING3INT 21HMOV AH,02HMOV DL,ZEROADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示正奇数MOV DX,SEG STRING4MOV DS,DXLEA DX,STRING4INT 21HMOV AH,02HMOV DL,ODDPOSADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示正偶数MOV DX,SEG STRING5MOV DS,DXLEA DX,STRING5INT 21HMOV AH,02HMOV DL,EVENPOSADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示负奇数MOV DX,SEG STRING6MOV DS,DXLEA DX,STRING6INT 21HMOV AH,02HMOV DL,ODDNEGADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AH,09H ;显示负偶数MOV DX,SEG STRING7MOV DS,DXLEA DX,STRING7INT 21HMOV AH,02HMOV DL,EVENNEGADD DL,30HINT 21HMOV DL,0AHINT 21HMOV DL,0DHINT 21HMOV AX,4C00HINT 21HCODE ENDSEND START五、程序运行结果六、预习题1.十进制数 0 -- 9 所对应的 ASCII 码是什么? 如何将十进制数 0 -- 9 在屏幕上显示出来?答:十进制数0—9对应的ASCII码是30H—31H。
北邮微机原理软件实验报告

实验一1.实验要求:编一程序,将地址偏移量为100H单元开始的256个单元分别写入00H,01H,……,FFH数据;统计写入的数据块的0元素、正元素、负元素的个数,并分别将统计结果送入上述数据块后的三个单元中;用DOS功能调用显示上面数据快各单元(包括统计结果)内容,要求每行显示16个数据,两个数据之间用空格隔开。
程序设计思路:分配256个单元存放数据00H,01H,……,FFH,3个单元存放统计结果。
约定:DH存放0的个数,BH存放负数的个数,BL存放正数的个数,然后进行将256个数据一一与0进行比较,得到 DH、BH、BL。
将DH、BH、BL 存入SI的最后三个单元。
最后在以高、低4位,依次将每个单元的数据输出。
2. 程序流程:4.子程序:DISP PROC NEAR ;Show number MOV DL,AL MOV AH,2 INT 21H RET DISP ENDP开始初始化;SI 前256个单元存放00 H……FFH;CX=256;DH=0;BX=0;CMP AL ,0;MOV AL ,[SI] CX=0?将DH ,BX 存入SI ;INC SI ;CX=259;YESINC DH ;INC BHINC BL显示高4位显示低4位; 添加空格; INC SI ;BH=0??BH=16;CX=0?SF=ELSZF=1N ONO YE SN O终止YE实验二1.实验要求:编一程序,把键入的十六进制数转换成十进制,要求:(1)在屏幕上显示转换的十进制数,键入的最大值为FFFFH;(2)若键入非16进制的数,则提示错误;(3)程序中至少用一个子程序和宏命令。
2.程序设计思路:首先判断键入的字符是否为合法的十六进制字符,若是十六进制,将其转化成二进制数值,放入BX中,然后接收下一个字符,并将上一个字符左移4位,再讲此时的BX与接收到的BX相加,直到键入回车,停止接收。
然后通过除以10000,依次将余数除以1000、100、10、1,将二进制转化为十进制,再显示出来。
北邮微机原理软件实验报告

北邮微机原理软件实验报告微机原理软件实验报告实验二分支,循环程序设计一、预习题:1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:要屏显0-9的数码,可以调用02h中断,然后将要显示的数码的ASCII码存进DL里,然后执行INT 21H就可以打印字符。
当然,若不只一个数,调用09h中断(显示字符串)更好,但要将DS:DXZ指向要显示的数字在内存中的首地址,并要求以$结束。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:CMP X,0 检验标志位CFCF=1,X为负数CF=0接着检验ZF:ZF=1,X为零,ZF=0,X 为正数二、实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.三、实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.四、实验源代码assume cs:code,ds:datadata segmentbuff db 1,2,3,4,5,-1,-2,-3,0,0 ;安排的数据区string db '>0:'plus db 0;用变量plus来存储正数的个数db 0ah,0dhstring1 db '=0:'zero db 0 ;用变量zero来存储零的个数db 0ah,0dhstring2 db '<0:'minus db 0 ;用变量minus来存储负数的个数db '$'data endscode segmentstart:mov ax,datamov ds,axmov cx,10 ;初始化,并将CX赋为10,因为共有10个数mov dx,0 ;将计数器dx,ah初始化为0mov ah,0lea bx,buffcompare:cmp byte ptr [bx],0 ;取出一个数与0进行比较jge plu ;大于等于0,跳至plu执行inc ah ;小于0,用ah暂存小于0的个数,ah+1jmp next ;比完后进行下一个数的比较plu: je zer ;等于0,跳至zer执行inc dl ;大于0,用dl暂存大于0的个数,dl+1jmp next ;比完后进行下一个数的比较zer: inc dh ;等于0,用dh暂存等于0的个数,dh+1next: inc bxloop compare ;将dl,dh,ah分别赋值给变量plus,zero,minus,其ASCII分别加48add dl,48mov plus,dladd dh,48mov zero,dhadd ah,48mov minus,ahmov ah,09h ;调用09h中断,将最终结果输出lea dx,stringint 21hmov ax,4c00hint 21hcode endsend start五、流程图开始初始化,i=1,否cx=cx-1 cx是否等于0i = i+1实验截图六、实验总结及心得体会:这个实验有两个要点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理软件实验报告实验二分支,循环程序设计一、预习题:1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:要屏显0-9的数码,可以调用02h中断,然后将要显示的数码的ASCII码存进DL 里,然后执行INT 21H就可以打印字符。
当然,若不只一个数,调用09h中断(显示字符串)更好,但要将DS:DXZ指向要显示的数字在内存中的首地址,并要求以$结束。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:CMP X,0 检验标志位CFCF=1,X为负数CF=0接着检验ZF:ZF=1,X为零,ZF=0,X为正数二、实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.三、实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.四、实验源代码assume cs:code,ds:datadata segmentbuff db 1,2,3,4,5,-1,-2,-3,0,0 ;安排的数据区string db '>0:'plus db 0 ;用变量plus来存储正数的个数db 0ah,0dhstring1 db '=0:'zero db 0 ;用变量zero来存储零的个数db 0ah,0dhstring2 db '<0:'minus db 0 ;用变量minus来存储负数的个数db '$'data endscode segmentstart:movax,datamovds,axmov cx,10 ;初始化,并将CX赋为10,因为共有10个数mov dx,0 ;将计数器dx,ah初始化为0mov ah,0lea bx,buffcompare:cmp byte ptr [bx],0 ;取出一个数与0进行比较jgeplu ;大于等于0,跳至plu执行inc ah ;小于0,用ah暂存小于0的个数,ah+1jmp next ;比完后进行下一个数的比较plu: je zer ;等于0,跳至zer执行inc dl ;大于0,用dl暂存大于0的个数,dl+1jmp next ;比完后进行下一个数的比较zer: inc dh ;等于0,用dh暂存等于0的个数,dh+1next:incbxloop compare ;将dl,dh,ah分别赋值给变量plus,zero,minus,其ASCII分别加48add dl,48movplus,dladd dh,48movzero,dhadd ah,48movminus,ahmov ah,09h ;调用09h中断,将最终结果输出lea dx,stringint 21hmov ax,4c00hint 21hcode endsend start否实验截图六、实验总结及心得体会:这个实验有两个要点。
一是字符显示。
要显示数字字符,首先要把数据转换成ASCII 码,然后调用DOS功能将其显示。
其中使用09H号功能时,要特别注意每段待输出的字符串要以’$’结尾,不然无法识别串尾,输出乱码。
二是判断正负数。
本程序选用CMP指令来实现该功能。
注意与0相比时,要使用有符号数的条件跳转指令,JGE等等,在使用无符号数的条件跳转指令时,不是与0相比较。
实验三代码转换程序设计一、预习题:1.如何将输入的两个字符(0 -- 9)变为十进制或二进制数?答:两字符减去0的ASCII码(30H)后,高位数乘以十加上低位数,即变为十进制数。
2.如何将选出的最小值(二进制或十进制)变为ASCII 码再进行显示?答:将十进制数除以十,商和余数分别加上0的ASCII码后显示在屏幕上。
3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:输入的两字符为十进制数,采用十进制运算更简洁。
二、实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.三、实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.四、实验源代码;说明:分隔符为空格键,结束标志位?,例如:00 00 00 00? 为正确的输入hong1 macro x ;定义宏1,检测是否为数字(asc码在48到57之间)moval,byteptr[x]cmp al,48jbwrongcmp al,57jawrongendmhong2 macro x ;定义宏2,检测是否为空格(asc码为32)moval,byteptr[x]cmp al,32jnewrongendmassume cs:code,ds:data,ss:stackdata segmentbuffer0db 100 ;存放输入的字符number db 0num db 100 dup (0)min dw 99 ;初始化的最小值min=99string0 db 'input like 00 00 00 00?',0ah,0dh,'$'string1 db 0ah,0dh,'error!',0dh,0ah,'$'string2 db 0dh,0ah,'The minus number is 'result dw ?db '$'data endsstack segmentdb 50 dup (0)stack endscode segmentinput: movdx,seg buffer0movds,dx ;初始化movax,stackmovss,axmov sp,50call displaymovdx,offset buffer0mov ah,0ahint 21hmoval,numberxorah,ahmov bl,3div bladd ah,0jnzwrongmovcl,alxorch,chmovbx,offsetnummovdx,cxdec cxjcxza2 ;若只有个一个二位数,特殊处理,跳至a2a1: call check1 ;调用check1,检测是否为数字和空格loop a1a2: call check2 ;检测结束标识符?moval,numberxorah,ahmov bl,3div blmovcl,alxorch,chmovbx,offsetnumcompare:mov al,[bx] ;将asc码转化为相应的十进制sub al,48mov dl,10mul dlmov dl,[bx+1]sub dl,48xordh,dhadd ax,dxcmpmin,ax ;将其与最小值比较,若比最小值小,则将其赋给min jbe s ;若比最小值大,则不处理,进行下一位的处理movmin,axs: add bx,3loop comparemovax,minmov bl,10 ;将最小值转化为二进制。
再加3030H转化为对应的asc码,然后显示div blmovresult,axmov ah,09hadd result,3030h ;再加3030H转化为对应的asc码,显示movdx,offset string2int 21hmov ax,4c00hint 21hdisplay:mov ah,09hmovdx,offset string0int 21hretwrong: mov ah,09hmovdx,offset string1int 21hjmp inputcheck1: hong1 bxincbxhong1 bxincbxhong2 bxincbxretcheck2: hong1 bxincbxhong1 bxincbxcmp byte ptr [bx],63jnewrongretcode endsend input程序流程图:是模块层次图:程序截图:输入错误的格式报错,然后再次输入以正确的格式输入一个数字输入两个数字输入四个数字六、实验总结及心得体会:这个实验出了很多错。
一是逻辑错误,像输入一个两位的十进制,高位的是存放在低地址,地位的存放在高地址,刚开始弄反了,导致结果出错。
二是语法错误,[BX]前面没指明类型,加byte ptr或word ptr解决。
另外在进行十进制转换时,很繁琐,实际上可以直接比较其ASC码值,这样程序将精炼很多。
实验四子程序设计一、实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS 功能调用.二、实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三、预习题:1.如何确定一个学生在这门科目中的名次?答:通过比较科目成绩,交换在数据区中的位置来实现,最后的位置即为科目名次。
2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:排序运用起泡排序算法较为简单,两两比较相邻成绩,如果不是从大到小的顺序则交换,直到没有反序的记录。
3.准备好模块层次图.4.给出输出显示的形式.答:RANK NUM SCORE,每行依名次显示排名、学号、成绩。
四、实验源代码assume cs:code,ds:data,ss:stackdata segmentbuffer db 30 ;输入字符存放的内存区number db 0info db 30 dup (0)string1 db 0ah,0dh,'input your number,name and score like"01 wang 98" ps.100=fu',0ah,0dh,'$' string2 db 0ah,0dh,'error!',0dh,0ah,'$'string3 db 'rank no name score',0ah,0dhstudent db 220 dup (32) ;用sudent开始的内存区存放所有的输入信息eg db 22 dup (32)totalnumberdw 0 ;记录总的输入学生人数statictotaldw 0 ;记录总的输入学生人数address dw 0circlenumberdw 0data endsstack segmentdb 100 dup (0)stack endscode segmentinit: movdx,seg buffer ;初始化movds,dxmovdx,stackmovss,dxmov sp,100movdx,offset buffermovaddress,offset studentadd address,2input: mov ah,09h ;调用中断,开始输入movdx,offset string1int 21hmovdx,offset buffermov ah,0ahint 21hmovbx,offset infomovcl,numberxorch,chadd cx,0jz compare ;当敲下回车时,跳至compare,开始排序call datacmp ;检测前两位学号是否输入正确call datacmpcall spacecmp ;检测中间是否为空格键sub cx,6s1: call stringcmploop s1 ;检测姓名部分是否全部为字符call spacecmpcall fullcmp1 ;检测成绩输入是否正确,注意满分用fu表示call fullcmp2 ;检测成绩输入是否正确,注意满分用fu表示movax,seg buffermoves,axmovsi,offset infomovcl,numberxorch,chsub cx,3movdi,addresscldrep movsb ;将buffer内的内容复制到student的内存区add si,1add address,16movdi,addressmov cx,2cldrep movsbadd address,6inctotalnumber ;记录总的输入学生人数incstatictotaljmp inputcompare:movdx,offset student ;排序部分,采用冒泡排序,关键处movbx,dxdectotalnumbermovcx,totalnumberjcxzspecialcase ;当只有一个学生的信息时,特殊处理:直接赋给student内存区,输出s3: movbx,dxmovtotalnumber,cx ;将cx保存在totalnumber中s4: movcirclenumber,cx ;将内层的cx保存在circlenumber中mov ah,[bx+18]cmp ah,[bx+40]ja s5jb exchangemov ah,[bx+19]cmp ah,[bx+41]jb exchanges5: add bx,22loop s4movcx,totalnumber ;恢复cx,继续循环,直至比较完毕loop s3display:decstatictotalmovcx,statictotalmovbx,offset studentmov al,49s6: mov byte ptr [bx],almov word ptr [bx+20],0a0dhinc aladd bx,22loop s6mov byte ptr [bx],almov byte ptr [bx+20],36 ;后期处理,将排序后的学生信息输出movdx,offset string3mov ah,09hint 21hmov ax,4c00hint 21hmov byte ptr [bx],49mov byte ptr [bx+20],36movdx,offset string3mov ah,09hint 21hmov ax,4c00hint 21hexchange: ;若后面的数大于前面的数,则交换两个学生的信息(22个字节)movdi,offsetegmovsi,bxmov cx,22cldrep movsbmovdi,bxmovsi,diadd si,22mov cx,22cldrep movsbmovsi,offsetegmovdi,bxadd di,22mov cx,22cldrep movsbmovcx,circlenumber ;将内层的cx恢复出来jmp s5datacmp proc ;数字检测模块,检测是否为数字cmp byte ptr [bx],48jb wrongcmp byte ptr [bx],57ja wrongincbxretdatacmpendpfullcmp1 proc ;成绩检测模块,并包含特殊字符(f)的检测cmp byte ptr [bx],102je s8cmp byte ptr [bx],48jb wrongcmp byte ptr [bx],57ja wrongretfullcmp1 endpfullcmp2 proc ;成绩检测模块,并包含特殊字符(u)的检测cmp byte ptr [bx],117je s9cmp byte ptr [bx],48jb wrongcmp byte ptr [bx],57ja wrongs9: incbxretfullcmp2 endpspacecmpproc ;空格检测模块,检测是否为空格cmp byte ptr [bx],32jne wrongincbxretspacecmpendpwrong: mov ah,09h ;错误信息显示模块movdx,offset string2int 21hjmp inputstringcmpproc ;字符检测模块,检测是否为小写字母cmp byte ptr [bx],122ja wrongcmp byte ptr [bx],97jbextracmps2: incbxretstringcmpendpextracmp:cmp byte ptr [bx],90 ;字符检测模块,检测是否为大写字母ja wrongcmp byte ptr [bx],65jb wrongjmp s2code endsend init总流程检测模块排序模块流程图内循环cx=totalnumberbx=offset studentcx=totalnumberbx=offset studentcx=totalnumberbx=offset studentcx=totalnumberbx=offset studentcx=totalnumberbx=offset student外循环cx=totalnumberbx=offset student程序截图输入错误信息输入真确信息六、实验六、实验总结与心得体会对学生成绩的排序,本实验采用的是冒泡排序,共有内外两层循环,但在汇编中只有CX一个计数器,所以关键是在进行内层循环之前一定要保存CX,内存循环结束后要恢复CX,另外,在内存循环中交换时采用了MOVSB指令,此指令也要用到CX,故本实验需要两次保存CX,两次恢复CX,分别用了totalnumber和statictotal两个变量。