北京工业大学微机原理实验九
微机原理实验参考答案(航大)

《微机原理》实验参考答案实验1 汇编基本指令及顺序程序设计实验实验2 分支与DOS中断功能调用程序设计实验实验3 循环结构程序设计实验实验4 存储器扩展实验实验5 8259应用编程实验实验1汇编基本指令及顺序程序设计实验一、实验目的1、掌握汇编语言的开发环境和上机过程;2、掌握DEBUG命令;3、掌握顺序程序设计方法;4、掌握寻址方式;5、理解和掌握汇编基本指令的功能。
二、实验内容1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。
要求:用3种方法实现。
答:方法一CODE SEGMENTASSUME CS:CODESTART: MOV AX,3000HMOV BX,5000HMOV CX,AXMOV AX,BXMOV BX,CXCODE ENDSEND START方法二CODE SEGMENTASSUME CS:CODESTART: MOV AX,3000HMOV BX,5000HXCHG AX,BXCODE ENDSEND START方法三CODE SEGMENTASSUME CS:CODESTART: MOV AX,3000HMOV BX,5000HPUSH AXPUSH BXPOP AXPOP BXCODE ENDSEND START2、分别执行以下指令,比较寄存器寻址,寄存器间接寻址和相对寄存器寻址间的区别。
MOV AX,BX 寄存器寻址,将BX内容送AXMOV AX,[BX] 寄存器间接寻址,将DS:BX内存单元内容送AXMOV AX,10[BX] 寄存器相对寻址,将DS:BX+10内存单元内容送AX 在DEBUG调试模式,用A命令直接编辑相应指令并用T命令单步执行,执行后查询相应寄存器的值并用D命令查内存。
3、已知有如下程序段:MOV AX,1234HMOV CL,4在以上程序段的基础上,分别执行以下指令:ROL AX,CL AX=2341HROR AX,CL AX=4123HSHL AX,CL AX=2340HSHR AX,CL AX=0123HSAR AX,CL AX=0123HRCL AX,CL 带进位标志位的循环左移RCR AX,CL 带进位标志的循环右移4、设有以下部分程序段:TABLE DW 10H,20H,30H,40H,50HENTRY DW 3┇LEA BX,TABLEADD BX,ENTRYMOV AX,[BX]┇要求:(1)将以上程序段补充成为一个完整的汇编程序。
微机原理实验报告

(微机原理实验报告)实验报告课程名称微机原理与接口(技术)专业通信工程班级通信1301B学号1334140157学生姓名刘欢黄淮学院信息工程学院实验报告一1)8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG 2)DEBUG命令: A,D,E,G,Q,R,T,U,F,H。
3)BCD码,ASCII码及用16进制数表示二进制码的方法。
4)8086寄存器: AX,BX,CX,DX,F,IP。
2、实验预备知识1)熟悉DEBUG命令的使用2)8086、8088常用指令的练习。
3、实验内容和步骤一、DEBUG 命令使用:1、打 DEBUG 进入 DEBUG 控制,显示提示苻 '_ '。
2、用命令 F100 10F 'A' 将'A'的ASCII码填入内存。
3、用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。
4、用命令 F110 11F 41 重复上二项实验,观察结果并比较。
经过比较结果一样。
5、用命令 E100 30 31 32 …… 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?6、用H命令检查下列各组16进制数加减结果并和你的手算结果比较:(1)34H,22H (2)56H,78H (3)A5,79H(4)1284H,5678H (5)A758,347FH经过比较与手算结果相同。
7、用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
8、用R命令将AX,BX内容改写为1050H及23A8H。
二、8086/8088常用指令练习1、传送指令2、加减法指令:3、带进位加减法:4、BCD码加减通过8086的单步运行,可以清楚的了解每条指令的运行结果。
4、实验电路、程序清单本实验为DEBUG的调用,无程序和电路。
(完整版)北航微机原理实验报告

微计算机原理及运用实验报告目录实验一:I/O地址译码实验 (4)一、实验目的 (4)二、实验原理和内容 (4)三、实验程序 (4)四.实验总结 (5)实验二:8255并行接口实验 (6)一、实验目的 (6)二、实验原理和内容 (6)三、程序框图 (7)四.实验程序 (7)五.实验总结 (8)实验三:键盘显示控制实验 (9)一、实验目的 (9)二、实验内容及原理 (9)三、流程图 (10)四.程序 (10)五.实验总结 (13)实验四:8254定时器/计数器实验 (14)一、实验目的 (14)二、实验原理和内容 (14)三、实验程序 (14)四.实验总结 (15)实验五:继电器控制实验 (16)一、实验目的 (16)二、实验原理和内容 (16)三、实验中使用的程序 (16)四.实验总结 (18)实验六:DMA传送 (18)一、实验目的 (18)二、实验原理和内容 (18)三、程序 (19)四.实验总结 (20)实验七:8259 中断控制实验 (20)一、实验目的 (20)二、实验原理和内容 (21)三、流程图 (21)四.程序 (21)五.实验总结 (25)实验八:8255中断实验 (25)一、实验目的 (25)二、实验原理和内容 (25)三.实验程序 (26)四.实验总结 (27)实验一:I/O地址译码实验一、实验目的掌握I/O地址译码电路的工作原理。
二、实验原理和内容实验电路如附图1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。
译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。
附图1 I/O地址译码电路利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
北京工业大学微机原理实验报告2

北京工业大学微机原理实验报告2微机原理实验报告—实验二熟悉汇编程序建立及其调试方法姓名:学号:一、实验目的1、熟悉汇编语言源程序的框架结构,学会编制汇程序。
2、熟悉汇编语言上机操作的过程,学会汇编程序调试方法。
二、实验内容1、学习编写汇编语言源程序的方法,了解数据存放格式。
2、阅读给出的程序,找出程序中的错误。
3、通过调试给出的汇编语言源程序,了解并掌握汇编语言程序的建立、汇编、链接、调试、修改和运行等全过程。
三、实验预习1、阅读实验指导第一章的内容,了解汇编语言程序建立、汇编、链接、调试的全过程。
2、下面的汇编语言源程序有错误的,试给程序加注释。
通过调试手段找出程序中的错误并修改之。
写出程序的功能,画出程序流程图。
(1)程序修改前:STACKSG:SEGMENT PARA STACK ‘STACK’ ;不能有冒号DB 256 DUP(?)STACKSG ENDSDATASG: SEGMENT PARA ‘DATA’;不能有冒号BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512DW 23,56,420,75,0,-1024,-67,39,-2000COUNT EQU 20MAX DW ?DATASG ENDSCODESG: SEGMENT ;不能有冒号ASSUME SS:STACKSG , CS:CODESGASSUME DS:DATASGORG 100HBEGIN MOV DS, DATASG ;BEGIN: 应改为MOV AX , DATASG MOV DS, AX LEA SI ,BLOCKMOV CX, COUNTDEC CXMOV AX , [SI]CHKMAX ADD SI,2 ;应加冒号CHKMAX: CMP [SI] , AXJLE NEXTMOV AX , [SI]DEC CX ;删除NEXT: LOOP CHKMAXMOV MAX ,AXMOV AH, 4CHINT 21HCODESG ENDSEND BEGIN(2)程序修改后:STACKSG SEGMENT PARA STACK ‘STACK’DB 256 DUP(?)STACKSG ENDSDATASG SEGMENT PARA ‘DATA’BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512DW 23,56,420,75,0,-1024,-67,39,-2000COUNT EQU 20MAX DW ?DATASG ENDSCODESG SEGMENTASSUME SS:STACKSG , CS:CODESGASSUME DS:DATASGORG 100HBEGIN MOV AX , DATASGMOV DS, AXLEA SI ,BLOCKMOV CX, COUNTDEC CXMOV AX , [SI]CHKMAX:ADD SI,2CMP [SI] , AXJLE NEXTMOV AX , [SI]NEXT: LOOP CHKMAXMOV MAX ,AXMOV AH, 4CHINT 21HCODESG ENDSEND BEGIN(3)程序注释:STACKSG SEGMENT PARA STACK 'STACK'DB 256 DUP(?)STACKSG ENDS ;定义堆栈段DATASG SEGMENT PARA 'DATA' ;数据段定义BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512DW 23,56,420,75,0,-1024,-67,39,-2000 ;定义变量BLOCK包含20个字COUNT EQU 20 ;COUNT=20MAX DW ? ;定义字变量MAX并不赋值DATASG ENDSCODESG SEGMENT ;代码段定义ASSUME SS:STACKSG , CS:CODESG ;说明STACKSG是堆栈段ASSUME DS:DATASG ;CODESG是代码段,DATASG是数据段ORG 100HBEGIN: MOV AX, DATASGMOV DS, AX ;DS指向DATASGLEA SI ,BLOCK ;取BLOCK的有效地址给SIMOV CX, COUNT ;CX=20DEC CX ;CX=CX-1MOV AX , [SI] ;将DS:[SI]里的值送到AX CHKMAX : ADD SI, 2 ;SI=SI+2CMP [SI] , AX ;比较DS:[SI]与AX值的大小JLE NEXT ;如果DS:[SI]的值小于AX里的值,则跳转到NEXT MOV AX , [SI] ;将DS:[SI]的值送到AXNEXT: LOOP CHKMAX ;循环CHKMAXMOV MAX ,AX ;将AX的值送到变量MAXMOV AH, 4CH ;结束INT 21HCODESG ENDSEND BEGIN(4)程序的流程图:Y NNY(5)程序的功能:找出20个数中的最大值并保存。
FPGA北京工业大学实训

2013-2014电路系统设计实验报告学院专业姓名学号日期指导教师目录一、实验目的 (3)二、实验环境 (3)三、实验内容 (3)●实验1 多种信号发生器与嵌入式逻辑分析仪的使用 (3)(1)实验原理 (3)(2)实验内容及步骤 (4)(3)代码 (4)(4)结果 (7)●实验2 交通灯控制器实验 (10)(1)原理 (10)(2)实验内容及步骤 (10)(3)代码 (11)(4)结果 (15)●实验三并行乘法器流水线设计 (16)(1)原理 (16)(2)实验内容及步骤 (17)(3)代码 (17)(4)实验结果 (23)●实验四 SOPC软核创建 (25)(1)原理 (25)(2)实验内容及步骤 (25)(3)代码 (25)(4)实验结果 (25)四、实验总结 (27)经过这次的FPGA实验的锻炼,我的思维能力和动手能力都有了提高,比如在做交通灯实验的时候,我事先读懂了程序,实验做起来就比较快。
(27)一、 实验目的通过正弦信号发生器设计和实现,进一步学习硬件设计平台。
二、 实验环境(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2) 软件:Quartus II三、 实验内容实验1 多种信号发生器与嵌入式逻辑分析仪的使用(1) 实验原理正弦信号发生器在FPGA 中由3个部分实现: 1、6位计数器产生地址信号; 2、存储正弦信号(6bits 地址线,8bits 数据线)的ROM ,由LPM_ROM 模块实现,LPM_ROM 模块底层由FPGA 的EAB 、ESB 或M4K 来实现。
地址发生器的时钟频率CLK 假设为f0,设定的地址发生器为6bit ,则周期为26=64,所以一个正弦周期内可以采样64个点,DAC 后的输出频率f 为:64/0f f3、DA 接口设计4.嵌入式逻辑分析仪的组成框图如图 37-1 所示,主要分为硬件部分和软件部分。
微机原理实验报告

微机原理实验报告院别:物理与电子工程学院专业:电子信息工程0911班实验一两个多位十进制数相加的实验一、实验目的学习数据传送和算术运算指令的用法熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。
二、实验内容将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在以DATA1、DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、程序框图四、实验所用程序DATA SEGMENTDATA1 DB 33H,39H,31H,37H,34H;被加数DATA1END EQU $-1DATA2 DB 34H,35H,30H,38H,32H;加数DATA2END EQU $-1SUM DB 5 DUP(?)DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV SI,OFFSET DATA1ENDMOV DI,OFFSET DATA2ENDCALL ADDAMOV AX,4C00HINT 21HADDA PROC NEARMOV DX,SIMOV BP,DIMOV BX,05HAD1: SUB BYTE PTR [SI],30H SUB BYTE PTR [DI],30HDEC SIDEC DIDEC BXJNZ AD1MOV SI,DXMOV DI,BPMOV CX,05HCLCAD2: MOV AL,[SI]MOV BL,[DI]ADC AL,BLAAAMOV [SI],ALDEC SIDEC DILOOP AD2MOV SI,DXMOV DI,BPMOV BX,05HAD3: ADD BYTE PTR [SI],30H ADD BYTE PTR [DI],30H DEC SIDEC DIDEC BXJNZ AD3RETADDA ENDPCODE ENDSEND START五、实验程序分析及预计结果数据定义段省略分析MOV SI,OFFSET DATA1END ;将DATA1的偏移地址给SI,SI中存放的是0004 MOV DI,OFFSET DATA2END ;将DATA2的偏移地址给DI,DI中存放的是0009 CALL ADDA;调用子程序ADDAMOV AX,4C00HINT 21HADDA PROC NEARMOV DX,SIMOV BP,DIMOV BX,05HAD1: SUB BYTE PTR [SI],30H;将SI中的数值变为十进制数SUB BYTE PTR [DI],30H;将DI中的数值变为十进制数DEC SI;将SI中的地址前移一位改变下一个数值DEC DI;将DI中的地址前移一位改变下一个数值DEC BX;定义循环的次数JNZ AD1;在BX中的数值不等于0的情况下循环执行AD1MOV SI,DX;重新初始化SIMOV DI,BP;重新初始化DIMOV CX,05HCLC ;将进位标志位清零AD2: MOV AL,[SI]MOV BL,[DI]ADC AL,BL;将AL,BL中的数据用带进位的加法相加,保存到AL中AAAMOV [SI],ALDEC SIDEC DILOOP AD2MOV SI,DXMOV DI,BPMOV BX,05HAD3: ADD BYTE PTR [SI],30H;将十进制数转化为十六进制,并存到SI中ADD BYTE PTR [DI],30H;将十进制数转化为十六进制,并存到DI中DEC SIDEC DIDEC BXJNZ AD31、在数据段,定义了一个data1,分配的地址是00~04,data1end里面的内容是04h,且不占内存,定义的data2,分配的地址是05~09,类似的,data2end里面的内容是09h2、在循环AD1过程中,data1里面的内容从开始的33h,39h,31h,37h,34h变为3,9,1,7,4;data2里面的内容也从开始的34h,35h,30h,38h,32h变为4,5,0,8,2。
北京工业大学-微机原理-实验十二-交通灯控制实验-实验报告

微机原理实验报告——实验九交通灯控制实验姓名:学号:一、实验要求用8255、8253芯片模拟实现交通灯控制,要求亮灯时间用8253控制二、延时置数设计提供的时钟频率为1MHz,而8253最大工作频率为2MHz,所以无需分频。
延时5秒对应的计数初值为N=5秒/1MHz=5000000,因为8253有3个16位计数器,每个计数器最大计数初值为:65535<5000000,所以将两个计数器串联使用。
计数器0计数初值为1000,计数器1计数初值为5000。
三、实验内容1.实验电路原理图2.实际电路图2.实验流程图3.实验代码IOPORT EQU 5400H-280H ;定义CPU输出地址CODE SEGMENTASSUME CS:CODESTART: MOV AL, 00100101B ;设置8253用计数器0,只读高字节,方式2(自动重复),10进制MOV DX, IOPORT+293HOUT DX, ALMOV AL, 10H ;给计数器0置数1000(0001 0000 0000 0000)MOV DX, IOPORT+290HOUT DX, ALMOV AL, 10010000B ;初始化8255,1--控制字,A口方式0输入,C口输出,B口输出MOV DX, IOPORT+28BHOUT DX, ALINOUT: MOV AL, 00100100B ;南北路口绿灯亮,东西路口红灯亮MOV DX, IOPORT+28AH ;C口0方式输出,所以可以直接控制PC0~PC7的输出电平OUT DX, ALMOV AL, 01100001B ;设置8253通道1,只读高字节,方式0(不自动重复),10进制MOV DX, IOPORT+293HOUT DX, ALMOV AL, 50H ;置数5000,与计数器0串联即:延时5秒MOV DX, IOPORT+291HOUT DX, ALLOP1: MOV DX, IOPORT+288H ;A口查询,判断延时是否结束IN AL, DXCMP AL, 0JE LOP1 ;延时结束,顺序执行,否则继续查询MOV AL, 01000100B ;南北路口黄灯亮,东西路口红灯亮MOV DX, IOPORT+28AH ;C口0方式输出,所以可以直接控制PC0~PC7的输出电平OUT DX, ALMOV AL, 01100001B ;设置8253通道MOV DX, IOPORT+293HOUT DX, ALMOV AL, 30H ;延时3秒(1000*3000),原理与延时5秒一致MOV DX, IOPORT+291HOUT DX, ALLOP2: MOV DX, IOPORT+288H ;A口查询,判断延时是否结束IN AL, DXCMP AL, 0JE LOP2 ;延时结束,顺序执行,否则继续查询MOV AL, 10000001B ;南北路口红灯亮,东西路口绿灯亮MOV DX, IOPORT+28AH ;C口0方式输出,所以可以直接控制PC0~PC7的输出电平OUT DX, ALMOV AL, 01100001B ;设置8253通道1MOV DX, IOPORT+293HOUT DX, ALMOV AL, 50H ;延时5秒MOV DX, IOPORT+291HOUT DX, ALLOP3: MOV DX, IOPORT+288HIN AL, DXCMP AL, 0JE LOP3MOV AL, 10000010B ;南北路口红灯亮,东西路口黄灯亮MOV DX, IOPORT+28AHOUT DX, ALMOV AL, 01100001B ;设置8253通道1MOV DX, IOPORT+293HOUT DX, ALMOV AL, 30H ;延时3秒MOV DX, IOPORT+291HOUT DX, ALLOP4: MOV DX, IOPORT+288HIN AL, DXCMP AL, 0JE LOP4MOV AH, 0BH ;检查键盘状态(不等待),AL=FFH 表示有键入,AL=00H表示无键入INT 21HCMP AL,0FFH ;有键入,程序退出JNZ INOUTMOV AH, 4CHINT 21HCODE ENDSEND START四、实验中遇到的问题地址书上要求定义的范围是从280H开始的,而我们在编写程序的时候是从288H开始使用的,再连线的时候,忘记了这一点,而致使结果一直出不来,后来再检查连线的时候发现了这个问题,即使进行了改正,出现了预计效果,试验成功。
北京化工大学微机原理硬件实验报告

实验三:可编程并行接口8255code segmentassume cs:codestart:mov dx,28bhmov ax,8bhout dx,axinout:mov dx,28ahin ax,dxmov dx,288hout dx,axmov dl,0ffhmov ah,06hint 21hjz inoutmov ah,4chint 21hcode endsend start实验八:可编程定时器/计数器(8254 4 )code segmentassume cs:codestart:mov al,3ehmov dx,283hout dx,almov ax,0mov dx,280hout dx,almov al,ahout dx,almov al,0behmov dx,283hout dx,almov ax,10mov dx,282hout dx,almov al,ahout dx,alint 21hmov ax,4chcode endsend start实验十三:中断data segmentmess db 'TPCA interrupt!',0dh,0ah,'$' data endscode segmentassume cs:code,ds:datastart:mov ax,csmov ds,axmov dx,offset int3mov ax,250bhint 21hcliin al,21hand al,0f7hout 21h,almov cx,10still:jmp llint3:mov ax,datamov ds,axmov dx,offset messmov ah,09int 21hmov al,20hout 20h,alloop nextin al,21hor al,0Bhout 21h,alstimov ah,4chint 21hnext:iretcode endsend start实验十六:串行通讯8251data segmentio8253a equ 280hio8253b equ 283hio8251a equ 2b8hio8251b equ 2b9hmes1 db 'you can play a key on the keybord!',0dh,0ah,24hmes2 dd mes1data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8253b ;设置计数器工作方式mov al,16hout dx,almov dx,io8253amov al,52 ;给计数器送初值out dx,almov dx,io8251b ;初始化xor al,almov cx,03 ;向控制端口送个delay: call out1loop delaymov al,40h ;向控制端口送H,使其复位call out1mov al,4eh ;设置为个停止位,8个数据位,波特率因子为 call out1mov al,27h ;向送控制字允许其发送和接收call out1lds dx,mes2 ;显示提示信息mov ah,09int 21hwaiti: mov dx,io8251bin al,dxtest al,01 ;发送是否准备好jz waitimov ah,01 ;是,从键盘上读一字符int 21hcmp al,27 ;若为ESC,结束jz exitmov dx,io8251ainc alout dx,al ;发送mov cx,40hs51: loop s51 ;延时next: mov dx,io8251bin al,dxtest al,02 ;检查接收是否准备好jz next ;没有,等待mov dx,io8251ain al,dx ;准备好,接收mov dl,almov ah,02 ;将接收到的字符显示在屏幕上 int 21hjmp waitiexit: mov ah,4ch ;退出int 21hout1 proc near ;向外发送一字节的子程序out dx,alpush cxmov cx,40hgg: loop gg ;延时pop cxretout1 endpcode endsend start。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验九数码转换一、实验目的1、掌握计算机常用数据编码之间的相互转换方法。
2、进一步熟悉DEBUG软件的使用方法。
二、实验内容1. ACSII码转换为非压缩型BCD码编写并调试正确的汇编语言源程序,使之实现:设从键盘输入一串十进制数,存入DATA1单元中,按回车停止键盘输入。
将其转换成非压缩型(非组合型) BCD码后,再存入DATA2开始的单元中。
若输入的不是十进制数,则相应单元中存放FFH。
调试程序,用D命令检查执行结果。
2. BCD码转换为十六进制码编写并调试正确的汇编语言源程序,使之将一个16位存储单元中存放的4位BCD码DATA1,转换成十六进制数存入DATA2字单元中。
调试程序,用D命令检查执行结果。
3. 十六进制数转换为ASCII码编写并调试正确的汇编语言源程序,使之将内存DATA1字单元中存放的4位十六进制数,转换为ASCⅡ码后分别存入DATA2为起始地址的4个单元中,低位数存在低地址的字节中,并在屏幕上显示出来。
三、实验预习1. 复习材料中有关计算机数据编码部分的内容。
2. 按要求编写程序。
四、实验步骤1. 编辑源文件,经汇编连接产生EXE文件。
2. 用DEBUG调试、检查、修改程序。
五、实验内容1. ACSII码转换为非压缩型BCD码STACK SEGMENT PARA STACK 'STACK'DB 256 DUP() ; 为堆栈段留出256个字节单位STACK ENDSDATA SEGMENT PARA 'DATA';定义数据段DATA1 DB 32 ; 缓冲区最大长度DBDB 32 DUP()DATA2 DB 32 DUP()DATA ENDSCODE SEGMENT; 定义代码段ASSUME SS:STACKASSUME CS:CODEASSUME DS:DATASTART: MOV AX,DATAMOV DS,AXLEA DX,DATA1 ; 规定:DX存放输入字符串的缓冲区首地址MOV AH,0AHINT 21H ; 字符串输入AL=键入的ASCII码LEA SI,DATA1LEA DI,DATA2 ; DI存放DATA2首地址INC SIMOV CH,0MOV CL,[SI] ; 取输入字符串长度INC SI ; 指向第一个输入字符LP1:MOV AL,[SI]SUB AL,30H ; 输入的字符存为ASCII码,将其转换成十进制数CMP AL,0 ; 若AL<0(AL-0<0),跳转到LP2JL LP2CMP AL,9 ; 若AL>9(AL-9>0),跳转到LP2JG LP2MOV BL,AL ; 将AL->BLMOV [DI],BL ; 将结果存到DATA2开始的单元中INC DIINC SIDEC CLJMP LP1LP2:MOV AL,0FFH ; 若输入的不是十进制数,在相应的单元存放FFH; 以字母开头的十六进制数前面需加'0'MOV BL,AL ; 将AL->BLMOV [DI],BLINC DIINC SICMP CL,0JNZ LP1 ; CL=0,执行LP3中的语句LP3:MOV AH,4CHINT 21HCODE ENDSEND START2. BCD码转换为二进制码DATA SEGMENTDATA1 DW 2497HDATA2 DWDATA ENDSCODE SEGMENTASSUME CS:CODEASSUME DS:DATASTART:MOV AX,DATAMOV DS,AXXOR BX,BX ;累加单元清0(BX=0)MOV SI,0AH ;设置乘数10MOV CL,4 ;指4位BCD码MOV CH,3 ;循环次数=3MOV AX,DATA1 ;取十进制数LP:ROL AX,CL ;取数字MOV DI,AX ;保存当前AX值AND AX,0FH ;屏蔽高位ADD AX,BX ;累加MUL SIMOV BX,AXMOV AX,DIDEC CH ;循环次数减1JNZ LP ;以上完成循环三次,个位不用再*10,所以不用最后不用放入循环中去ROL AX,CL ;取个位数字AND AX,0FH ;屏蔽高位ADD AX,BX ;进行累加,直接将最后的累加结果放到AX中MOV DATA2,AXMOV AH,4CHINT 21HCODE ENDSEND START3. 十六进制数转换为ACSII码STACK SEGMENTDB 256 DUP()STACK ENDSDATA SEGMENTDATA1 DB 24H,06DHDATA2 DB 4 DUP() ; 存放ASCII码JUMP DB 4 DUP() ; 4位十六进制数分别存放在DATA3的4个字节中DATA ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODESTART:MOV AX,DATAMOV DS,AXLEA SI,DATA1LEA DI,JUMPMOV CH,2 ; 循环2次,取两次两位十六进制数LP0:MOV AL,[SI] ; 取2位十六进制数AND AL,0F0H ; 低四位为零MOV CL,4ROR AL,CL ; 右移4位相当于除以16 MOV [DI],AL ; 高位数存放在高地址字节中INC DIMOV AL,[SI] ; 取2位十六进制数AND AL,0FH ; 高四位为零MOV [DI],AL ; 低位数存放在低地址字节中INC SIINC DIDEC CHJNZ LP0LEA SI,JUMP ; SI=JUMP的首地址偏移量LEA DI,DATA2 ; DI=DATA2的首地址偏移量MOV CH,4 ; 因为是四位十六进制数,所以设置为循环4次LP1:MOV AL,[SI] ; 取JUMP中的十六进制数CMP AL,9JG LP2 ; 若AL>9(AL-9>0),跳转到LP2ADD AL,30H ; 0~9H+30H=ASCII JMP LP3LP2:ADD AL,37H ; A~FH+30H=ASCII LP3:MOV [DI],AL ; 将ASCII码依次存入DATA2中INC DIINC SIDEC CHJNZ LP1MOV AH,09HINT 21HMOV DX,OFFSET DATA2MOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START六、实验习题与思考1. 编程实现:从键盘上输入两位十六进制数,转换成十进制数后显示在屏幕上。
STACK SEGMENTDB 256 DUP()STACK ENDSDATA SEGMENTDATA1 DB 5,,2 DUP()DATA2 DB 2 DUP()DATA3 DB 2 DUP()DATA ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODESTART:MOV AX,DATAMOV DS,AXLEA DX,DATA1MOV AH,0AHINT 21H ;输入字符串LEA SI,DATA1+2LEA DI,DATA2MOV CL,2 ;将ASC码转换为十六进制数LP1: MOV AL,[SI]SUB AL,30HCMP AL,9JA LP2MOV [DI],ALINC DIINC SIDEC CLJZ LP3JNZ LP1LP2: SUB AL,7MOV [DI],ALINC DIINC SIDEC CLJNZ LP1 ;将十六进制数转换成十进制数,并保存LP3: LEA DI,DATA2MOV AL,[DI]MOV BL,[DI+1]MOV CL,4SHL AL,CLADD AL,BLMOV [DI],ALLEA SI,DATA3XOR AH,AHMOV CL,100DIV CL ;AH=AX%100,AL=AX/100MOV [SI],AL ;保存百位数MOV AL,AHXOR AH,AHMOV CL,10DIV CLMOV [SI+1],AL ;保存十位数MOV [SI+2],AH ;保存个位数 ;屏幕显示十进制数LP4: MOV DL,[SI] ;取百位数送显OR DL,30HMOV AH,02HINT 21HMOV DL,[SI+1] ;取十位数送显OR DL,30HMOV AH,02HINT 21HMOV DL,[SI+2] ;取个位数送显OR DL,30HMOV AH,02HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START2. 十进制数转换为七段码。
为了在七段显示器上显示十进制数,需要把十进制数转换为七段代码。
转换可采用查表法。
设需要转换的十进制数已存放在起始地址为DATA1区域中,七段代码转换表存放在起始地址为TABLE表中,转换结果存放到起始地址为DATA2区域。
若待转换的数不是十进制数,则相应结果单元内容为00H。
STACK SEGMENTDB 256 DUP()STACK ENDSDATA SEGMENTDATA1 DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'A','B','C','$'TABLE DB 00H,40H,01H,79H,02H,24H,03H,30H,04H,19H,05H,12H,06H,02H,07H,78H,08H,00H,09H,18H,0AH,08H,0BH,03H,0CH,46H,0DH,21H,0EH,06H,0FH,0EH ;实际数据定义必须在同一行DATA2 DB 16 DUP(0)COUNT EQU 2DATA ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODESTART: MOV AX,DATAMOV DS,AXLEA SI,DATA1LEA BX,DATA2LEA DI,TABLEXOR AH,AHLP1: MOV AL,[SI] ;外循环DATA1指向下一个INC SIMOV CX,16 ;内循环TABLE 16次LP2: CMP [DI],ALJE LP3ADD DI,COUNT ;内循环TABLE指向下一组DEC CXJNZ LP2MOV BYTE PTR[BX],00H 若不是十进制数,则结果保存为00H INC BXCMP AL,'$' ;设置结束标志JNZ LP1JZ LP4LP3: MOV AL,[DI+1]MOV [BX],AL ;转换结果保存在DATA2中INC BXLEA DI,TABLECMP CL,0JNZ LP1LP4: MOV AH,4CHINT 21HCODE ENDSEND START。