1、汇编实验报告 汇 编 实 验 报 告 姓 名: 周翔 学 院:数学与计算机学院 班 级: 大类1003班 学 号: 100511310 指导教师: 黄川 2012 年 6 月 8 日实验一:汇编语言编程环境入门(2学时)一、 实验目的与要求通过书上82页示例3.1,熟悉Windows环境下,X86汇编语言的编译和调试过程。二、 实验环境1 Windows XP操作系统。2 MASM集成环境,或其它编程工具。三、实验内容1. 学习如何查找程序的编译错误并改正2. 运行程序,观察结果3. 学习如何调试程序。四、实验步骤1输入书上82页示例3.1(有机器同学最好预先输入);2编译程序,定位和改正编译
2、错误。3运行程序,观察结果是否和预期复合。4调试程序,特别需要熟悉以下调试命令:a) t:单步命令b) g:运行至某一指令c) q:结束调试d) p:运行一条语句e) d:查看内存单元f) r:查看寄存器单元g) u:反汇编 具体代码如下: DATA SEGMENTX DW 0E98AH,80AFH,0FD32H,0F68FHY DW 9FD0H,70BAH,3D84H,89FEHZ DW 5 DUP(?)DATA ENDSSTACK SEGMENT PARA STACKSTACK DB 100H DUP(?)STACK ENDSCODE SEGMENT CODE ASSUME CS:CODE
3、,DS:DATA,SS:STACKMAIN: MOV AX,DATA MOV DS,AX MOV CX,4 MOV SI,0 CLCGOON: MOV AX,XSI ADC AX,YSI MOV ZSI,AX INC SI INC SI LOOP GOON RCL AX,1 AND AX,1 MOV ZSI,AX MOV AX,4C00H INT 21HCODE ENDS END MAIN5、实验结果实验二:输入输出程序设计(2学时)一、 实验目的与要求通过上机实验,掌握汇编语言下通过DOS系统调用实现键盘输入和屏幕输出程序的设计,为以后其它程序打下基础。要求输入一个任意字符串,可以在屏幕上显
4、示出。二、 实验环境1) Windows XP操作系统。2) MASM集成环境,或其它编程工具。三、实验内容1. 了解DOS系统调用初步用法和分类,熟悉对应系统调用的具体参数设置;2. 通过10号功能调用,把键盘上输入的字符串保存在内存单元中3. 调整输入的字符串格式,通过9号功能调用,在屏幕上输出对应字符串四、实验步骤1.按照格式定义对应输入数据缓存,存放输入的字符串。2.设置参数,调用10号系统调用后,仔细观察输入数据缓存中内存单元各字节的变化。3.调整格式,在系统实际输入字符串后面附加相应的字符(0DH, 0AH,$)。4.设置参数,调用9号系统调用后,观察输出。具体代码如下: .MOD
5、EL SMALLDATA SEGMENTMESG1 DB PLEASE INPUT ORIGINAL DATA,CR,LF,$MESG2 DB INPUT CORRECT? Y/N,CR,LF,$MESG3 DB INPUT ERROR AGAIN!,CR,LF,$BUFFER DB 200 DB ? DB 200 DUP($)CR EQU 0DHLF EQU 0AHDATA ENDS STACK SEGMENT PARA STACKSTACK DB 100H DUP(?) STACK ENDSCODE SEGMENT CODE ASSUME CS:CODE,DS:DATA,SS:STACKM
6、AIN: MOV AX,DATA MOV DS,AXAGAIN: MOV DX,OFFSET MESG1 MOV AH,9 INT 21H LEA DX,BUFFER MOV AH,10 INT 21H LEA DX,BUFFER+2 MOV AH,9 INT 21H LEA DX,MESG2 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,Y JZ F LEA DX,MESG3 MOV AH,9 INT 21H JMP SHORT AGAIN: LEA DI,BUFFER+2 MOV CL,BUFFER+1 MOV CH,0PRINT: MOV DL,DI
7、MOV AH,5 INT 21H INC DI LOOP PRINTCODE ENDS END MAIN五、实验结果 实验三:字符串操作(4学时)一、 实验目的与要求通过上机实验,开始一个比较复杂的程序设计:把任意输入字符串中“A”全部删除。如果输入字符串没有“A”,显示“NOT FOUND ”,如果有“A”,分两行显示删除前和删除后的字符串。二、 实验环境1) Windows XP操作系统。2) MASM集成环境,或其它编程工具。三、实验内容1. 通过字符串查找指令,找到对应字符并删除2. 通过循环指令,反复查找字符,直至没有3. 对应字符并删除实际上是依次把后面字符前移覆盖当前字符。四、实
8、验步骤1.画出流程图,检查初步错误2.编辑并输入程序。3.编译程序,改正编译错误。4.调试程序,改正逻辑错误具体代码如下:Code Segment Assume CS:Code,DS:Code; ; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addr lea dx,Str_Addr mov ah,9 int 21h EndM; ; 功能:显示、输出一个回车、换行Output_CTLF proc Near push
9、ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax retOutput_CTLF Endp ; Prompt_Str1 db Please input a string: $Prompt_Str2 db 7,13,10,13,10,NOT FOUND,13,10,13,10,$Prompt_Str3 db 7,13,10,13,10,Before delete: $Prompt_Str4 db 7,13,10,Deleted: $Press_Key db 7,13,10,13,10,The comp
10、lated. Press any key to exit.$ Start: push cs pop ds push cs pop es ;使数据段、附加段与代码段同段Input_Str: Output Prompt_Str1 ;提示输入字符串 lea dx,Buffer ;字符串输入缓冲区地址 mov ah,0ah int 21h lea di,Buffer2 ;输入的字符串地址 xor ch,ch mov cl,di-1 ;实际输入的字符串长度 jcxz Exit_Proc ;若直接回车,没有输入任何字符,则结束程序 mov bx,cx inc cx mov al,A cld repnz s
11、casb ;查找字符串中是否有A jcxz Not_Found Output Prompt_Str3 ;提示显示删除A前的字符串 lea di,Buffer2 ;输入的字符串地址 mov BYTE ptr bxdi,$ ;写字符串结束标志符 Output Buffer2 ;显示删除A前的字符串 Output Prompt_Str4 ;提示显示删除A后的字符串 lea di,Buffer2 ;输入的字符串地址 mov si,di mov cx,bx inc cxDelete_A: lodsb cmp al,A jz $+3 stosb loop Delete_A Output Buffer2 ;
12、显示删除A后的字符串 call Output_CTLF ;输出一个回车、换行 call Output_CTLF jmp Input_Str ;重新输入Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序 mov ah,1 int 21h mov ah,4ch ;结束程序 int 21hNot_Found: Output Prompt_Str2 ;提示字符串中没有A jmp Input_Str ;重新输入Buffer db 255 ;字符串输入缓冲区Code ENDS END Start ;编译到此结束5、实验结果 实验四:数值排序操作(4学时)一 实验目的与
13、要求通过上机实验,对数值进行冒泡法排序。达到熟练掌握多重循环和子程序的设计。二 实验环境1) Windows XP操作系统。2) MASM集成环境,或其它编程工具。三 实验内容与步骤1. 先不使用输入功能,直接在系统中定义多个09之间的数值,进行冒泡法排序。2. 在上一步正确完成情况下,加入键盘输入功能,输入多个09之间的数值,使用逗号或者空格分割。得到输入字符串后,设计一个子程序,把输入字符串转换为多个数值。3. 在上一步正确完成情况下,输入任意10000以下数值,这时需要完成字符串“1234”到数值1234之间的转换。具体代码如下:DATA SEGMENT ;data 就是声明变量DAT
14、DB 20,-10,80,-5,-70,-9,95,-15,0,40COUNT DB 10,10 dat2 db 10 dup(0) ; 声明一个数组DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATA MOV DS,AX MOV ES,AX MOV BL,1LP1: CMP BL,0 JE LP4 ;相等质指令 XOR BL,BL ;将bl清零 MOV CL,COUNT DEC CL ;减一 PUSH CX ; LEA DI,DAT ; LP2:MOV AL,DI CMP AL,DI+1 ; compare
15、 比较指令 JLE LP3 ;小于等于就跳转指令 XCHG DI+1,AL ;交换指令 MOV DI,AL MOV BL,1 LP3:INC DI LOOP LP2 ;将cx中的值减1 ,然后判断ecx 是否等于0,不为0 则跳转到目的地址 POP CX MOV COUNT,CL JMP LP1 LP4:MOV CL,10 LEA DI,DAT SC:MOV AX,0 MOV BH,2 MOV AL,DI CMP AL,0 JGE NEXT ; 大于等于指令 NEG AL ;取反指令 PUSH AX MOV AH,02H MOV DL,- INT 21H ; dos 中断调用 POP AX NEXT:XOR AH,AH DIV COUNT+1 MOV DH,AH ADD AL,30H MOV DL,AL MOV AH,02H INT 21H MOV AL,DH XOR AH,AH ADD AX,3030H MOV DL,AL OUTP: MOV AH,2 INT 21H DEC BH JZ XT ;判断是否为0,等于0 的时候转移 MOV DL,BL JMP OUTP ;无条件跳转 XT: DEC CL JZ DONE INC DI JMP SCDONE: MOV AH,4CH INT 21HCODE ENDSEND START实验结果: