




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计报告班级: 学号:姓名: 目录汇编语言程序设计报告1汇编语言程序设计实验报告4实验一4实验内容4实验目的4实验代码4实验代码整体思路51.检测所编程序的正确性5实验二71.实验内容7结果测试:11Debug:11实验三13实验要求:13实验代码:13实验代码思路:15检测结果,验证正确性15结论17实验四17实验内容17流程图18实验代码:18Windbg21实验结果测试:23输入数据进行测试24实验五24实验内容:多模块程序设计及多语言混合编程。24要求:24实验代码:24实验代码分析说明:26实验数据检测:判断是否成功完成实验任务27实验心得28 汇编语言程序设计实验报告实
2、验一实验内容:熟悉DOS编程环境:编写一个DOS环境的汇编语言程序,要求 从键盘输入一串字符,去除连续重复的字符后再显示,如:输入一串为“aaawwweerrty”的字符串,输出结果应为awerty实验目的:通过上机实践加深对16位环境下编程的了解 学会使用debuge调试程序实验代码: ASSUME CS:CODE, DS:DATA DATA SEGMENT BUFFER DB 60, ?, 60 DUP(?) PRINT DB 'TO INPUT: ' CRLF DB 0DH, 0AH, '$'DATA ENDS CODE SEGMENT MAIN: MOV
3、 AX, DATA MOV DS, AX MOV AH, 9 LEA DX, PRINT INT 21H MOV AH, 0AH LEA DX, BUFFER INT 21H MOV AH, 9 LEA DX, CRLF INT 21H LEA SI, BUFFER + 1LP1: INC SILP2: MOV AL, SI CMP AL, 13 JZ DISP CMP AL, SI + 1 JNZ LP1 MOV DI, SILP3: INC DI MOV AL, DI + 1 MOV DI, AL CMP AL, 13 JZ LP2 JMP LP3 DISP: MOV AL, '$
4、' MOV SI, AL MOV AH, 9 LEA DX, BUFFER + 2 INT 21HEXIT: MOV AX, 4C00H INT 21HCODE ENDSEND MAIN 实验代码整体思路:定义一个大小为60的缓冲区,用来存储从键盘输入的字符串; 调用中断调用,将字符串输入到缓冲区当中; 使用取地址符号Lea取得输入字符串的首地址然后后一位与前一位相比,若相同则将其舍弃,否者将其记录在缓冲区中,循环结束之后在其后补上字符“$”即可一次输出,无单个输出1. 检测所编程序的正确性:编译所建的1.asm文件:按下回车键之后开始编译,如下图所示,编译结束表明没有错误不存在警告对
5、编译成功之后的文件进行链接,以生成能运行的.exe文件,如下图1-1所示:1-1 链接之后发现链接(Link)之后也是成功的,接下来就进行测试的最后一步,即运行1.exe文件,输入一串字符串,看能否达到预期的目的,如达到,则成功,否者重新编译。可见,与预期目的一致,达到了目的。6.该实验使用的知识点:1.中断调用,以及使用功能号实现输入输出2.使用循环,无条件转移指令(JMP)等实验二1. 实验内容:(1). 程序中自定义缓冲区AREA1,其中存放200个有序的无符号字型数据(至少有3个重复数据),编程序将其排序后送到自AREA2开始的单元中,要求传送后的数据从大到小排序,并实现查找功能,判定
6、需要查找的数据在AREA1与AREA2中分别对应的位置,并通过查看内存验证结果的正确性。把有序的无符号字型数据换成带符号字型数据,实现以上功能。(2). 熟悉DEBUG调试环境。使用DEBUG调试程序察看机器码,并单步执行,观察每一条指令的执行结果、 寄存器的内容、内存变量和堆栈数据的变化情况。2. 实验代码如下: assume ds:data, cs:code, ss:stackdata segment area1 dw 2,2,2,10,15,255,0,67,143 count dw $-area1 index dw 0 area2 dw 200 dup(0) flag db 200 d
7、up(0) tips1 db 'Please input the number you want to find:','$' tips2 db 'Not Found!','$' crlf db 0dh,0ah,'$' output db 5 dup('$')data endsstack segment stack dw 32 dup(?)stack endscode segmentfindmost proc ;find the greatest number in area1, put it in
8、AX push bx push cx push dx push bp lea bx,area1 mov dx,bx add bx,2lo: cmp dx,bx jge smaller ;jae smaller ;无符号时使用此指令,并将上条指令注释掉 and flagbx,1 jnz smaller mov dx,bx ;将当前最大值储存 mov bp,bxsmaller: add bx,2 cmp bx,count ;检查是否为最后一个元素 ;记录最大值于ax jl notfinish mov ax,dx mov WORD PTR ds:flagbp,1 pop bp pop dx pop
9、cx pop bx retnotfinish: jmp lofindmost endpwriteGreatest2area2 proc ;按照要求将数据写入area2 push ax push bx lea bx,area2find_another: call findmost mov bx,ax add bx,2 mov index,bx lea ax,area2 sub index,ax lea ax,count cmp index,ax jnz find_another pop bx pop ax retwriteGreatest2area2 endpconvertDigital2Asc
10、ii proc push bx push dx mov dx,ax xor bx,bx mov cl,100 div cl add ax,48 mov outputbx,al inc bx mov ax,dx mov cl,10 div cl add ah,48 add al,48 mov outputbx,al inc bx mov outputbx,ah lea dx,output mov ah,9 int 21h lea dx,crlf int 21h mov ax,dx pop dx pop bx retconvertDigital2Ascii endpfindTheValue pro
11、c ;在两个区域中分别查找数字ax的位置 push ax push bx push si push cx push dx mov cx,count mov bx,-2equal1: add bx,2 cmp ax,area1bx jnz equal1 push ax mov ax,bx sar ax,1 inc ax call convertDigital2Ascii pop ax mov bx,-2equal2: add bx,2 cmp ax,area2bx jnz equal2 push ax mov ax,bx sar ax,1 inc ax call convertDigital2A
12、scii pop ax pop dx pop cx pop si pop bx pop ax retfindTheValue endpstart: mov ax,data mov ds,ax call writeGreatest2area2 mov ax,255 call findTheValue mov ax,4c00h int 21hcode endsend start结果测试:对实验二进行编译链接:运行程序,输出实验结果:Debug:显示寄存器内容,如下图所示:用U命令反汇编可执行代码,如下图所示:用g命令设置断点到CS:00D8处,如下图所示:用t命令跟踪执行程序,如下图所示逐条跟踪三
13、次的结果:用q命令退出:实验三实验要求:熟悉Windows编程环境 编写一个Windows界面汇编程序,显示一个带Yes,No选择按钮的消息框,标题显示为:自己的姓名;正文内容显示为:学号;选择Yes的返回:“你选择的是Yes”,选择No的返回:“你选择的是No”。(2)(编写一个Windows 32位控制台程序,要求从键盘输入5个十六进制数,输出该数所对应的二进制数中所包含“0”的个数。) (3)熟悉WINDBG调试环境。使用WINDBG调试程序察看机器码,并单步执行,观察每一条指令的执行结果、 寄存器的内容、内存变量和堆栈数据的变化情况。实验代码: .386.model flat,stdc
14、alloption casemap:noneMessageBoxA PROTO :dword, :dword, :dword, :dwordMessageBox equ <MessageBoxA>Includelib user32.libIncludelib msvcrt.libNULL equ 0MB_OK equ 1.stack 4096.dataSzTile byte '陈强!',0SzMsg byte '1120131888!',0NO1 byte '我选的是确定!',0ah,0NO2 byte '我选的是取消!
15、9;,0ah,0.codestart: invoke MessageBox, NULL, offset SzMsg, offset SzTile, MB_OKcmp eax,1jz Acmp eax,1jnz BA:invoke MessageBox, NULL, offset NO1, offset SzTile, MB_OKretB:invoke MessageBox, NULL, offset NO2, offset SzTile, MB_OKret retend start.386.model flat,stdcallincludelib msvcrt.libprintf PROTO
16、C:dword,:varargscanf PROTO C:dword,:vararg.dataszmsg byte '%d',0ah,0msg byte '%d',0szformat byte '%x',0buf dword 40 dup(?)l0 dword ?l1 dword ?l2 dword ?l3 dword ?l4 dword ?.codestart:mov esi,0L:invoke scanf,offset szformat,offset bufmov eax,bufmov ecx,4mov edx,0t:mov ebx,eaxa
17、nd ebx,1cmp ebx,0jz yzcmp ebx,0jnz tyyz:inc edxty: shr eax,1loop tpush edxINC ESIcmp esi,5jb Lpop l4 pop l3pop l2pop l1pop l0invoke printf,offset szmsg,l0invoke printf,offset szmsg,l1invoke printf,offset szmsg,l2invoke printf,offset szmsg,l3invoke printf,offset msg,l4 retend start实验代码思路:第一小题代码思路:1.
18、说明MessageboxA的调用规则和参数类型2. 将定义的MessageBoxA通过指令equ赋给MessageBox3. 使用伪指令invoke,首次输出显示一个带Yes,No选择按钮的消息框,标题显示为:自己的姓名;正文内容显示为:学号4. 通过比较MessageBox的返回值与1的大小确定其选择的yes还是no 5.再次使用伪指令INVOKE调用MessageBox二次输出选择Yes的返回:“你选择的是Yes”,选择No的返回:“你选择的是No”。第二小题代码分析:1. 说明scanf和printf的调用规则和参数类型2. 在数据区说明输入输出的表现形式3. 设置一个外部变量esi确保
19、循环五次,即可以依次输入5个十六进制数;不断使数据右移即除二,与1做与运算,然后和0比较大小,若与0相等,则该数有一个0,用edx记录0的个数。4. 把edx入栈,然后清零5. 出栈,倒序输出检测结果,验证正确性(1) 对第一个小实验代码进行编译链接,如下图所示: (2) 运行检测结果: 分别选择确定,取消,检测是否有正确的返回值,实验测试如下:(3) 对第二个小实验进行编译链接 (4) 对第二个小实验进行检测,看是否正确,测试结果如下:结论:经过上述测试,实验结果与理论值相符,正确实验四实验内容:把数组中的n个双字型元素按从大到小(从小到大)的顺序排列。增加一个交换标志,在排序完成时不再执行
20、多余的外层循环。熟悉WINDBG调试环境。使用WINDBG观察内存变量,并观察结果。流程图ESI<ECX?ECX =ECX-1 EAX>EBX?EBX =arrESI*4+4ESI=ESI+1EAX =arrESI*4flag= 1arrESI*4+4=EAXarrESI*4=EBX结束flag=1?ESI= 0flag= 0开始ECX = n-1 flag fla1ECX>0?Flag=1实验代码:.386.model flat,stdcalloption casemap:noneincludelib msvcrt.libprintf PROTO C:dword,:vara
21、rgscanf PROTO C:dword,:vararg.data input_single_num byte '%d',0output_single_num byte '%d ',0output_single_num_crlf byte '%d',0ah,0numberOfElements dword ?number dword 128 dup(?).codegetInput proc local index, temp, numberOfEle:dword invoke scanf,offset input_single_num, offs
22、et numberOfElements push ecx mov ecx,numberOfElements mov numberOfEle,ecx mov index,0input: push eax mov eax,4 mul index mov temp,eax add temp,offset number pop eax invoke scanf, offset input_single_num, temp mov ecx,numberOfEle dec numberOfEle inc index loop input pop ecx retgetInput endpbubbleSort
23、 proclocal flag:bytepushamov flag,0;Get the number of elements, and save it at ecx mov ecx,numberOfElements dec ecxloop_out: xor esi,esi loop_in: mov eax,numberesi*4 mov ebx,numberesi*4+4 cmp eax,ebx jg control mov flag,1 mov numberesi*4,ebx mov numberesi*4+4,eaxcontrol: inc esi cmp esi,ecx jb loop_
24、in test flag,1 jz endloop mov flag,0 loop loop_outendloop:poparetbubbleSort endpoutput procpusha mov ecx,numberOfElements dec ecx dec ecx xor esi,esiisover: push ecx invoke printf, offset output_single_num, numberesi*4 pop ecx cmp esi,ecx inc esi jb isover invoke printf, offset output_single_num_crl
25、f, numberesi*4poparetoutput endpstart: invoke getInput invoke bubbleSort invoke output retend startWindbg1. 反汇编:使用U从起始地址00401010开始,列出15条语句2. 执行断点命令G3. 单步执行命令t,如下图表示用t执行3条指令4.进程执行命令p,如下图所示用P命令执行一条语句5.显示寄存命令r,如下所示r命令之后紧跟P命令显示寄存器内容6.用alt+4显示寄存器内容,出现如下图所示的寄存器窗口7.显示寄存单元D命令实验结果测试:对实验进行编译链接:输入数据进行测试:实验五实验内
26、容:多模块程序设计及多语言混合编程。要求: 编写一个汇编语言递归子程序(子模块)求斐波那契数列,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2,nN*);(输入一个数字,若该数字在数列中,则输出N,若不在数列中,输出“error”) 编写一个计算Z=sin(2n+1)*F(n)的汇编语言主模块,其中sin(x)调用C语言的函数库、F(n)通过调用中的模块实现,输入n。显示格式为:Z= 使用调试程序观察参数传递及堆栈平衡情况。实验代码:.386.model flat,stdcalloption casemap:noneinc
27、ludelib msvcrt.libscanf PROTO C:dword,:varargprintf PROTO C:dword, :vararg.dataSzMsg byte '%d',0ah,0Sz byte '%x',0buf dword 2 Dup(?)pj byte 'input error!',0F dword 1T dword 1counter dword 2.codestart: invoke scanf,offset Sz,offset bufcmp buf,1jz L6cmp buf,1jnz L7L6: invoke pr
28、intf,offset SzMsg,bufjmp LL7:mov eax,Fpush eaxmov ebx,Tpush ebxadd eax,ebxpush eaxinc countermov edx,ebxmov ebx,eaxmov eax,edxcmp buf,ebxjz L2cmp buf,ebxja L3L2:invoke printf,offset SzMsg,counterjmp LL3:invoke printf,offset pjL: retend start.386.model flat,stdcallOption casemap:noneincludelib msvcrt
29、.libprintf PROTO C :dword,:varargscanf PROTO C :dword,:varargsin PROTO C:dword,:vararg.datan dword 0f dword 50 dup(0)fmtout byte 'f(n) = %d',0ah,0fmtfout byte 'z = %f',0ah,0fmt byte '%d',0siny qword 0x qword 0y qword 0.codestart procmov word ptr f0,0mov word ptr f4,1mov esi,0
30、mov ecx,30L1:MOV eax,fesimov ebx,fesi+4add eax,ebxmov fesi+8,eaxadd esi,4loop L1invoke scanf,offset fmt,addr nmov esi,ninvoke printf,offset fmtout,fesi*4fild word ptr fesi*4invoke sin,esifmulfstp xinvoke printf,offset fmtfout,xRETstart endpend start实验代码分析说明:1. 将初始值F(0)=0,F(1)=1,分别存储在两个不同的变量里2. 设置一个变量counter用来记录N的大小,初始值为13. 从键盘输入一个数字判断其值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山西省建筑安全员A证考试题库
- 2025云南省建筑安全员-A证考试题库附答案
- 苏州城市学院《林木分子生物学》2023-2024学年第二学期期末试卷
- 海南师范大学《演艺娱乐经营管理》2023-2024学年第二学期期末试卷
- 华南理工大学《创业教育》2023-2024学年第二学期期末试卷
- 新余学院《实践中的马克思主义新闻观》2023-2024学年第二学期期末试卷
- 青岛幼儿师范高等专科学校《三维造型设计》2023-2024学年第二学期期末试卷
- 甘孜职业学院《汽车运用工程1》2023-2024学年第二学期期末试卷
- 郑州理工职业学院《装饰工程预决算A》2023-2024学年第二学期期末试卷
- 2025年安徽省建筑安全员-B证(项目经理)考试题库
- 【美术】第一单元第1课《情感的抒发与理念的表达》课件 2023-2024学年人教版初中美术八年级下册
- 体育与健康(水平二)《花样跳绳一级动作(18课时)》大单元教学计划
- 2024年济南工程职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 癔症护理查房
- 中国民航大学开题报告模板
- 人民币银行结算账户管理系统培训课件
- 钢结构施工安全培训
- 红木家具通用技术条件解析
- 超市商品结构图
- 沃尔沃S60L 2014款说明书
- 汽车零部件喷漆项目分析报告
评论
0/150
提交评论