汇编实验报告

合集下载

汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令‎练习的实验报告总结‎汇编语言指令及伪指令‎练习的实验报告总结‎‎篇一:汇‎编语言实验报告福建‎农林大学金山学院课‎程名称:姓‎名:系:‎专业:‎年级:学‎号:指导教师‎:职称:‎ (程序设计类‎课程) 实验报告汇‎编语言 201X~2‎01X学年第二学期‎实验项目列表福建农‎林大学金山学院实验报‎告系:专‎业:年级:‎姓名:‎学号:‎实验课程:‎汇编语言实验室号:‎_ _1#6‎05 实验设备号:‎ I3 实验时‎间:201‎X.4.25‎指导教师签字:‎成绩:‎实验一汇编程序的‎汇编及运行1‎.实验目的和要求‎ (1)熟悉汇编程‎序的汇编、连接、执行‎过程;(2)‎生成LST文件,查看‎L ST文件;‎(3)生成BJ文件,‎修改语法错误;‎(4)生成EXE文‎件;(5)执‎行程序。

2.‎实验环境 IBM—P‎C机及其兼容机;实‎验的软件环境是:‎操作系统:‎ DS2.‎0以上;调试程序:‎ DEBUG.C‎M;文本编程程序:‎ EDIT.EX‎E、PS.EXE;宏‎汇编程序:M‎A SM.EXE(或A‎S M .EXE);连‎接装配程序:‎L INK .EXE;‎交叉引用程序:‎CREF.EXE(‎可有可无)。

‎3.实验内容及实验数‎据记录(1)‎将数据段输入,取名‎ 1.txt,保存‎在MASM文件夹下。

‎生成LST文件,(不‎必连接、运行)用ED‎I T查看1.L‎S T文件。

试回答:‎ DA1,DA2‎的偏移量分别是多少?‎C UNT的值为多少?‎DATA SEGM‎E NT RG 20H‎NUM1=8 NU‎M2=NUM1+10‎H DA1 DB ‘‎I BM PC’ CU‎N T EQU $-D‎A1 DATA EN‎D S DA2 DB ‎0AH, 0DH E‎N D(2)输‎入有错误的文件,修改‎错误语句。

(MASM‎没有出现错误即可。

不‎必连接、运行。

)‎D ATA SEGME‎N T VAR1 DB‎0, 25, DH‎,300 VAR2‎DB 12H, A‎4H, 6BH VA‎R3 DB ’ABC‎D EF’ VAR4 ‎D 1H, 5678‎H VAR5 D 1‎0H DUP(?) ‎D ATA ENDS ‎C DE SEGMEN‎T ASSUME C‎S: CDE, DE‎: DATA MV ‎D S, AX LEA‎SI, VAR5 ‎M V BX, FFS‎E T VAR2 MV‎[SI], 0AB‎H MV AX, V‎A R1+2 MV [‎B X], [SI] ‎M V VAR5+4,‎VAR4 MV A‎H, 4CH INT‎21H ENDS ‎E ND START ‎B EING MV A‎X, DATA CD‎E(3)输入‎正确的程序,汇编、连‎接、运行 STACK‎S SEGMENT ‎S TACK D 12‎8DUP(?) E‎N DS SEGMEN‎T ENDS SEG‎M ENT ASSUM‎E CS: CDES‎,DS: DATA‎S STACKS D‎A TAS DATAS‎CDES STRI‎N G DB ‘ELC‎M E!’, 13, ‎10, ‘$’ ST‎A RT: M‎V AX, DATA‎S MV DS, A‎X LEA DX, ‎S TRING MV ‎A H, 9 INT ‎21H MV AH,‎4CH INT 2‎1H CDES EN‎D S END STA‎R T4.算法‎描述及实验步骤 1)‎首先,用记事本输入‎各段程序,并储存成源‎程序,保存在MASM‎目录下。

汇编实验报告七

汇编实验报告七

计算机组成与汇编语言实验报告
通过结果说明程序运行结果正确。

2.调试程序2的运行结果如下。

说明程序实现的功能是查找0第一次出现的位置。

通过结果说明程序运行结果正确。

1.编写程序1运行结果如下。

4.编写程序2运行结果如下。

5.编写程序3运行结果如下。

实验情况与体会:通过本次上机实验,学习了数值转换。

实验过程中,遇到很多问题,比如程序一的编写,基本上都是学习书本以及依靠书本多做题才编出来的,仅有的几次上机实验,要抓紧时间学习和交流,时间挺少的。

在今后的学习和生活中,我们都需要相互学习、相互交流,共同进步。

学习是一个循序渐进的过程。

通过这次实验,使我了解到运行调试程序的不易,今后一定更加努力,把程序做到最好!对于不足之处,会积极改正。

汇编语言实验7实验报告

汇编语言实验7实验报告

汇编语言实验7实验报告一、实验目的本次实验旨在通过汇编语言编写程序,实现对字符串的操作和输出。

二、实验内容1. 编写一个汇编程序,要求从键盘输入一个字符串,并将其逆序输出到屏幕上;2. 编写一个汇编程序,要求从键盘输入两个字符串,并将它们拼接起来后输出到屏幕上。

三、实验过程1. 字符串逆序输出程序首先,需要从键盘输入一个字符串。

为了方便起见,我们可以先规定字符串的最大长度为100。

接着,我们需要定义两个变量:```buffer db 100 ; 用于存储输入的字符串length dw ? ; 存储输入的字符串长度```其中,db代表定义字节型变量,dw代表定义双字节型变量。

然后,我们需要使用INT 21H中断来读取用户输入的字符串。

具体而言,我们可以使用下面这段代码:```mov ah, 0Ah ; 设置INT 21H功能号为0Ahmov dx, offset buffer ; 将buffer的地址传给DX寄存器int 21h ; 调用INT 21H中断```该代码会将用户输入的字符串存储在buffer中,并且将其长度存储在length变量中。

接着,我们需要将该字符串逆序输出到屏幕上。

为了实现这个功能,我们可以使用栈来存储字符串中的每个字符,并逐个弹出来输出。

具体而言,我们可以使用下面这段代码:```mov si, offset buffer + 1 ; 将si寄存器指向字符串的第一个字符mov cx, length ; 将cx寄存器设置为字符串长度dec cx ; 字符串长度需要减1reverse:push byte ptr [si] ; 将当前字符压入栈中inc si ; 指向下一个字符loop reverse ; 循环直到所有字符都被压入栈中mov ah, 02h ; 设置INT 21H功能号为02h,表示输出一个字符print:pop dx ; 弹出栈顶元素int 21h ; 输出该字符loop print ; 循环直到所有字符都被弹出并输出完毕```2. 字符串拼接程序首先,需要从键盘输入两个字符串。

汇编试验报告

汇编试验报告

院系:计算机科学学院专业:计算机科学与技术年级: 07级课程名称:汇编语言学号:姓名:指导教师:2008年 12 月 15 日程序源代码:一:大小写字母字符转换; Assembly language program -- converting between uppercase and lowercase ; Author: senhe zhang; Date: revised 10/2008.386.MODEL FLATExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORDINCLUDE io.h ; header file for input/outputcr EQU 0dh ; carriage return characterLf EQU 0ah ; line feed.STACK 4096 ; reserve 4096-byte stack.DATA ; reserve storage for dataprompt byte cr,Lf,"enter a character: ",0string byte 3 DUP (?)labell byte "through converting the latter letter is: ",0value byte 3 DUP (?)byte cr,Lf,0errorprompt byte "It doesn't belong to letter characters,please input again:",0 .CODE ; start of main program code_start:whilepos: output promptinput string, 3 ;read ASCII charactersoutput labelloutput valuejmp quitmov al,string ;Placed in the alcmp al,cr ;Enter compared with theje quit ;If equal to exitcmp al,'a' ;And 'a' comparisonjl if_1 ;Implementation if-1 if lesscmp al, 'z'jg if_1 ; Implementation if-1 if biggersub al,20h ;al-20hmov value,alif_1: cmp al,'A'jl if_2cmp al,'Z'jg if_2add al, 20hmov value, aloutput labelloutput valuejmp quitif_2: output errorprompt ;Errorjmp whileposquit: INVOKE ExitProcess, 0 ; exit with return code 0PUBLIC _start ; make entry point publicEND ; end of source code二:九九乘法表; assembly language program -- adds two numbers; Author: senhe zhang; Date: revised 10/2008.386.MODEL FLATExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD INCLUDE io.h ; header file for input/outputcr EQU 0dh ; carriage return characterLf EQU 0ah ; line feedspace EQU 20h.STACK 4096 ; reserve 4096-byte stack .DATA ; reserve storage for data;value word ?currentrow dword ?currentque dword ?mulx byte 11 DUP (?)byte 0labell2 byte cr,Lf,0labell byte '*',0muly byte 11 DUP (?),0labell3 byte '=',0value byte 11 DUP (?)byte space,0.CODE ; start of main program code _start:mov currentrow, 1mov currentque, 1whilepos: mov eax, currentrowcurrentquedtoa value, eaxmov eax, currentrowdtoa mulx, eaxmov eax, currentquedtoa muly, eaxoutput mulx+10output labelloutput muly+10output labell3output value+9mov ecx, currentquecmp currentrow, ecxje while_2while_1: inc currentquejmp whileposwhile_2: output labell2inc currentrowmov ecx, 9cmp currentrow, ecxjg quitmov edx, currentrowmov currentque, 1cmp currentque, edxjle whileposquit: INVOKE ExitProcess, 0 ; exit with return code 0 PUBLIC _start ; make entry point public END ; end of source code 三:求给定整数的所有素因子; program to get all the prime numbers of a integer; Author: senhe zhang.MODEL FLATExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD INCLUDE io.h ; header file for input/outputcr EQU 0dh ; carriage return characterLf EQU 0ah ; line feedMAX EQU 100 ; the max number.STACK 4096 ; reserve 4096-byte stack.DATA ; reserve storage for datanumber DWORD ?index DWORD ?j DWORD ?flag1 BYTE ?flag2 BYTE ?prompt0 BYTE "Please input an integer:",0prompt1 BYTE cr,lf,cr,lf,"The result is: ",0 count WORD ?value BYTE 11 DUP(?)BYTE 0sign BYTE ?BYTE 0.CODE ; start of main program codePROCA PROC NEAR32 ; To determine prime numbers mov flag1,0 ;0 to preserve the flag1mov index,1 ;1 to save the indexFORA:inc index ;dec Automatic increasemov eax,index ;Index will be saved to go in eaxcmp eax,ecx ;Eax allow comparison with the ecxjnl ENDA ;If more than that to jump ENDAmov eax,ecxmov ebx,indexCdq ;The expansion of dividenddiv ebxcmp edx,0jne FORA ;If they are not, to jump FORAjmp ENDAA ;Jump to ENDAAENDA: mov flag1,1ENDAA:retPROCA ENDP ;The end of the subroutinePROCB PROC NEAR32mov flag2,0MORE:cmp number,1je ENDBAmov eax,numbercdqdiv indexcmp edx,0jne ENDBBmov number,eaxinc countcmp count,1je PRINTNmov sign,'*'output signPRINTN:dtoa value,indexcall PROCCjmp MOREENDBA:mov flag2,1ENDBB:retPROCB ENDPPROCC PROC NEAR32lea ebx,valueWHILEA: mov al,byte ptr [ebx]inc ebxcmp al,0je ENDCcmp al,20hje WHILEAmov sign,aloutput signjmp WHILEAENDC: retPROCC ENDP_start:output prompt0 ;The main function to startinput value,11output prompt1mov sign,'='output valueoutput signatod valuemov number,eaxmov count,0mov j,1NF1:inc jmov ecx,jcall PROCAcmp flag1,1jne NF1call PROCBcmp flag2,1jne NF1ENDFILE:INVOKE ExitProcess, 0 ; exit with return code 0PUBLIC _start ; make entry point public END四:字符串中指定字符的替换; This program is to get the letter before and after the one you put in; Author: senhe zhang.386.MODEL FLATExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORDINCLUDE io.h ; header file for input/outputcr EQU 0dh ; carriage return characterLf EQU 0ah ; line feed.STACK 4096 ; reserve 4096-byte stack.DATA ; reserve storage for dataprompt1 BYTE "This programe will exchange A to a"BYTE "Please input string: ",0prompt2 BYTE "The result is: "string BYTE 50 DUP(?).CODE ; start of main program code_start:output prompt1 ;A replacement is prompt1 output and a string of liesinput string,50 ; read ASCII characterslea ebx,string ;find length of stringa: cmp byte ptr [ebx],0dh ;String of characters in each carriage return character and compare je end1 ;Is equal to the outputcmp byte ptr [ebx],41h ;Each string of characters with the 'A' character comparisonje change ;Is equal to the conversionb: inc ebx ;Compared to the next characterjmp achange: mov byte ptr [ebx],61h ;Converted to 'a'jmp bend1:output prompt2 ;OutputINVOKE ExitProcess, 0 ; exit with return code 0PUBLIC _start ; make entry point publicEND ;end of source code五:使用位操作指令实现双字类型数的高低字转换; Author: senhe zhang; Date: revised 10/2008.386.MODEL FLATExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORDINCLUDE io.hcr EQU 0dhLf EQU 0ah.STACK 4096.DATAprompt BYTE "Input a number: ",0number BYTE 20 dup (?)result BYTE cr,Lf,"The 2's complement representation is: "hexout BYTE 8 DUP(?),cr,Lf,0prompt2 BYTE "After the shift ",cr,lf,0.CODEHex PROC NEAR32 ;Hex sub: output of a 16-digit hexadecimal numberpush eaxlea ebx,hexout+7mov ecx,8mov esi,eaxforcount: mov edx,eaxand edx,0000000fh ;28 figures on the left side of Clear, and the remaining unchangedcmp edx,9jnle elseLetteror edx,30h ;Converted to ASCII codejmp endifDigitelseLetter:add edx,'A'-10 ;Converted to lettersendifDigit:mov BYTE PTR [ebx],dldec ebxshr eax,4 ;Right Shiftloop forcountoutput resultpop eaxretHex ENDP_start:output promptinput number,16 ;A digital inputatod numbercall Hex ;Subroutine calls Hexrol eax,16 ;Circle left shiftoutput prompt2 ;Output converted hexadecimal numbercall HexINVOKE ExitProcess, 0PUBLIC _startEND。

汇编实验一实验报告

汇编实验一实验报告

汇编语言程序设计实验报告课程名称汇编语言程序设计班级姓名学号指导教师汇编语言程序设计实验一DEBUG 程序使用技巧1.寄存器和内存开始Debug 程序。

输入“Q ” 退出程序。

再次启动Debug。

输入“r ”来显示CPU的当前状态和寄存器中的当前内容。

输入“r AX ”和“1234”,AX 寄存器中的内容变为1234。

输入“r DS ”和“2000”,DS 寄存器中的内容变为2000。

输入“d DS:1000 ”来显示数据段中80H 字节数据,把数据抄在这里:输入“f DS:1000 1100 77 ”再显示一次这80H 字节。

判断这条指令的作用是什么?答:从DS:1000地址七,将1100H字节的内容赋值为77H再输入“d 2000:1000 ”来显示数据段中80H 字节数据。

观察与前面的数据有无不同。

输入“d 1900:0100 ”和“d 1ff0:0100 ”来显示两个存储段中的内容。

比较其中2000:0000 段中的数据。

相同段落中的数据相同么?根据你的观察,得出结论,是否程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。

答:相同段落中的数据相同, 程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。

2.输入机器码,使用单步和断点退出Debug,再重新启动Debug。

输入“r ”观察CPU 的状态,下一条指令是什么?答:下一条指令是ADD [BX+SI],AL使用两种方式输入一段程序,第一种方式:直接输入机器码。

输入“u ”来显示程序段中的指令序列。

然后输入“d CS:100 ” 来显示代码段中的数据。

观察显示内容。

“u CS:100 106 ”做反汇编,就是显示出汇编语句。

将这几句汇编语句记录下来:使用输入“r ”观察CPU 的状态,使用“t ”来跟踪程序,直至最后一条指令执行完毕。

注意,跟踪程序前,要让IP 寄存器中的值是100H。

一直监视AX 和IP 寄存器的内容变化,尤其是标志位的变化。

汇编语言实验报告一.doc

汇编语言实验报告一.doc

汇编语言实验报告(实验一)一.实验目的1.掌握汇编语言程序的上机步骤;(1)用编辑程序(如EDIT、记事本等)编辑汇编语言源程序(建立.ASM文件)。

(2)用MASM程序产生OBJ文件。

(3)用LIINK程序产生EXE文件。

(4)程序的运行(用DEBUG或在DOS下直接运行)。

2.掌握DEBUG的使用方法。

二.程序说明1.在数据段DATA中有两个数据X和Y,假设X=1122H,Y=3344H,编程求两个字的和,结果存放到Z单元中。

2.从SOURCE_BUFFER单元开始存放了20个字母A,编程将这个20个字母A 的字符串传送到DEST_BUFFER开始的单元中。

3.从SOURCE_BUFFER单元开始存放了20个字母A,编程将这个20个字母A 的字符串向下移10个单元。

三.设计思想1、将1122H和3344H分别存放在双字x,y中,定义双字Z,x,y带进位相加放入Z中。

2、定义数据段source_buffer,把数据段地址放入ds寄存器,定义附加段extra_buffer,把附加段地址放入es寄存器,移动整个字符串。

3、定义数据段附加段,先移高位,这样要移20次。

四.程序代码1、DATA SEGMENTX DW 1122HY DW 3344HZ DW ?DATA ENDS ;数据段定义结束STACK SEGMENT ;堆栈段定义开始DW 40 DUP(0)STACK ENDS ;堆栈段定义结束CODE SEGMENT ;代码段定义结束ASSUME CS:CODE,SS:STACK,DS:DATASTART: MOV AX,DATAMOV DS,AX ;设置数据段的开始地址MOV DX,XADC DX,YMOV Z,DXMOV AH,4CH ;返回DOCINT 21HCODE ENDSEND START2、DATA SEGMENT ;定义数据段SOURCE_BUFFER DB 20 DUP(‘a’) ;定义个小写a DATA ENDSEXTRA SEGMENT ;定义附加段DEST_BUFFER DB 20 DUP(?)EXTRA ENDSCODE SEGMENT ;定义代码段MAIN PROC FARASSUME CS:CODE,DS:DATA,ES:EXTRASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV AX,EXTRAMOV ES,AXLEA SI,SOURCE_BUFFERLEA DI,DEST_BUFFERCLDMOV CX,20REP MOVSB ;移动整个串RET ;返回到DOSMAIN ENDPCODE ENDSEND START3、DATA SEGMENT ;定义数据段SOURCE_BUFFER DB 20 DUP(‘a’) ;定义个小写a DATA ENDSEXTRA SEGMENT ;定义附加段DEST_BUFFER DB 20 DUP(?)EXTRA ENDSCODE SEGMENT ;定义代码段MAIN PROC FARASSUME CS:CODE,DS:DATA,ES:EXTRASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS, AXMOV AX, EXTRAMOV ES, AXLEA SI, SOURCE_BUFFERLEA DI,DEST_BUFFERCLDMOV CX,20REP MOVSB ;移动整个串RET ;返回到DOSMAIN ENDPCODE ENDSEND START五.结果分析并回答:1.设计的程序包含了几个段第1段包含数据段、堆栈段、代码段第2、3个包含数据、附加段、代码段2.你的代码经过编译和连接之后,总共占用多少个字节第1、2个占30个字节,第3个占32个字节3.调用DEBUG进行反汇编,查看程序的第一条指令的地址码是多少?最后一条指令的地址码是多少?程序1第一条指令:1454:000 BB4B14 MOV AX,144B最后一条指令:1451:001E 807F0400 CMP BYTE PTR [BX+04],00程序2第一条指令:1450:0000 1E PUSH DS最后一条指令:1450:001E 8B0? MOV AX,[BX]程序3第一条指令:144D:0000 1E PUSH DS最后一条指令:144D:0020 8B5702 MOV DX,[DX+02]。

汇编语言实验报告_6

汇编语言实验报告_6

青岛理工大学课程实验报告
课程名称汇编语言程序设计班级实验日期
2013.11.3
姓名学号实验成绩
实验
名称
子程序
实验目的及要求1.掌握子程序设计相关指令和伪指令的使用方法
2.掌握子程序设计方法, 特别是参数传递方法
3.掌握主程序和子程序之间的调用关系和调用方法
4.熟悉循环和子程序结合应用解答问题的思路
实验环境1.命令行方式
2.MASM.EXE LINK.EXE DEBUG.EXE
实验内容1.设DATA1开始的内存单元中, 存放着一串带符号字数据, 要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。

然后在显示器输出排好序的数据, 中间用’,’隔开。

2.输出数据使用子程序方式。

算法描述及实验步骤步骤:
(1)设置数据段地址
(2)设置堆栈段地址
(3)设置堆栈指针
(4)调用9号功能, 输出一个提示性字符串。

(5)循环进入子程序, 输出原始数据。

(6)在子程序内循环输出每一位的十进制数字。

(7)主程序进行内外循环, 进行冒泡排序。

(8)再一次调用子程序输出排序后的结果。

调试过程及实验结果调试过程:
(2)(1)在输出时, 调用DOS 9号功能, 并不是只要语句MOV AH,09H
(3)它是存在入口条件的, 入口条件:DS:DX=输出字符缓冲区首地址。

所以前面必须加上MOV DX,OFFSET NOTE1。

(4)汇编语言是不会再输出汉字的。

(5)子程序结束时一定要有RET
(6)冒泡排序也遇到一些困难。

调试结果:。

汇编语言实验报告

汇编语言实验报告

实验报告一:汇编语言实验基础一.实验目的:1. 熟悉汇编语言程序的开发过程以及汇编语言常用软件的使用方法2. 掌握DEBUG常用命令的使用方法二、实验内容:1.DEBUG 命令使用2.8088常用指令练习三、实验步骤:(一)DEBUG 命令使用:1、打 DEBUG 进入 DEBUG 控制,显示提示符'_ '。

2、用命令 F 100 10F 'A' 将'A'的ASCII码填入内存。

3、用命令 D 100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。

4、用命令 F 110 11F 41 重复上二项实验,观察结果并比较。

5、用命令 E 100 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,347FH7、用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF 和AF的内容。

8、用R命令将AX,BX内容改写为1050H及23A8H。

(二)8088常用指令练习1、传送指令1)用A命令在内存100H处键入下列内容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX2)用U命令检查键入的程序,特别注意左边的机器码。

3)用T命令逐条运行这些指令,注意有关寄存器及IP的变化情况。

并注意标志位有无变化。

2、加减法指令:1)用A命令在内存100H处键入下列内容:MOV AH,34MOV AL,22ADD AL,AHSUB AL,78MOV CX,1284MOV DX,5678ADD CX,DXSUB CX,AXSUB CX,CX2)用U命令检查键入的程序及对应的机器码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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口循环点亮发光二极管。

相关文档
最新文档