当前位置:文档之家› 汇编实验报告

汇编实验报告

XXXX大学实验报告课程名称汇编语言程序设计成绩实验学时评语:指导教师:年月日班级:学号:姓名:地点:时间:实验一汇编语言编程实验一、实验目的(1)掌握汇编语言的编程方法(2)掌握DOS功能调用的使用方法(3)掌握汇编语言程序的调试运行过程二、实验内容1. 将指定数据区的字符串数据以ASCII码形式显示在屏幕上,并通过DOS功能调用完成必要提示信息的显示。

2. 在屏幕上显示自己的学号姓名信息。

3. 循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的ASCII码,直到输入”Q”或“q”时结束。

4. 实验中使用的DOS功能调用: INT 21HAH 值功能调用参数结果1 键盘输入并回显AL=输出字符2 显示单个字符(带Ctrl+Break检查) DL=输出字符光标在字符后面6 显示单个字符(无Ctrl+Break检查) DL=输出字符光标在字符后面8 从键盘上读一个字符AL=字符的ASCII码光标跟在串后面9 显示字符串DS:DX=串地址,‘$’为结束字符4CH 返回DOS系统AL=返回码例如,实现键盘输入并回显的完整代码:MOV AH 01HINT 21H三、实验结果1. 将指定数据区的字符串数据”Let us go !”以ASCII码形式显示在屏幕上,并通过DOS功能调用完成必要提示信息的显示:2. 在屏幕上显示自己的学号姓名信息3.循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的ASCII码,直到输入”Q”或“q”时结束。

四、实验原理DATA SEGMENTMES DB 'NUMBER: 03099018 ',0AH,0DH,'NAME: Feng Xiaokang',0AH,0DH,'$'CENT DB 'Let us go !','$'ENTE DB 0AH,0DH,'$'INFO DB 'Origin: ','$'ASCI DB 'ASCII : ','$'MSG1 DB 'If you want to quit please press...q/Q...',0AH,0DH,'$' MSG2 DB 0AH,0DH,'Char: $'RS DB ' ASCII: $'SD DB ''DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA ;存储数据MOV DS,AXMOV DX,OFFSET MES ;显示数据MOV AH,09HINT 21HMOV DX,OFFSET MSG1MOV AH,09HINT 21HMOV DX, OFFSET CENTMOV SI, DXT: MOV AL,[SI]CMP AL,'$'JZ C1AND AL,0F0H ;取高4位MOV CL,4SHR AL,CLCMP AL,0AH ;是否是A以上的数JB AADD AL,07HA: ADD AL,30HMOV DL,AL ;show characterMOV AH,02HINT 21H;MOV AL,DS:[SI]MOV AL, [SI]AND AL,0FH ;取低4位CMP AL,0AHJB BADD AL,07HB: ADD AL,30HMOV DL,ALMOV AH,02HINT 21HINC SILOOP TC1: MOV DX,OFFSET MSG2MOV AH,09HINT 21HMOV AH,01hINT 21hCMP AL,'q'JE exitCMP AL,'Q'JE exitMOV SD,ALMOV DX,OFFSET RS ;show messageMOV AH,09HINT 21HMOV SI,OFFSET SDMOV AL,[SI]AND AL,0F0H ;取高4位MOV CL,4SHR AL,CLCMP AL,0AH ;是否是A以上的数JB C2ADD AL,07HC2: ADD AL,30HMOV DL,AL ;show characterMOV AH,02HINT 21HMOV AL,DS:[SI]AND AL,0FH ;取低4位CMP AL,0AHJB C3ADD AL,07HC3: ADD AL,30HMOV DL,ALMOV AH,02HINT 21HLOOP C1C: MOV DX,OFFSET MSG1MOV AH,09HINT 21HLOP: MOV AH,08HINT 21HCMP AL,'Q'JE exitCMP AL,'q'JE exitJMP LOPEXIT: MOV AX,4C00H ;go back to dosINT 21HCODE ENDSend START五、实验流程图六、实验总结这是我学习汇编以来,第一次用汇编写程序,费了我不只一个实验课时,纠结了不只一天。

同样是助记码,真的不懂如何组织的。

郁闷之下,用C写出来发泄一下,才猜想应该跟C的思考方式完全不同。

后来开始研究代码,真的不愧是底层啊,详细到一个字节高低位的安排,如此地考验硬件知识。

实验二数码转换实验一、实验目的1. 掌握不同进制数及编码相互转换的程序设计方法。

2. 掌握运算类指令编程及调试方法。

3. 掌握循环程序的设计方法。

二、实验设备PC机一台。

三、实验内容及说明1. 重复从键盘输入不超过5位的十进制数,按回车键结束输入;2.将该十进制数转换成十六进制数;结果以16进制数的形式显示在屏幕上;3.如果输入非数字字符,则报告出错信息,重新输入;4.直到输入“Q”或‘q’时程序运行结束。

四、实验结果1.输入33062.结果0CEA3.输入一个较大的数655374.显示456A65.输入非法值五、实验原理图源代码:DATA SEGMENTNUMBER DB 'No.: 03099018 ',0AH,0DH,'NAME: Fengxiaokang',0AH,0DH,'$' ERROR DB 0AH,0DH,'ERROR! PLEASE TRY AGAIN!',0AH,0DH,'$'INP DB 0AH,0DH,'Please input a number,you can exit by inputing "q" or "Q"',0AH,0DH,'$' XP DB 0AH,0DH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAstart: MOV AX,DATAMOV DS,AXMOV DX,OFFSET NUMBERMOV AH,09HINT 21HMOV BX,0HMOV DX,OFFSET INPMOV AH,09HINT 21Hinput:MOV AH,01HINT 21HCMP AL,0DH ;数字输入完毕JE changeCMP AL,'Q' ;退出JE EXITCMP AL,'q'JE EXITCMP AL,030h ;非数字jl errorscmp AL,039hjg errorsSUB AL,30H ;运算push AXmov AX,BXmov DX,0000AHmul DXmov BX,AXpop AXadd BL,ALCMP BX,00HJZ ZEROjmp inputerrors: MOV DX,OFFSET ERRORMOV AH,09HINT 21HMOV BX,0Hjmp inputZERO: MOV CL,4JMP LOOPSchange:CMP BX,00HJZ ERRORSMOV CL,4loops:MOV DX,BXAND DX,0F000HSHR DX,12CMP DX,0AH ;是否是A以上的数JL C2ADD DX,07HC2: ADD DX,30H;show chArActerMOV AH,02HINT 21HSHL BX,4LOOP loopsMOV DX,OFFSET XPMOV AH,09HINT 21HJMP INPUTEXIT:MOV AX,4C00HINT 21HCODE ENDSEND START原理十进制数可以表示为:D n*10n+D n-1*10n-1+…+D0*100=∑ D i*10i其中D i代表十进制数1、2、3、…、9、0。

上式可以转换为:∑ D i*10i=(((D n*10n+D n-1)*10+ D n-2)*10+…+ D1)*10+ D0由上式可归纳出十进制数转换为二进制数的方法:从二进制数的最高位D n开始做乘10加次位的操作。

依此类推,则可求出二进制数结果。

数码转换对应关系十六进制BCD码二进制机器码ASCII码七段码共阳共阴0 0000 0000 30H 40H 3FH1 0001 0001 31H 79H 06H2 0010 0010 32H 24H 5BH3 0011 0011 33H 30H 4FH4 0100 0100 34H 19H 66H5 0101 0101 35H 12H 6DH6 0110 0110 36H 02H 7DH7 0111 0111 37H 78H 07H8 1000 1000 38H 00H 7FH9 1001 1001 39H 18H 67HA 101 41H 08H 77HB 1011 42H 03H 7CHC 1100 43H 46H 39HD 1101 44H 21H 5EHE 1110 45H 06H 79HF 1111 46H 0EH 71H七、实验总结(体会)当汇编与算法结合在一起的时候,意味着难度又上升了一个层次。

这是一个常见的进制转换程序,除了要处理数制问题,题目中不超过5位的要求也要注意,因为会存在溢出问题。

三、源代码:MY_STACK SEGMENT PARA 'STACK'DB 100 DUP(?)MY_STACK ENDSMY_DATA SEGMENT PARA 'DATA'IO_9054base_address DB 4 DUP(0) ;PCI卡9054芯片I/O基地址暂存空间IO_base_address DB 4 DUP(0) ;PCI卡I/O基地址暂存空间pcicardnotfind DB 0DH,0AH,'pci card not find or address/interrupt error !!!',0DH,0AH,'$'GOOD DB 0DH,0AH,'The Program is Executing !',0DH,0AH,'$'P8254_T0 DW 0000HP8254_T1 DW 0001HP8254_T2 DW 0002HP8254_MODE DW 0003HP8255_A DW 0020HP8255_B DW 0021HP8255_C DW 0022HP8255_MODE DW 0023HMY_DATA ENDsMY_CODE SEGMENT PARA 'CODE'MY_PROC PROC FARASSUME CS:MY_CODE, DS:MY_DATA, SS:MY_STACKMAIN:.386 ;386模式编译MOV AX,MY_DATAMOV DS,AXMOV ES,AXMOV AX,MY_STACKMOV SS,AXCALL FINDPCI ;自动查找PCI卡资源及IO口基址MOV CX,word ptr IO_base_address; MOV CX,0E800H ;直接加入(E800:本机PCI卡IO口基址)ADD P8254_T0,CX ;PCI卡IO基址+偏移ADD P8254_T1,CXADD P8254_T2,CXADD P8254_MODE,CXADD P8255_A,CX ;PCI卡IO基址+偏移ADD P8255_B,CXADD P8255_C,CXADD P8255_MODE,CXMOV DX,P8254_MODE ;写入方式控制字MOV AL,37H ;计数器0,先读写低位,后读写高位,OUT DX,AL ;方式3,BCD码计数MOV AH, 4CHINT 21HA1: MOV DX,P8254_T0MOV AL,32H ;初值低8位OUT DX,ALMOV AL,00H ;初值高8位OUT DX,ALMY_PROC ENDp;*****************************************************************************; /*按任意键退出*/;*****************************************************************************;*****************************************************************************; /* 找卡子程序 */;*****************************************************************************;FUNCTION CODEIO_port_addre EQU 0CF8H ;32位配置地址端口IO_port_data EQU 0CFCH ;32位配置数据端口IO_PLX_ID EQU 200810B5H ;PCI卡设备及厂商IDBADR0 = 10H ;基地址寄存器0BADR1 = 14H ;基地址寄存器1BADR2 = 18H ;基地址寄存器2BADR3 = 1CH ;基地址寄存器3FINDPCI PROC NEAR ;查找PCI卡资源并显示PUSHADPUSHFDMOV EBX,080000000HFINDPCI_next:ADD EBX,100HCMP EBX,081000000HJNZ findpci_continueMOV DX,offset pcicardnotfind ;显示未找到PCI卡提示信息MOV AH,09HINT 21HMOV AH,4CHINT 21H ;退出findpci_continue:MOV DX,IO_port_addreMOV EAX,EBXOUT DX,EAX ;写地址口MOV DX,IO_port_dataIN EAX,DX ;读数据口CMP EAX,IO_PLX_IDJNZ findpci_next ;检查是否发现PCI卡MOV DX,IO_port_addreMOV EAX,EBXADD EAX,BADR1OUT DX,EAX ;写地址口MOV DX,IO_port_dataIN EAX,DX ;读数据口MOV dword ptr IO_9054base_address,EAXAND EAX,1JZ findPCI_next ;检查是否为i/o基址信息MOV EAX,dword ptr IO_9054base_addressAND EAX,0fffffffehMOV dword ptr IO_9054base_address,EAX ;去除i/o指示位并保存MOV DX,IO_port_addreMOV EAX,EBXADD EAX,BADR2OUT DX,EAX ;写地址口MOV DX,IO_port_dataIN EAX,DX ;读数据口MOV dword ptr IO_base_address,EAXAND EAX,1JZ findPCI_next ;检查是否为i/o基址信息MOV EAX,dword ptr IO_base_addressAND EAX,0fffffffehMOV dword ptr IO_base_address,EAX ;去除i/o指示位并保存MOV DX,offset good ;显示开始执行程序信息MOV AH,09HINT 21HPOPfdPOPadRETfindPCI ENDPMY_CODE ENDSEND MAIN实验四可编程并行接口8255实验一、实验内容(1)流水灯实验:利用8255的A口、B口循环点亮发光二极管。

相关主题