




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计报告汇编语言程序设计报告 班级 班级 学号 学号 姓名 姓名 目录目录 汇编语言程序设计报告 1 汇编语言程序设计实验报告 4 实验一 4 实验内容 4 实验目的 4 实验代码 4 实验代码整体思路 5 1 检测所编程序的正确性 5 实验二 7 1 实验内容 7 结果测试 11 Debug 11 实验三 13 实验要求 13 实验代码 13 实验代码思路 15 检测结果 验证正确性 15 结论 17 实验四 17 实验内容 17 流程图 18 实验代码 18 Windbg 21 实验结果测试 23 输入数据进行测试 24 实验五 24 实验内容 多模块程序设计及多语言混合编程 24 要求 24 实验代码 24 实验代码分析说明 26 实验数据检测 判断是否成功完成实验任务 27 实验心得 28 汇编语言程序设计实验报告汇编语言程序设计实验报告 实验一实验一 实验内容实验内容 熟悉 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 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 1 LP1 INC SI LP2 MOV AL SI CMP AL 13 JZ DISP CMP AL SI 1 JNZ LP1 MOV DI SI LP3 INC DI MOV AL DI 1 MOV DI AL CMP AL 13 JZ LP2 JMP LP3 DISP MOV AL MOV SI AL MOV AH 9 LEA DX BUFFER 2 INT 21H EXIT MOV AX 4C00H INT 21H CODE ENDS END MAIN 实验代码整体思路实验代码整体思路 定义一个大小为 60 的缓冲区 用来存储从键盘输入的字 符串 调用中断调用 将字符串输入到缓冲区当中 使用取地址符号 Lea 取得输入字符串的首地址然后后一位与前一 位相比 若相同则将其舍弃 否者将其记录在缓冲区中 循环结 束之后在其后补上字符 即可一次输出 无单个输出 1 检测所编程序的正确性检测所编程序的正确性 编译所建的编译所建的 1 asm 文件 文件 按下回车键之后开始编译 如下图所示 编译结束表明没有错误不存在警告按下回车键之后开始编译 如下图所示 编译结束表明没有错误不存在警告 对编译成功之后的文件进行链接 以生成能运行的对编译成功之后的文件进行链接 以生成能运行的 exe 文件 如下图文件 如下图 1 1 所示 所示 1 1 链接之后发现链接 链接之后发现链接 Link 之后也是成功的 接下来就进行测试的最后一步 即运行 之后也是成功的 接下来就进行测试的最后一步 即运行 1 exe 文件 输入一串字符串 看能否达到预期的目的 如达到 则成功 否者重新编文件 输入一串字符串 看能否达到预期的目的 如达到 则成功 否者重新编 译 译 可见 与预期目的一致 达到了目的 可见 与预期目的一致 达到了目的 6 该实验使用的知识点该实验使用的知识点 1 中断调用 以及使用功能号实现输入输出中断调用 以及使用功能号实现输入输出 2 使用循环 无条件转移指令 使用循环 无条件转移指令 JMP 等 等 实验二实验二 1 实验内容实验内容 1 程序中自定义缓冲区 AREA1 其中存放 200 个有序的无符号字型 数据 至少有 3 个重复数据 编程序将其排序后送到自 AREA2 开始的 单元中 要求传送后的数据从大到小排序 并实现查找功能 判定需要 查找的数据在 AREA1 与 AREA2 中分别对应的位置 并通过查看内存验 证结果的正确性 把有序的无符号字型数据换成带符号字型数据 实现 以上功能 2 熟悉 DEBUG 调试环境 使用 DEBUG 调试程序察看机器码 并单 步执行 观察每一条指令的执行结果 寄存器的内容 内存变量和堆 栈数据的变化情况 2 实验代码实验代码如下 如下 assume ds data cs code ss stack data 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 dup 0 tips1 db Please input the number you want to find tips2 db Not Found crlf db 0dh 0ah output db 5 dup data ends stack segment stack dw 32 dup stack ends code segment findmost proc find the greatest number in area1 put it in AX push bx push cx push dx push bp lea bx area1 mov dx bx add bx 2 lo cmp dx bx jge smaller jae smaller 无符号时使用此指令 并将上条指令注释掉无符号时使用此指令 并将上条指令注释掉 and flag bx 1 jnz smaller mov dx bx 将当前最大值储存将当前最大值储存 mov bp bx smaller add bx 2 cmp bx count 检查是否为最后一个元素检查是否为最后一个元素 记录最大值于记录最大值于 ax jl notfinish mov ax dx mov WORD PTR ds flag bp 1 pop bp pop dx pop cx pop bx ret notfinish jmp lo findmost endp writeGreatest2area2 proc 按照要求将数据写入按照要求将数据写入 area2 push ax push bx lea bx area2 find 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 ret writeGreatest2area2 endp convertDigital2Ascii proc push bx push dx mov dx ax xor bx bx mov cl 100 div cl add ax 48 mov output bx al inc bx mov ax dx mov cl 10 div cl add ah 48 add al 48 mov output bx al inc bx mov output bx ah lea dx output mov ah 9 int 21h lea dx crlf int 21h mov ax dx pop dx pop bx ret convertDigital2Ascii endp findTheValue proc 在两个区域中分别查找数字在两个区域中分别查找数字 ax 的位置的位置 push ax push bx push si push cx push dx mov cx count mov bx 2 equal1 add bx 2 cmp ax area1 bx jnz equal1 push ax mov ax bx sar ax 1 inc ax call convertDigital2Ascii pop ax mov bx 2 equal2 add bx 2 cmp ax area2 bx jnz equal2 push ax mov ax bx sar ax 1 inc ax call convertDigital2Ascii pop ax pop dx pop cx pop si pop bx pop ax ret findTheValue endp start mov ax data mov ds ax call writeGreatest2area2 mov ax 255 call findTheValue mov ax 4c00h int 21h code ends end start 结果测试 结果测试 对实验二进行编译链接 运行程序 输出实验结果 Debug 显示寄存器内容 如下图所示 用 U 命令反汇编可执行代码 如下图所示 用 g 命令设置断点到 CS 00D8 处 如下图所示 用 t 命令跟踪执行程序 如下图所示逐条跟踪三次的结果 用 q 命令退出 实验三实验三 实验要求 实验要求 熟悉 Windows 编程环境 编写一个 Windows 界面汇编程序 显示一个带 Yes No 选择按钮的 消息框 标题显示为 自己的姓名 正文内容显示为 学号 选择 Yes 的 返回 你选择的是 Yes 选择 No 的返回 你选择的是 No 2 编写一个 Windows 32 位控制台程序 要求从键盘输入 5 个十六 进制数 输出该数所对应的二进制数中所包含 0 的个数 3 熟悉 WINDBG 调试环境 使用 WINDBG 调试程序察看机器码 并单步执行 观察每一条指令的执行结果 寄存器的内容 内存变量和堆 栈数据的变化情况 实验代码 实验代码 386 model flat stdcall option casemap none MessageBoxA PROTO dword 386 model flat stdcall includelib msvcrt lib printf PROTO C dword vararg dword dword dword MessageBox equ Includelib user32 lib Includelib msvcrt lib NULL equ 0 MB OK equ 1 stack 4096 data SzTile byte 陈强陈强 0 SzMsg byte 1120131888 0 NO1 byte 我选的是确定我选的是确定 0ah 0 NO2 byte 我选的是取消我选的是取消 0ah 0 code start invoke MessageBox NULL offset SzMsg offset SzTile MB OK cmp eax 1 jz A cmp eax 1 jnz B A invoke MessageBox NULL offset NO1 offset SzTile MB OK ret B invoke MessageBox NULL offset NO2 offset SzTile MB OK ret ret end start scanf PROTO C dword vararg data szmsg byte d 0ah 0 msg byte d 0 szformat byte x 0 buf dword 40 dup l0 dword l1 dword l2 dword l3 dword l4 dword code start mov esi 0 L invoke scanf offset szformat offset buf mov eax buf mov ecx 4 mov edx 0 t mov ebx eax and ebx 1 cmp ebx 0 jz yz cmp ebx 0 jnz ty yz inc edx ty shr eax 1 loop t push edx INC ESI cmp esi 5 jb L pop l4 pop l3 pop l2 pop l1 pop l0 invoke printf offset szmsg l0 invoke printf offset szmsg l1 invoke printf offset szmsg l2 invoke printf offset szmsg l3 invoke printf offset msg l4 ret end start 实验代码思路实验代码思路 第一小题代码思路 第一小题代码思路 1 说明说明 MessageboxA 的调用规则和的调用规则和 参数类型参数类型 2 将定义的将定义的 MessageBoxA 通过指令通过指令 equ 赋给赋给 MessageBox 3 使用伪指令使用伪指令 invoke 首次输出 首次输出显显 示一个带示一个带 Yes No 选择按钮的消息选择按钮的消息 框 标题显示为 自己的姓名 正框 标题显示为 自己的姓名 正 文内容显示为 学号文内容显示为 学号 4 通过比较通过比较 MessageBox 的返回值与的返回值与 1 的大小确定其选择的的大小确定其选择的 yes 还是还是 no 5 再次使用伪指令再次使用伪指令 INVOKE 调用调用 MessageBox 二次输出选择二次输出选择 Yes 的返的返 回 回 你选择的是你选择的是 Yes 选择 选择 No 的的 返回 返回 你选择的是你选择的是 No 第二小题代码分析 第二小题代码分析 1 说明说明 scanf 和和 printf 的调用规则和的调用规则和 参数类型参数类型 2 在数据区说明输入输出的表现形式在数据区说明输入输出的表现形式 3 设置一个外部变量设置一个外部变量 esi 确保循环五确保循环五 次 即可以依次输入次 即可以依次输入 5 个十六进制个十六进制 数 不断使数据右移即除二 与数 不断使数据右移即除二 与 1 做与运算 然后和做与运算 然后和 0 比较大小 若比较大小 若 与与 0 相等 则该数有一个相等 则该数有一个 0 用 用 edx 记录记录 0 的个数 的个数 4 把把 edx 入栈 然后清零入栈 然后清零 5 出栈 倒序输出出栈 倒序输出 检测结果 验证正确性检测结果 验证正确性 1 对第一个小实验代码进行编译链接 如下图所示 对第一个小实验代码进行编译链接 如下图所示 2 运行检测结果 运行检测结果 分别选择确定 取消 检测是否有正确的返回值 实验测试如下 分别选择确定 取消 检测是否有正确的返回值 实验测试如下 3 对第二个小实验进行编译链接对第二个小实验进行编译链接 4 对第二个小实验进行检测 看是否正确 测试结果如下 对第二个小实验进行检测 看是否正确 测试结果如下 结论结论 经过上述测试 实验结果与理论值相符 正确 经过上述测试 实验结果与理论值相符 正确 实验四实验四 实验内容实验内容 把数组中的 n 个双字型元素按从大到小 从小到大 的顺序 排列 增加一个交换标志 在排序完成时不再执行多余的外层循环 熟悉 WINDBG 调试环境 使用 WINDBG 观察内存变量 并观察结果 流程图流程图 实验代码 实验代码 386 model flat stdcall option casemap none ESIEBX EBX arr ESI 4 4 ESI ESI 1 EAX arr ESI 4 flag 1 arr ESI 4 4 EAX arr ESI 4 EBX 结束 flag 1 ESI 0 flag 0 开始 ECX n 1 flag fla1 ECX 0 Flag 1 includelib msvcrt lib printf PROTO C dword vararg scanf PROTO C dword vararg data input single num byte d 0 output single num byte d 0 output single num crlf byte d 0ah 0 numberOfElements dword number dword 128 dup code getInput proc local index temp numberOfEle dword invoke scanf offset input single num offset numberOfElements push ecx mov ecx numberOfElements mov numberOfEle ecx mov index 0 input 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 ret getInput endp bubbleSort proc local flag byte pusha mov flag 0 Get the number of elements and save it at ecx mov ecx numberOfElements dec ecx loop out xor esi esi loop in mov eax number esi 4 mov ebx number esi 4 4 cmp eax ebx jg control mov flag 1 mov number esi 4 ebx mov number esi 4 4 eax control inc esi cmp esi ecx jb loop in test flag 1 jz endloop mov flag 0 loop loop out endloop popa ret bubbleSort endp output proc pusha mov ecx numberOfElements dec ecx dec ecx xor esi esi isover push ecx invoke printf offset output single num number esi 4 pop ecx cmp esi ecx inc esi jb isover invoke printf offset output single num crlf number esi 4 popa ret output endp start invoke getInput invoke bubbleSort invoke output ret end start Windbg 1 反汇编 使用 U 从起始地址 00401010 开始 列出 15 条语句 2 执行断点命令 G 3 单步执行命令 t 如下图表示用 t 执行 3 条指令 4 进程执行命令 p 如下图所示用 P 命令执行一条语句 5 显示寄存命令 r 如下所示 r 命令之后紧跟 P 命令显示寄存器内容 6 用 alt 4 显示寄存器内容 出现如下图所示的寄存器窗口 7 显示寄存单元 D 命令 实验结果测试 实验结果测试 对实验进行编译链接 输入数据进行测试输入数据进行测试 实验五实验五 实验内容 实验内容 多模块程序设计及多语言混合编程 要求 要求 编写一个汇编语言递归子程序 子模块 求斐波那契数列 斐 波纳契数列以如下被以递归的方法定义 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 输入一个数字 若该数字在 数列中 则输出 N 若不在数列中 输出 error 编写一个计算 Z sin 2n 1 F n 的汇编语言主模块 其中 sin x 调 用 C 语言的函数库 F n 通过调用 中的模块实现 输入 n 显 示格式为 Z 使用调试程序观察参数传递及堆栈平衡情况 实验代码实验代码 386 model flat stdcall option casemap none includelib msvcrt lib scanf PROTO C dword vararg printf PROTO C dword vararg data SzMsg byte d 0ah 0 Sz byte x 0 buf dword 2 Dup pj byte input error 0 F dword 1 T dword 1 counter dword 2 code start invoke scanf offset Sz offset buf cmp buf 1 jz L6 cmp buf 1 jnz L7 L6 invoke printf offset SzMsg buf jmp L L7 mov eax F push eax mov ebx T push ebx add eax ebx push eax inc counter mov edx ebx mov ebx eax mov eax edx cmp buf ebx jz L2 cmp buf ebx ja L3 L2 invoke printf offset SzMsg counter jmp L L3 invoke printf offset pj L ret end start 386 model flat stdcall Option casemap none includelib msvcrt lib printf PROTO C dword vararg scanf PROTO C dword vararg sin PROTO C dword vararg data n dword 0 f dword 50 dup 0 fmtout byte f n d 0ah 0 fmtfout byte z f 0ah 0 fmt byte d 0 siny qword 0 x qword 0 y qword 0 code start proc mov word ptr f 0 0 mov word ptr f 4 1 mov esi 0 mov ecx 30 L1 MOV eax f esi mov ebx f esi 4 add eax ebx mov f esi 8 eax add esi 4 loop L1 invoke scanf offset fmt addr n mov esi n invoke printf offset fmtout f esi 4 fild word ptr f esi 4 invoke sin esi fmul fstp x invoke printf offset fmtfout x RET start endp end start 实验代码分析说明 实验代码分析说明 1 将初始值 F 0 0 F 1 1 分别存储在两个不同的变量里 2 设置一个变量 count
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国投集团考试题及答案
- 观赏渔业考试题及答案
- 工务初级考试题及答案
- 服装质检考试题及答案
- 房屋维修考试题及答案
- 方位训练考试题及答案
- (正式版)DB1501∕T 0005-2020 《居家养老服务管理规范》
- 俄语中考试题及答案
- 电气考试题及答案多选
- 电荷量考试题及答案
- 2025年人教部编版小学三年级语文上册全册单元测试题及答案(全套)
- 城市轨道交通车站平面设计要点课件
- 生产计划与调度操作手册
- 食品防欺诈培训课件
- 室内墙体拆除合同全文
- 2025年中国移动初级解决方案经理学习考试题库大全-上(单选题)
- 江苏苏州历年中考语文现代文之散文阅读13篇(截至2024年)
- 体育行业反兴奋剂管理制度
- 护理管理的发展史
- 《以产地命名中药》课件
- 广西恒镒矿业贸易有限公司广西苍梧县古木口矿区金矿矿山地质环境保护与土地复垦方案
评论
0/150
提交评论