微机软件实验习题与答案(完整版)
- 格式:doc
- 大小:448.00 KB
- 文档页数:59
微计算机二三章1.已知物理地址为FFFF0H,且段内偏移量为A000H,若对应的段地址放在DS中,则DS应为(B) 。
A.5FFFHB.F5FFHC.5FFF0HD.F5FF0H2.下列CPU中属于准16位的是C 。
A.8080B.8086C.8088D.80386SX3.8088的外部数据总线为 A 位。
A.8B.16C.32D.644.8086CPU的内部结构由 D 组成。
A.ALU,EU,BIUB.ALU,BIU,地址加法器C.寄存器组,ALUD.EU,BIU5.每当8086的指令队列中有B空字节,BIU就会自动把指令取到指令队列中。
A.1个B.2个C.3个D.4个6.BIU的功能是C。
A.计算有效地址B.分析指令,产生控制信号C.与存储器或I/O端口之间进行传送,并能形成物理地址D.进行算术运算与逻辑运算7.指令队列缓冲器的作用是 D 。
A.暂存操作数地址B.暂存操作数C.暂存指令地址D.暂存预取指令8.8086的指令队列的长度是 C 字节。
A.4个B.5个C.6个D.8个9.8088的指令队列的长度是A字节。
A.4个B.5个C.6个D.8个10.下列寄存器都存在于BIU部件的是B。
A.SP、CSB.IP、DSC.BP、IPD.FR、SP11.8086 CPU内部共有 C 个16位寄存器。
A.12B.13C.14D.1612.不属于EU部分的寄存器是A 。
A.IPB.BPC.DID.SP13.8086/8088的状态标志有D个。
A.3B.4C.5D.614.8086有B个地址/数据复用引脚。
A.8B.16C.20D.3215.8088有 A 个地址/数据复用引脚。
A.8B.16C.20D.3216.8086/8088中,一个最基本的总线周期由 B 个时钟周期(T状态)组成。
A.1B.4C.2D.617.在8086/8088中,在T1状态,CPU往总线发出C信号。
A.数据B.状态C.地址D.其它18.总线周期为T1、T2、T3、T4,若要增加等待状态T W,它应插在C之后。
1、可编程定时器计数器8253(一)ioport equ 0d400h-0280hio8253a equ ioport+283hio8253b equ ioport+280hcode segmentassume cs:codestart: mov al,14h ;设置8253通道0为工作方式2,二进制计数mov dx,io8253aout dx,almov dx,io8253b ;送计数初值为0FHmov al,0fhout dx,allll: in al,dx ;读计数初值call disp ;调显示子程序push dxmov ah,06hmov dl,0ffhint 21hpop dxjz lllmov ah,4ch ;退出int 21hdisp proc near ;显示子程序push dxand al,0fh ;首先取低四位mov dl,alcmp dl,9 ;判断是否<=9jle num ;若是则为'0'-'9',ASCII码加30Hadd dl,7 ;否则为'A'-'F',ASCII码加37Hnum: add dl,30hmov ah,02h ;显示int 21hmov dl,0dh ;加回车符int 21hmov dl,0ah ;加换行符int 21hpop dxret ;子程序返回disp endpcode endsend start2、可编程定时器计数器(二)ioport equ 0d400h-0280hio8253a equ ioport+280hio8253b equ ioport+281hio8253c equ ioport+283hcode segmentassume cs:codestart:mov dx,io8253c ;向8253写控制字mov al,36h ;使0通道为工作方式3out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253aout dx,al ;先写入低字节mov al,ahout dx,al ;后写入高字节mov dx,io8253cmov al,76h ;设8253通道1工作方式2out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253bout dx,al ;先写低字节mov al,ahout dx,al ;后写高字节mov ah,4ch ;程序退出int 21hcode endsend start3、加法DATA SEGMENTDATA1 DB ' ','2','6','8','5','9','$' ;' '空格用来存放最高位进位,'$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志。
第二章计算机基础(P32)1-1电子管,晶体管,中小规模集成电路、大规模、超大规模集成电路。
1-2把CPU和一组称为寄存器(Registers)的特殊存储器集成在一片大规模集成电路或超大规模集成电路封装之中,这个器件才被称为微处理器。
以微处理器为核心,配上由大规模集成电路制作的只读存储器(ROM)、读写存储器(RAM)、输入/输出、接口电路及系统总线等所组成的计算机,称为微型计算机。
微型计算机系统是微型计算机配置相应的系统软件,应用软件及外部设备等.1-3写出下列机器数的真值:(1)01101110 (2)10001101(3)01011001 (4)11001110答案:(1)+110 (2)-13(原码) -114(反码)-115(补码)(3)+89 (4)-78(原码)-49(反码)-50(补码)1-4写出下列二进制数的原码、反码和补码(设字长为8位):(1)+010111 (2)+101011(3)-101000 (4)-111111答案:(1)[x]原=00010111 [x]反= 00010111 [x]补= 00010111(2)[x]原=00101011 [x]反= 00101011 [x]补= 00101011(3)[x]原=10101000 [x]反= 11010111 [x]补= 11011000(4)[x]原=10111111 [x]反= 11000000 [x]补=110000011-5 当下列各二进制数分别代表原码,反码,和补码时,其等效的十进制数值为多少?(1)00001110 表示原码14,反码14,表示补码为14(2)11111111 表示原码-127,反码-0,表示补码为-1(3)10000000 表示原码-0,反码-127,表示补码为-128(4)10000001 表示原码-1,反码-126,表示补码为-1271-6 已知x1=+0010100,y1=+0100001,x2=-0010100,y2=-0100001,试计算下列各式。
微机习题+答案⼀、程序填空1、下列程序段要求在100 个带符号数中找出其中最⼤的⼀个数。
设该数据区⾸址的偏移地址=2000H,最后要求将最⼤值存⼊偏移地址=2100H的单元中,试填空完成该程序。
MOV BX,2000HMOV AX,[BX]MOV CX,100LOP1:INC BXCMP AL,[BX]JNG LOP2MOV AL,[BX]LOP2:LOOP LOP1MOV [2100H] ,AL5、求某数据区内负数的个数程序如下:(在空⽩处填⼊适当的语句)。
(1)STACK SEGMENT STACK DW 64 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV DI,3000HMOV CL,[DI]XOR CH,CHMOV BL, CHINC DIA1: MOV AL, [DI]TEST AL, 80HJE A2INC BLA2: INC DILOOP A1INT 03HCODE ENDSEND START(2)STACK SEGMENT STACKDB 20 DUP(?)STACK ENDSDA TA SEGMENTNUM DB ?DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA START: MOV SI,2000HMOV CX,50MOV BL,00HA1: MOV AL,[SI]CMP AL,’A’;CMP AL,41HJNZ A2INC BLA2: INC SILOOP A1MOV NUM,BLINT 03HCODE ENDSEND START4、有如下程序段,DA TA SEGMENTX1 DB 0FAHX2 DB 0FCH DA TA ENDSCODE SEGMENT……MOV AL,X1ADD AL,X2……CODE ENDSEND问:ADD指令执⾏完后标志寄存器中的哪些位受到影响?标在题图中。
微机原理软件实验实验1 两个多位十进制数相加的实验实验内容:将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
完整代码如下:DATAS SEGMENT;此处输入数据段代码STRING1 DB'input the first number:','$'STRING2 DB 13,10,'input the second number:','$'STRING3 DB 13,10,'the output is:','$'DATA1 DB 6 DUP(00H),'$'DATA2 DB 6 DUP(00H),'$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码LEA SI,DATA1LEA DI,DATA2L0:LEA DX,STRING1;打印字符串STRING1MOV AH,09INT 21HINPUT1: ;输入第一个数MOV AH,01;输入字符至AL中INT 21HCMP AL,'/'JE L1MOV [SI],ALINC SIJMP INPUT1L1:LEA DX,STRING2;打印字符串STRING2MOV AH,09INT 21HINPUT2: ;输入第二个数MOV AH,01;输入字符至ALINT 21HCMP AL,'/'JE L2MOV [DI],ALINC DIJMP INPUT2L2:MOV SI,0CLC;清空进位标志位CFMOV CX,6PLUSE: ;相加;SUB DATA1[SI],30H;SUB DATA2[SI],30H;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使CF=1MOV AL,DATA1[SI]ADC AL,DATA2[SI]AAA;加法调整指令,可使两个ASCII数直接相加MOV DATA1[SI],AL;和赋给DATA1[SI]INC SILOOP PLUSEL3:LEA DX,STRING3;打印字符串STRING3MOV AH,09INT 21HMOV CX,6MOV SI,6SHOW:DEC SICMP DATA1[SI],00HJE SHOWSHOW2:MOV DL,DATA1[SI]ADD DL,30HMOV AH,02INT 21HCMP SI,0JE L4DEC SIJMP SHOW2L4: MOV AH,4CHINT 21HCODES ENDSEND START运行结果如下:输入为低位在前,即输入1234和99999相加实际上是4321和99999相加(即:4321+99999=104320)实验2 两个数相乘的实验(无符号数相乘)实验内容:实现十进制数的乘法。
1)(正确)比较两个无符号数的大小(量个数放在内存S3的连续两个单元中),将大数存入MAX单元中。
DATAS SEGMENTBUF DB 1,2CNT EQU $-BUFDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV CX,CNT-1LEA BX,BUFMOV AL,[BX]L2: INC BXCMP AL,[BX]JAE L1MOV AL,[BX]L1:LOOP L2ADD AL,30H- 1 - / 16MOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND STAR2)(正确)试编一程序,求三个带符号数据中的最大值,并将最大值存入MAX单元中,设三个带符号数分别在三个变量X,Y,Z中存储。
DATAS SEGMENTX DB 5Y DB-2Z DB 0MAX DB?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV AL,XMOV BL,YCMP AL,BLJG L1MOV AL,BLL1:MOV BL,ZCMP AL,BLL2: MOV MAX,ALMOV AH,4CHINT 21HCODES ENDSEND START3)(正确)根据MODE单元中编号0-7分别转向L0-L7标号处,执行L0-L7处分别完成显示‘0-7’字符,即当MODE=0时,转向L0标号,完成显示‘0’,当MODE=7时,转向L7标号,完成显示‘7’。
DATAS SEGMENTMODE DB 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:- 3 - / 16MOV AX,DATASMOV DS,AXMOV AL,MODECMP AL,0JZ L0CMP AL,1JZ L1CMP AL,2JZ L2CMP AL,3JZ L3CMP AL,4JZ L4CMP AL,5JZ L5CMP AL,6JZ L6MOV DL,'7'MOV AH,02HINT 21HJMP L8L0:MOV DL,'0'MOV AH,02HINT 21HJMP L8L1:MOV DL,'1'MOV AH,02HINT 21HJMP L8L2:MOV DL,'2'MOV AH,02HINT 21HJMP L8L3:MOV DL,'3'MOV AH,02HINT 21HJMP L8L4:MOV DL,'4'- 5 - / 16MOV AH,02HINT 21HJMP L8L5:MOV DL,'5'MOV AH,02HINT 21HJMP L8L6:MOV DL,'6'MOV AH,02HINT 21HJMP L8L8:MOV AH,4CHINT 21HCODES ENDSEND START4)(正确)根据输入值(0-4)的不同,执行不同的操作,用转移标法编写程序。
第一章习题答案1-1 请说明CPU的功能以及CPU是如何执行指令和程序的。
答:CPU的功能是执行程序和统筹处理计算机系统中各类事务。
CPU执行指令分为3步:取指令、分析指令、执行指令;计算机程序是由一条条指令按一定的顺序排列组成的,CPU执行程序的过程就是一条条指令累计执行的过程,其方式分为串行作业方式和流水线作业方式。
1-2 请说明单片机内部主要是由哪些部件组成的,并说明各部件的作用。
答:CPU:由控制器和运算器构成,控制器的作用是执行指令和协调系统各部件的工作;运算器的作用是进行逻辑运算和算术运算。
存储器:存储计算机工作时使用的信息,即指令代码和数据代码。
I/O接口电路:具有数据缓冲、数据隔离及数据转换的功能。
1-3 请问对于容量位8K的存储器芯片,它的地址线是多少根?答:8K=8192=213,故地址线为13根。
另附:存储器的数据线由存储器的字长决定,例如一块32K×16(存储器容量显示格式:存储单元数×存储单元的字长)的存储器,其地址线为15根,数据线为16根。
1-4 将十进制数78,134,分别用二进制数、十六进制数和8421BCD吗表示。
答:(78)D=(1001110)B=(4E)H=(01111000)8421BCD(134)D=(10000110)B=(86)H=(000100110100)8421BCD注:8421BCD码为4位表示一个十进制数符,本质是符号不是数值,所以不可省略0。
1-5 将下列真值分别转化为用8位和16位二进制数表示的原码、补码和反码。
X=1000100;[X]8位原=[X]8位反=[X]8位补=01000100;[X]16位原=[X]16位反=[X]16位补=0000000001000100X= -1000100[X]8位原=11000100,[X]8位反=10111011,[X]8位补=10111100;[X]16位原=1000000001000100,[X]16位反=1111111110111011,[X]16位补=1111111110111100;X= -0111111[X]8位原=10111111,[X]8位反=11000000,[X]8位补=11000001;[X]16位原=1000000000111111,[X]16位反=1111111111000000,[X]16位补=1111111111000001;1-6 将下列补码转化成二进制数的真值。
第一部分 例题与习题第1章 微型计算机基础例 题1.把十进制数转化为二进制数。
P7解:把十进制数转换成二进制数时,需要对一个数的整数部分和小数部分分别进行处理,得出结果后再合并。
整数部分:一般采用除2取余法小数部分:一般采用乘2取整法余数 低位 整数 高位 2 | 137 2 | 68 × 2 2 | 34 2 | 17 × 2 2 | 8 2 | 4 × 2 2 | 2 1 高位 低位 (137)10=()2 10=2所以,10=(.111)22.把二进制数转换为八进制数和十六进制数。
P9解:八进制、十六进制都是从二进制演变而来,三位二进制数对应一位八进制数,四位二进制数对应一位十六进制数,从二进制向八进制、十六进制转换时,把二进制数以小数点为界,对小数点前后的数分别分组进行处理,不足的位数用0补足,整数部分在高位补0,小数部分在低位补0。
(10 1)2=(010 100)2=8(1 2=(0001 2=163.将八进制数转换为二进制数。
P9解:8=(010 100)2=24.X=,Y=-,求[X -Y]补,并判断是否有溢出?P11解:[X -Y]补=[X]补+[-Y]补[X]补= [Y]补= [-Y]补=说明:当异号相减运算时,通过补码,减法运算转化为两个正数的加法运算,结果为负(符号位为1),表示运算结果溢出。
+ -------------- 1-------------- 0-------------- 0-------------- 1------------- 1 ------------- 15.B分别为原码、补码、BCD码表示时,对应的十进制数为多少?解:[X]原=,X=-21[X]补=,[X]原=,X=-107[X]BCD=,X=956.简述计算机为什么能实现自动连续的运行?解:计算机能实现自动连续的运行,是由于计算机采用了存储程序的工作原理。
把解决问题的计算过程描述为由许多条指令按一定顺序组成的程序,然后把程序和处理所需要的数据一起输入到计算机的存储器中保存起来。
微机原理实验(含解答程序)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN微机原理实验课题(共16个内容,附解答程序)(汇编程序可以使用MASM FOR WINDOWS)1.将偏移地址为2000h开始的100个单元依次设置为0~99。
2.将两个64位的二进制数相加,记录相加的和以及各个状态标志的值。
3. 编写程序,在屏幕上分行显示自己的姓名、学号。
4. 编写程序,通过键盘输入0——9之间的一个数字,利用查表法计算其平方。
在DEBUG下查看执行结果。
5. 用分支结构设计程序实现符号函数100010xy xx>⎧⎪==⎨⎪-<⎩,要求x和y存放在内存单元中,并将判断的结果在屏幕上显示输出。
6. 在键盘上输入一个字符,判断是否为小写字母,若不是,显示错误信息,若是,则将其转换为大写字母并显示。
7. 在键盘上输入一个字符,判断它是一个数字、大写字母还是小写字母,若为数字,则显示digital,若为字母,显示letter,否则,显示other。
8. 将字节型变量x的低四位(一位十六进制数)以十六进制数的形式显示。
9. 编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N (N+1)大于200为止,并将结果由屏幕上显示出来。
10. 将字形变量x以二进制数的形式在屏幕上显示输出。
11. 将字形变量x以十六进制数的形式在屏幕上显示输出。
12. 将内存单元缓冲区中的符号数(20个)按从小到大的顺序排列,并以十六进制数的形式显示。
13. 编制程序计算S=1+2+3+……+N,并将结果由屏幕上显示出来。
(要求:在屏幕上显示提示信息,提示输入N,N用十六进制表示,且N小于0FH,用子程序实现(段内),将输入的结果用十六进制数输出显示,显示结果的程序用子程序是实现(段间))。
14.要求在键盘上输入一个小于四位的十进制数,将其转换为二进制数存放,并讲转换后的结果以十六进制数的形式在屏幕上显示出来。
微机原理软件实验实验1 两个多位十进制数相加的实验实验容:将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个存单元中(低位在前),结果送回DATA1处。
完整代码如下:DATAS SEGMENT;此处输入数据段代码STRING1 DB'input the first number:','$'STRING2 DB 13,10,'input the second number:','$'STRING3 DB 13,10,'the output is:','$'DATA1 DB 6 DUP(00H),'$'DATA2 DB 6 DUP(00H),'$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码LEA SI,DATA1LEA DI,DATA2L0:LEA DX,STRING1;打印字符串STRING1MOV AH,09INT 21HINPUT1: ;输入第一个数MOV AH,01;输入字符至AL中INT 21HCMP AL,'/'JE L1MOV [SI],ALINC SIJMP INPUT1L1:LEA DX,STRING2;打印字符串STRING2MOV AH,09INT 21HINPUT2: ;输入第二个数MOV AH,01;输入字符至ALINT 21HCMP AL,'/'JE L2MOV [DI],ALINC DIJMP INPUT2L2:MOV SI,0CLC;清空进位标志位CFMOV CX,6PLUSE: ;相加;SUB DATA1[SI],30H;SUB DATA2[SI],30H;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使CF=1MOV AL,DATA1[SI]ADC AL,DATA2[SI]AAA;加法调整指令,可使两个ASCII数直接相加MOV DATA1[SI],AL;和赋给DATA1[SI]INC SILOOP PLUSEL3:LEA DX,STRING3;打印字符串STRING3MOV AH,09INT 21HMOV CX,6MOV SI,6SHOW:DEC SICMP DATA1[SI],00HJE SHOWSHOW2:MOV DL,DATA1[SI]ADD DL,30HMOV AH,02INT 21HCMP SI,0JE L4DEC SIJMP SHOW2L4: MOV AH,4CHINT 21HCODES ENDSEND START运行结果如下:输入为低位在前,即输入1234和99999相加实际上是4321和99999相加(即:4321+99999=104320)实验2 两个数相乘的实验(无符号数相乘)实验容:实现十进制数的乘法。
要求被乘数和乘数均以ASCII码形式各自顺序存放在存中,乘积在屏幕上显示出来。
完整代码如下:DATAS SEGMENT;此处输入数据段代码STRING1 DB'the output is:','$'DATA1 DB 31H,32H,33HDATA2 DB 35H,36HDATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV DL,10MOV AL,DATA1[0];AL=31HSUB AL,30H ;AL=01HMUL DL;乘10 ;AL=10ADD AL,DATA1[1];AL=10 +32HSUB AL,30H ;AL=10 +32H-30H=12MUL DL ;AL=120ADD AL,DATA1[2];AL=120+33HSUB AL,30H ;AL=120+33H-30H=123MOV BL,AL ;BL=AL;MOV AL,DATA2[0];AL=35HSUB AL,30H ;AL=5MUL DL;乘10 ;AL=50ADD AL,DATA2[1];AL=50+36HSUB AL,30H ;AL=50+36H-30H=56MUL BL ;AX=123x56=6888SUB DX,DX;DX清零MOV BX,1000DIV BX;(DX,AX)/1000,商6在AX中,余数888在DX中PUSH DXMOV DL,ALADD DL,30HMOV AH,02 ;打印最高位6INT 21HPOP DXMOV AX,DX;888赋给AXDIV BL;AX/100,商放在AL中,余数88放在AH中MOV DL,ALMOV CL,AH ;!!!这里千万不能把AH直接赋给AL,因为经过INT 21H 指令后AL,AH会改变ADD DL,30HMOV AH,02;打印第二位INT 21HMOV BL,10MOV AL,CLSUB AH,AH;清空AHDIV BL;AX/10,商放在AL中,余数8放在AH中MOV DL,ALMOV CL,AHADD DL,30HMOV AH,02;打印第三位INT 21HADD DL,30HMOV AH,02;打印第四位INT 21HCODES ENDSEND START运行结果为:实验3 字符串匹配实验实验容:编写程序实现两个字符串比较。
如果相同,则屏幕显示“match”,否则屏幕显示”nomatch”,完整代码如下:DATAS SEGMENT;此处输入数据段代码PRINT1 DB'input the first string:','$'PRINT2 DB 13,10,'input the second string:','$'PRINT3 DB'match','$'PRINT4 DB'nomatch','$'PRINT5 DB 13,10,'output: ','$'STRING1 DB 30 DUP(00H),13,10,'$'STRING2 DB 30 DUP(00H),13,10,'$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码LEA DX,PRINT1;打印字符串PRINT1MOV AH,09INT 21HLEA SI,STRING1;STRING1地址赋给SILEA DI,STRING2;STRING2地址赋给DIINPUT1:MOV AH,01;输入字符至ALINT 21HCMP AL,'/';输入字符串以‘/’结束,转L0JE L0MOV [SI],ALINC SIJMP INPUT1L0:LEA DX,PRINT2;打印字符串PRINT2MOV AH,09INT 21HINPUT2:MOV AH,01; 输入字符至ALINT 21HCMP AL,'/'JE L1MOV [DI],ALINC DIJMP INPUT2L1: MOV CX,30 ;CX=30代表比较30次MOV SI,00HCOMPARE:;字符串一个一个比较MOV AL,STRING1[SI];取STRING1存储单位中的第SI个字符赋给AL CMP AL,STRING2[SI];AL与STRING2存储单位中的第SI个字符比较JNE NOMATCHINC SILOOP COMPAREJMP MATCHNOMATCH:;打印output:nomatch LEA DX,PRINT5MOV AH,09INT 21HLEA DX,PRINT4MOV AH,09INT 21HJMP L2MATCH:;打印output:matchLEA DX,PRINT5MOV AH,09INT 21HLEA DX,PRINT3MOV AH,09INT 21HL2: MOV AH,4CHINT 21HCODES ENDSEND START 运行结果:实验4 从键盘输入数据并显示的实验实验容:将键盘输入的2位十六进制数转换为等值的二进制数,并在屏幕上显示。
列如:键入f2,则显示11110010.完整代码如下:DATAS SEGMENT;此处输入数据段代码STRING1 DB'please input a string:','$'STRING2 DB 13,10,'the output is:','$'STRING3 DB 13,10,'input error',13,10,'$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码L0: LEA DX,STRING1;打印字符串STRING1 MOV AH,09INT 21HMOV AH,01;输入第一个字符至AL中INT 21HCMP AL,'0'JB ERROR1CMP AL,'9'JBE ENTER1CMP AL,'A'JB ERROR1CMP AL,'F'JBE ENTER1CMP AL,'a'JB ERROR1CMP AL,'f'JBE ENTER1ERROR1:LEA DX,STRING3;打印字符串STRING3MOV AH,09INT 21HJMP L0ENTER1:CALL ASC2BCD;把ASCII码转化成十进制数BCD码MOV CL,4ROL AL,CLMOV BL,AL;把高四位放到BL寄存器中;输入第二个字符MOV AH,01;输入第二个字符至AL中INT 21HCMP AL,'0'JB ERROR1CMP AL,'9'JBE ENTER2CMP AL,'A'JB ERROR1CMP AL,'F'JBE ENTER2CMP AL,'a'JB ERROR1CMP AL,'f'JBE ENTER2ENTER2:CALL ASC2BCD;把ASCII码转化成十进制数BCD码ADD BL,ALLEA DX,STRING2;打印字符串STRING2MOV AH,09INT 21HMOV CX,9CLC;清空标志位SHOW: ;显示BL中的二进制数DEC CXCMP CX,0JE NEXT ;输出完八位之后返回DOSROL BL,1 ;循环左移一位,若溢出为1,则CF=1 JC M1JMP M2M1: MOV DL,'1';若CF=1,转至M1打印‘1’MOV AH,02INT 21HJMP SHOWM2: MOV DL,'0';若CF=0,转至M1打印‘0’MOV AH,02INT 21HJMP SHOWNEXT:MOV AH,4CHINT 21HASC2BCD PROCCMP AL,'9'JBE L1 ;若AL≤9,转L1SUB AL,07H ;若输入的数为A~F,或者a~f,则减7,A接在39H后面,A~F=3AH~3FH,a~f=5AH~5FHL1: SUB AL,30H ;减30HAND AL,0FH ;滤除高位,保留低位,因为a~f恰好比A~F大20H,这样a~f就和A~F的数值一样了RETASC2BCD ENDPCODES ENDSEND START输出结果为:(若输出不在0~9,A~F,a~f,则重新输入)实验5 字符和数据计算的实验实验容:先在屏幕上显示“input string,”,输入字符串; 再显示“result=”。