汇编实验报告

汇编实验

  • 实验4 分支程序设计
  • 实验5 循环程序设计

实验4 分支程序设计

一、实验目的
理解分支程序结构的特点,掌握分支结构程序的编写。
二、实验内容
(1)验证单分支结构的字母判断程序(教材例4-10),编写数字判断程序(教材习题4.17),并运行正确。
(2)验证双分支结构的显示数据最高位程序(教材例4-11),编写测试高低位程序(教材习题4.16),并运行正确。
(3)(选作)参考教材附录A调试分支程序(例4-5)的方法,在WinDbg中调试自己编写的本实验①和②要求的程序(教材习题4.17和4.16),注意状态标志、跟踪指令执行顺序(即,程序指针EIP的数值变化)。
三、实验分析
画出自己编写实现的实验内容①和②的程序流程图,给出核心代码及注释。如果完成了选作内容③,请给出代表性的截图。
(1)A.验证单分支结构的字母判断程序:
代码:

	 include io32.inc			
  		  .data
   		 .code
start:
    	call readc	;输入一个字符,从AL返回值
   		 cmp al,'A'	;与大写字母A比较
   		 jb done		;比大写字母A小,不是大写字母,转移
    	cmp al,'Z'	;与大写字母Z比较
   		 ja done		;比大写字母Z大,不是大写字母,转移
    	or al,20h	;转换为小写
    	call dispcrlf  ;回车换行
    	call dispc	;显示小写字母	编译运行:
done:
    	exit 0
    	end start

在这里插入图片描述
B.数字判断程序
代码:

 include io32.inc
            .data
plmsg       byte 'Input Number:0~9:',13,10,0;提示输入信息
ermsg       byte 'Error!',13,10,0;错误信息
            .code
            mov eax,offset plmsg	;
            call dispmsg			;显示子程序
start:
            call readuib
            cmp eax,0          ;0比较
            jb no               ;小于0,跳转
            cmp eax,9           ;9比较
            ja no               ;大于9,跳转
            jmp done
no:         mov eax,offset ermsg	;
            call dispmsg
            jmp start           ;继续输入
done:
            exit 0
            end start

编译运行:
在这里插入图片描述
(2)A.验证双分支结构的显示数据最高位程序
代码:

            include io32.inc
            .data
dvar        dword 0bd630422h		;假设一个数据
            .code
start:
            mov ebx,dvar
            shl ebx,1				;ebx最高位移入CF标志
            jc one					;CF=1,即最高位为1,转移
            mov al,'0'				;CF=0,即最高位为0;AL=0’
            jmp two				;一定要跳过另一个分支体
one:        mov al,'1'				;AL=1’
two:        call dispc				;显示
done:
            exit 0
            end start

编译运行:
在这里插入图片描述
B.测试高低位程序
代码:

            include io32.inc
            .data
       dvar dword 57h           ;定义一个双字变量值为57h
            .code
start:
            mov eax,dvar        ;eax=57h
            test eax,80000000h  ;测试最高位
            jnz nextl           ;最高位为1则跳转至nextl,否则顺序执行
            test eax,1          ;测试最低位
            jnz nextr           ;最低位为1则跳转至nextr,否则顺序执行
            mov al,'M'          ;al='M'
            jmp done            ;无条件转移至done
nextl:        mov al,'L'        ;al='L'
               jmp done         ;无条件转移至done
nextr:        mov al,'R'        ;al='R'
done:       
            call dispc          ;输出al
            exit 0
            end start			编译运行:

编译运行结果:
在这里插入图片描述
程序流程图:
a.数字判断程序
在这里插入图片描述
b.测试高低位程序
在这里插入图片描述
(3)在WinDbg中调试自己编写的本实验①和②要求的程序
A.数字判断程序
初始寄存器窗口:
在这里插入图片描述
运行结束寄存器窗口:
在这里插入图片描述
存储器窗口:
在这里插入图片描述
Watch 窗口:
在这里插入图片描述

反汇编窗口:

在这里插入图片描述

B.测试高低位程序
寄存器窗口:

在这里插入图片描述
在这里插入图片描述

反汇编窗口:

在这里插入图片描述

Watch 窗口:
在这里插入图片描述

存储器窗口:
在这里插入图片描述

实验5 循环程序设计

一、实验目的
理解循环程序结构的特点,掌握循环结构程序的编写。
二、实验内容
(1)验证循环结构的斐波那契数列程序(教材例4-18),给出最后一个显示的数字。编写求最大N值的自然数求和程序(循环结构),具体要求是:进行自然数相加(1+2+3+……+N),如果(无符号整数的)累加和用一个32位寄存器存储,求出(显示)有效累加和的最大值及对应的最大N值。
(2)验证多重循环的冒泡法排序程序(教材例4-19),编写显示ASCII表程序(教材习题4.27),并运行正确。
(3)(选作)参考教材附录A调试循环程序(例4-15)的方法,在WinDbg中调试自己编写的本实验①和②要求的程序(求最大N值和教材习题4.27),注意灵活运用单步进入(Step Into)和单步通过(Step Over)的调试手段。
三、实验分析
画出自己编写实现的实验内容①和②的程序流程图,给出核心代码及注释。如果完成了选作内容③,给出代表性截图。
(1)A.斐波那契数列程序
代码:

include io32.inc
.data
.code
start:
  mov eax,1  ;首元素为1
  call dispuid ;显示元素
  call dispcrlf ;换行
  call dispuid ;显示元素
  call dispcrlf ;换行
  mov ebx,eax  ;次元素也为1
again:
  add eax, ebx ;前二元素加和
  jc done   ;超出32位进位范围为止
  call dispuid ;显示元素
  call dispcrlf ;换行
  xchg eax,ebx ;eax和ebx数据互换,进行下一轮累加和
  jmp again 
done: exit 0 
  end start

运行结果:
在这里插入图片描述
B.求最大N值的自然数求和程序
代码:

include io32.inc
.data
overmsg byte 'The SUM and N is: '
.code
start: mov eax,1	;设置初始值
  mov ebx,0
again: 
  mov ecx,eax
  add eax,ebx  ;前一个数和后一个数累加
  jc over ;判断是否进位,进位则跳转
  call dispuid 
  call dispcrlf
  inc ebx
  jmp again  ;再执行again循环
over: 
  mov eax, offset overmsg  ;汇报越界语句
  call dispmsg
  dec ecx
  mov eax, ecx    ;汇报越界前有效累加最大和
  call dispuid
  call dispcrlf
  dec ebx  
  mov eax, ebx    ;汇报对应的最大N值
  call dispuid
done: exit 0 
  end start

运行结果:
在这里插入图片描述
(2)多重循环的冒泡法排序程序
代码:(添加了输出)

include io32.inc
   .data
array dword 587,-632,777,234,-34
count = lengthof array
   .code
start:  mov ecx,count     
   dec ecx      ;外循环起始次数为length-1
outcir:  mov edx,ecx     ;外循环起始
   mov ebx,offset array  ;数组指针
   
incir:  mov eax,[ebx]    ;按ebx中的地址去存储单元取数据
   cmp eax,[ebx+4]
   jng next     ;如果arr[j]<arr[j+1],不交换位置
   xchg eax,[ebx+4]   ;否则交换位置
   mov [ebx],eax    ;完成位置交换
next:  add ebx,4     ;下一个元素
   dec edx      ;内循环计数
   jnz incir     ;判断某一轮外循环中的内循环是否结束
   loop outcir
ok:    mov ecx,count
   		mov ebx,offset array				
print:  mov eax,[ebx]
   call dispsid
   call dispcrlf
   add ebx,4
   loop print
done:  exit 0
   end start

运行结果:

在这里插入图片描述
C.显示ASCII表程序

include io32.inc
  .data
onemsg  byte '    | 0 1 2 3 4 5 6 7 8 9 A B C D E F', 13,10  ;第一行内容
  byte '--- + ', 31 dup ('-'),13,10,0
msg3 byte ' ',0
msg4 byte ' | ',0
msgtry  byte 'here',0				
priarr byte ?   
  .code
start: mov eax, offset onemsg
  call dispmsg
  mov ebx,0
  mov edx,020h ;初始化
outcir: mov eax,offset msg3
  call dispmsg
  mov eax,edx
  call disphb   ;显示前面的部分
  mov eax,offset msg4
  call dispmsg
incir:cmp ebx,0fh  ;判断该行打印条件
  ja next   ;大于15,顺序执行
  mov eax,ebx  ;否则打印该字符
  add eax,edx
  call dispc   ;逐个打印字符
  mov eax,020h ;打印ACSII间的空格
  call dispc
  inc ebx   ;计数器
  jmp incir
next: call dispcrlf
  ;mov eax,offset msgtry
  ;call dispmsg
  add edx,010h ;外循环每次自增010h  
  cmp edx,070h ;外循环结束条件
  ja done;大于则结束
  mov ebx,0;否则再次进入外循环
  jmp outcir
done: exit 0
  end start
运行结果:

在这里插入图片描述

流程图:
求最大N值的自然数求和程序
在这里插入图片描述
D.E.显示ASCII表程序
在这里插入图片描述
(3)A.反汇编窗口:
在这里插入图片描述

在这里插入图片描述
B寄存器窗口
在这里插入图片描述
在这里插入图片描述
存储器窗口
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于蒙特卡洛模拟的家用电动汽车充电负荷预测(MATLAB实现)

采用蒙特卡洛模拟法&#xff0c;对家用电动汽车充电负荷进行预测&#xff0c;电动汽车分为快、中、慢三种充电功率&#xff0c;且分为一天一充、一天两充、一天三充三种类型。全部MATLAB代码在下方给出&#xff0c;可以直接运行。 %%%%%%%%%%%%%%%%%%%%%%%%输入电动汽车相关原…

前端开发WebStorm

WebStorm是一款功能强大的JavaScript集成开发环境&#xff0c;凭借智能代码补全、实时分析和代码重构、集成版本控制、强大的调试和测试工具、实时预览和集成前端工具以及自定义配置和插件支持等功能&#xff0c;成为开发者首选的利器。 前端开发WebStorm WebStorm是一款功能强…

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…

【QT】MDI应用程序设计

目录 1 MDI简介 2 文档窗口类QFormDoc的设计 3 MDI主窗口设计与子窗口的使用 3.1 主窗口界面设计 3.2 MDI子窗口的创建与加入 3.3 QMdiArea常用功能函数 3.4 MDI的信号 1 MDI简介 传统的应用程序设计中有多文档界面&#xff08;Multi-documentInterface&#xff0c;MDI…

Spring源码学习-Spring流程概述(一)

Spring启动的流程 public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("applicationContext.xml");Student bean context.getBean(Student.class);context.close();} }调用…

php低版本(7.4)配置过程中遇到的问题及基本解决手段

目前php不支持较低版本的安装&#xff0c;如果安装低版本必须借助第三方库shivammathur //将第三方仓库加入brewbrew tap shivammathur/php //安装PHPbrew install shivammathur/php/php7.4 可能出现的问题 像这样突然中止然后报错&#xff0c;一般是网络问题&#xff0c;或…

JOSEF约瑟 漏电继电器 JHOK-ZBG1 φ25mm AC220V 30-500ma 1S

系列型号 JHOK-ZBG1一体式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBG2一体式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBG1漏电继电器原为分体式固定式安装&#xff0c;为适应现行安装场合需要&#xff0c;上海约瑟继电器厂在产品原JHOK-ZBG漏电继电器基础上进行产…

Python中元祖的用法

元祖tuple(,) 元祖就是不可变的列表&#xff0c;元祖用()表示,元素与元素之间用逗号隔开,数据类型没有限制。 tu (科比,詹姆斯,乔丹) tu tuple(123) 小括号中有一个元素,有逗号就是元祖,没有就是它本身。 空的小括号就是元祖 索引和切片与列表和字符串相同 不可变指的是,…

Centos使用Docker搭建自己的Gitlab社区版16.8.0-ce.0(设置汉化 修改密码 设置SSH秘钥 添加拉取命令端口号 备份至网盘和恢复)

根据我的经验 部署Gitlab&#xff08;社区版&#xff09; 至少需要2核4g的服务器 带宽3~4M 1. 在自己电脑上安装终端&#xff1a;宝塔ssl终端 或者 FinalShell&#xff0c;根据喜好安装即可 http://www.hostbuf.com/t/988.html http://www.hostbuf.com/downloads/finalshell_w…

什么品牌洗地机最好?专业旗舰级洗地机推荐

作为一个打工族&#xff0c;很能理解大家对日常清洁繁琐的烦恼&#xff0c;尤其是在忙碌工作后难以有力气打扫卫生。这时候&#xff0c;洗地机就是解决问题的利器了。它不仅方便轻松&#xff0c;还能有效消菌杀毒&#xff0c;助力深度清洁。若你正在为选择哪款洗地机而烦恼&…

实用VBA:17.大量word文件中的文本内容进行批量替换

1.需求场景 在工作中可能会遇到需要对大量word文件中的文字内容进行批量替换的情况。相比excel的批量处理&#xff0c;个人感觉word文档中由于包含大量样式信息&#xff0c;批处理时总感觉有顾虑。一者担心影响了文档的格式&#xff0c;误修改了文档的样式&#xff0c;那后果……

计算机网络-数据通信基础知识(数据通信模型 相关术语 单工/半双工/全双工 串行/并行 同步/异步 码元 数据传输速率 带宽)

文章目录 典型的数据通信模型数据通信的相关术语设计数据通信系统要考虑的三个问题单工/半双工/全双工 串行/并行同步/异步小结码元数据传输速率的两种表示方法思考题1思考题2 带宽 典型的数据通信模型 广域网中有模拟信道&#xff0c;模拟信道能传模拟信号&#xff0c;不能传…

Vue2和Vue3生命周期映射关系及异同

目录 一、Vue2 二、Vue3 三、什么是生命周期 四、Vue2和Vue3生命周期映射关系及异同 一、Vue2 Vue是一种用于构建用户界面的渐进式JavaScript框架。它专注于视图层&#xff0c;采用了组件化的开发方式&#xff0c;使得开发者可以轻松地构建复杂的应用程序。 Vue具有以下特…

alfred自定义谷歌翻译workflow

如果要实现自定义workflow&#xff0c;则必须安装付费版的alfred&#xff0c;囊中羞涩的话可以自行淘宝。自定义步骤如下&#xff1a; 1. 新建空的workflow&#xff0c;填写基本信息 2. 开发python脚本 打开该workflow所在目录&#xff0c;进行下面步骤&#xff1a; 首先安装…

app重新签名之后,teamID会改变吗?

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01; 在iOS和macOS开发中&#xff0c;我们经常需要对应用进行重新签名&#xff0c;以便在发布或测试时更改应用的证书或代理。在重新签名应用程序时&#xff0c;可能会出现teamID变化的情况。本文将探…

安科瑞弧光保护装置助力煤矿高压开关柜的可靠供电

摘要 在煤矿高压开关柜运行中&#xff0c;由于受到多种因素的干扰&#xff0c;中低压母线发生故障的概率较高&#xff0c;在中低压母线装设中又没有设置专门的保护&#xff0c;所以开关柜电弧光短路等问题时有发生&#xff0c;对变压器等设备造成一定的损害。鉴于此&#xff0c…

【高效开发工具系列】Intellj IDEA 2023.3 版本

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Git学习 -- 分支合并、版本修改相关

目录 learn GIT Learn Git Branching merge和rebase的使用 基础命令 版本回退 工作区和暂存区 管理修改 撤销修改 删除修改 learn GIT Learn Git Branching 这是Gitee上的Git学习教程 Learn Git Branching Git Rebase Learn Git Branching 最终的实操 merge和rebase的…

常见的6种软件测试用例设计方法

常见的软件测试用例设计方法&#xff0c;个人认为主要是下面这6种&#xff1a; 流程图法&#xff08;也叫场景法&#xff09;等价类划分法边界值分析判定表正交法错误推测法 这6种常见方法中&#xff0c;我分别按照定义、应用场景、使用步骤、案例讲解这4个部分进行讲解。 所…

thinkphp+mysql高校跳蚤二手市场交易系统vue

商品信息是卖家供应用户必不可少的一个部分。在跳蚤市场发展的整个过程中&#xff0c;商品担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的普通高校网上跳蚤市场&#xff0c;使用Thinkphp5框架&#xff0c;php语言…