汇编语言实验八

目录

一、实验目的

二、实验内容

三.实验步骤以及结果

1、阅读monthtab.asm 程序,要求写出该程序功能,并在实验报告中画出其程序流程图

2.编写一段程序,要求在长度为20的数组(无符号数)中,找出大于42H的无符号数的个数并存入字节单元UP中,找出小于42H的无符号数的个数存入字节单元DOWN中。并利用int 21h dos功能输出 UP 和DOWN 的值

3. 给定一个年份,判断其是否是闰年,是闰年请输出“是”,否者输“否”

总结


一、实验目的

1、了解汇编语言程序条件分支和循环设计结构

2、熟悉各种跳转指令的使用

二、实验内容

  1. 阅读monthtab.asm 程序,要求写出该程序功能,并在实验报告中画出其程序流程图
  2. 编写一段程序,要求在长度为20的数组(无符号数)中,找出大于42H的无符号数的个数并存入字节单元UP中,找出小于42H的无符号数的个数存入字节单元DOWN中。并利用int 21h dos功能输出 UP 和DOWN 的值

数组数据: 18H,42H,36H,43H,42H,19H,50H,51H,8FH,42H,

34H,5AH,0BCH,3AH,0BFH, 0FFH,03H,3BH,42H, 012H

3. 给定一个年份,判断其是否是闰年,是闰年请输出“是”,否者输“否”

三.实验步骤以及结果

1、阅读monthtab.asm 程序,要求写出该程序功能,并在实验报告中画出其程序流程图

2.编写一段程序,要求在长度为20的数组(无符号数)中,找出大于42H的无符号数的个数并存入字节单元UP中,找出小于42H的无符号数的个数存入字节单元DOWN中。并利用int 21h dos功能输出 UP 和DOWN 的值

数组数据: 18H,42H,36H,43H,42H,19H,50H,51H,8FH,42H,

34H,5AH,0BCH,3AH,0BFH, 0FFH,03H,3BH,42H, 012H

代码如下:

stack segment stackstack endsdataseg segmentarray DW 18H, 42H, 36H, 43H, 42H, 19H, 50H, 51H, 8FH, 42H DW 34H, 5AH, 0BCH, 3AH, 0BFH, 0FFH, 03H, 3BH, 42H, 012H UP     DB ? DOWN   DB ? msg1   DB 'UP: $' msg2   DB 'DOWN: $' newline DB 13, 10, '$'
dataseg endscode segment
assume cs:code, ds:dataseg, ss:stackstart: mov ax, dataseg mov ds, ax xor cx, cx           ; cx = 0, 初始化计数器 xor bx, bx           ; bx = 0, 用于数组索引 xor al, al           ; al = 0, 用于存储比较结果  ; 遍历数组,比较每个元素与42H mov si, offset array mov cl, 20            ; 数组长度为20 check_loop: cmp cx, cl           ; 检查是否检查完所有元素 jge end_check mov ax, [si + bx]    ; 加载当前元素到ax and ax, 0FFH         ; 保留低8位,因为是无符号数 cmp ax, 42H          ; 与42H比较 ja greater_than     ; 如果大于42H,跳转 jb less_than        ; 如果小于42H,跳转 ; 如果等于42H,不做任何事情,继续下一个元素 inc bx inc cx jmp check_loop greater_than: inc byte ptr [UP]    ; 大于42H的计数器加1 jmp continue_loop less_than: inc byte ptr [DOWN]  ; 小于42H的计数器加1 continue_loop: inc bx inc cx jmp check_loop end_check: ; 使用DOS中断21h输出UP和DOWN的值 mov ah, 09h         ; DOS功能号:显示字符串 lea dx, msg1        ; 加载消息地址到DX int 21h mov ah, 02h         ; DOS功能号:显示字符 mov dl, [UP]        ; 加载UP值到DL add dl, 30h         ; 转换为ASCII码 int 21h mov ah, 09h         ; DOS功能号:显示字符串 lea dx, newline     ; 加载换行符地址到DX int 21h mov ah, 09h         ; DOS功能号:显示字符串 lea dx, msg2        ; 加载消息地址到DX int 21h mov ah, 02h         ; DOS功能号:显示字符 mov dl, [DOWN]      ; 加载DOWN值到DL add dl, 30h         ; 转换为ASCII码 int 21h ; 程序结束 mov ax, 4C00h       ; DOS功能号:退出程序 int 21h        
code endsend start

3. 给定一个年份,判断其是否是闰年,是闰年请输出“是”,否者输“否”

实验代码:

data segment    ;定义数据段infon db 0dh,0ah,'Please input a year: $'    ;infon ,双字节,回车换行,内容Y db 0dh,0ah,'This is a leap year! $'   ;y ,双字节,回车换行,内容N db 0dh,0ah,'This is not a leap year! $'    ;n ,双字节,回车换行,内容($是结束符)w dw 0        ;w为双字类型buf db 8      ;开辟8个双字节类型的缓冲区,未赋值db ?     db 8 dup(?)      
data endsstack segment stackdb 200 dup(0) ;开辟200个双字节类型的存储空间。(保护现场用到)
stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,data ;寄存器间的数据交换,把data给了数据段mov ds,axlea dx,infon  ;在屏幕上显示提示信息mov ah,9int 21hlea dx,buf    ;从键盘输入年份字符串mov ah,10int 21hmov cl, [buf+1] ;把buf+1地址指向的内容给cl,buf长度lea di,buf+2    ;把buf+2的地址给di,buf偏移地址call datacate  ;调用函数datacate,传递参数call ifyears ;调用函数ifyears,由参数判断是否为闰年jc a1           ;若产生进位就跳到a1处lea dx,n        ;dx加载n的地址'This is not a leap year!'mov ah,9        ;显示dx内的内容int 21hjmp exit        ;跳到exita1:   lea dx,y        ;dx加载y的地址'This is a leap year!'mov ah,9int 21hexit: mov ah,4ch  ;结束本程序,返回 DOS 操作系统int 21h;实现将字符串的闰年转换为数字存储在ax中
datacate proc near;  ;段内调用,子函数1push cx;      ;保护现场                                              dec cx     lea si,buf+2 ;把buf+2的地址给sitt1: inc si      ;移动到字符串指定位置loop tt1        ;循环函数是个递增函数, loop指令的格式是:loop标号,cpu执行loop指令的时候,要进行两步操作;1:(cx)=(cx)-1   ;2:判断cx中的值,不为零则转至标号处执行,如果为零,则向下执行;lea si,cx[di]pop cx      ;恢复现场mov dh,30h mov bl,10       ;乘数设置为10mov ax,1       l1: push ax     ;保护现场sub  byte ptr [si],dh         ;没有寄存器参与的内存单元访问指令(DMA),si-dh保存在si中mul  byte ptr [si]       ;没有寄存器参与的内存单元访问指令(DMA),ax*si,结果放在eax中,这里的寄存器si是16位,被乘数在ax中也是16位。;MUL r/m(寄存器或者内存)  ;mul是字内乘法,把si对应的地址内一个字的长度赋给;如果参数是 r8/m8,   将把 AL 做乘数, 结果放在 AX;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAXadd w,ax        ;w+ax,结果存入w,存入的是数字pop ax      ;恢复现场mul bl      ;bl*al,结果存放在ax中dec si      ;si中的内容减一loop l1     ;l1循环,cx判断次数retdatacate endp;实现ax中年份的判断ifyears proc near      ;段内调用,子函数2push  bx        ;保护现场(保护谁,就用到谁)push  cxpush  dxmov ax,w            ;把w值赋给cx,w值为mov   cx,ax    ;把ax值赋给cxmov  dx,0     mov  bx,4      ;ax/4div  bx             ;ax/bx,结果在ax中,余数在dx中;如果除数是8位,那么除法的结果AL保存商,AH保存余数,;如果除数是16位,那么除法的结果 AX保存商,DX保存余数。cmp  dx,0      ;比较余数和0,结果存入cf标志位(进位标志位)jnz  lab1      ;如果非0,跳转到lab1处mov   ax,cx   mov  bx,100    ;ax/100div  bx            cmp dx,0            ;比较余数和0,结果存入cf标志位(进位标志位)jnz  lab2      ;如果非0,跳到lab2mov  ax,cx    mov bx,400     ;ax/400div  bx            cmp  dx,0      ;比较余数和0,结果存入cf标志位(进位标志位)jz  lab2            ;cf=0跳到lab2lab1: clc                 ;清除cf标志位,设置cf=0jmp lab3            ;跳到lab3lab2: stc                 ;cf置1lab3: pop  dx             ;恢复现场pop  cx       pop  bxretifyears endp
code endsend start

测试结果如下:

2100是错的,其余三种情况是正确的。

总结

学到后期,摆烂太多,发现自己稍难一点的汇编代码都不会敲,只能从网上复制粘贴。这算复制粘贴的比较靠谱的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW与C#相互调用dll

C#调用LabVIEW创建的dll 我先讲LabVIEW创建自己的.net类库的方法吧,重点是创建,C#调用的步骤,大家可能都很熟悉了。 1、创建LabVIEW项目,并创建一个简单的add.vi,内容就是abc,各个接线端都正确连接就好。 …

云层之间穿梭特效视频转场PR模板素材

12 个超赞的 Premiere Pro 云层穿梭特效视频转场模板 https://prmuban.com/39056.html 📽 你是否正在寻找一种方法,让你的视频更酷、更时尚、更吸引人?今天推荐的12个逼真的云层穿梭特效视频转场模板,绝对能为你的作品锦上添花 ✨…

智赢选品,OZON数据分析选品利器丨萌啦OZON数据

在电商行业的激烈竞争中,如何快速准确地把握市场动态、洞察消费者需求、实现精准选品,是每个电商卖家都面临的挑战。而在这个数据驱动的时代,一款强大的数据分析工具无疑是电商卖家们的得力助手。今天,我们就来聊聊这样一款选品利…

我也认为说 360 无法卸载这一说法,是一个 “彻头彻尾的谣言”

最近,360 公司董事长周鸿祎发布视频回应了 360 无法卸载这一说法,称其是一个 “彻头彻尾的谣言”。他解释道,360 软件完全可以卸载,在设置里面有卸载的入口,通过软件管家也可以正常卸载。不能卸载的说法完全是断章取义…

【UIDynamic-动力学-UIPushBehavior-推行为 Objective-C语言】

一、接下来,我们来说这个,推行为, 1.推行为,首先,它叫做UIPushBehavior, 这个里边呢,又分为持续推力、瞬时推力, 我们新建一个项目,叫做:13-推行为 我们这个里边,还是先来一个redView, UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100,100,…

【开发】利用SSH端口转发通过阿里云服务器访问实验室设备

文章目录 写在前面公网服务器与实验室服务器连通性公网服务器ping实验室实验室ping公网服务器SSH隧道转发 写在前面 最近实验室搬家,导致无法访问内网,之前搭建的zerotier组网成功利用手机热点访问,但是无奈zerotier的不稳定导致开发效率低&…

B端产品竞品分析-总结版

B端竞品分析的难点 分析维度-业务逻辑复杂 B端产品与C端产品业务模型不同,B端产品主要以业务为导向,因此其业务流程与业务逻辑梳理起来也会较C端产品复杂的多,对于个人能力也有一定的要求,需要我们具备相关领域或行业专业知识。…

猫头虎分享已解决Bug:Array Index Out of Bounds Exception

🐯 猫头虎分享已解决Bug:Array Index Out of Bounds Exception 🐯 摘要 大家好,我是猫头虎,今天我们要聊聊后端开发中经常遇到的一个问题:Array Index Out of Bounds Exception,即 java.lang.…

win10 修改远程桌面端口,在Win10上修改远程桌面端口的要怎么操作

在Windows 10上修改远程桌面端口是一个涉及系统配置的过程,这通常是为了增强安全性或满足特定网络环境的需要。 一、通过注册表编辑器修改远程桌面端口 1. 打开注册表编辑器: - 按下Win R组合键,打开“运行”对话框。 - 在“运行”对话框…

大模型揭秘:AI与CatGPT在实体识别中的创新应用

摘要 尽管大规模语言模型 (LLM) 在各种 NLP 任务上已经取得了 SOTA 性能,但它在 NER 上的性能仍然明显低于监督基线。这是由于 NER 和 LLMs 这两个任务之间的差距:前者本质上是序列标记任务,而后者是文本生成模型。在本文中,我们…

【大数据】—双均线策略(移动平均线)

声明:股市有风险,投资需谨慎!本人没有系统学过金融知识,对股票有敬畏之心没有踏入其大门,今天用另外一种方法模拟炒股,后面的模拟的实战全部用同样的数据,最后比较哪种方法赚的钱多。 量化交易…

《2024云安全资源池 能力指南》

《2024云安全资源池 能力指南》这份报告不仅梳理了云安全资源池的发展历程,还深入探讨了其在当前云计算环境下的重要性和必要性。报告详细分析了云安全资源池的市场需求、技术架构、关键技术以及行业应用案例,为政企用户提供了全面的云安全解决方案。通过资料收集、问卷调研、企…

Unity | Shader基础知识(番外:模型的制作流程)

目录 一、前言 二、模型的诞生 三、模型的表面 四、模型的贴图 五、上完材质的模型 六、材质的来源 七、作者的碎碎念 一、前言 up发现,初学程序,除非你是美术,模型出生,要不然对这些都是萌萌哒(蒙蒙哒&#x…

从宏基因组中鉴定病毒序列(2)

Introduction 在环境微生物学和生态学研究中,宏基因组学(Metagenomics)技术的应用已经彻底改变了我们对微生物群落的理解。宏基因组学通过对环境样本中的全部遗传物质进行测序和分析,可以全面揭示微生物群落的组成、功能和相互作…

Modbus转Profibus网关在汽车行业的应用

一、前言 在当前汽车工业的快速发展中,汽车制造商正通过自动化技术实现生产的自动化,目的是提高生产效率和减少成本。Modbus转Profibus网关(XD-MDPB100)应用于汽车行业,主要体现在提升自动化水平、优化数据传输以及实…

刷题之小欧的平均数(卡码网)

小欧的平均数 这道题不看解析的话完全没有思路&#xff0c;连题目都没读明白&#xff0c;甚至看了评论答出来了还是不知道为什么&#xff0c;有知道的朋友可以教教我 #include<iostream> using namespace std;int main() {int x,y,z;cin>>x>>y>>z;//…

【机器学习 复习】第10章 聚类算法

一、概念 1.聚类 &#xff08;1&#xff09;是无监督学习&#xff0c;其实无监督学习就是无中生有&#xff0c;不给你标准答案&#xff08;标签啊啥的&#xff09;&#xff0c;然后让你自己来。 &#xff08;2&#xff09;聚类就是这样&#xff0c;让机器自己根据相似特征把相…

怎么将图片压缩调小?在线压缩图片的4种快捷方法

压缩图片是日常很常用的一个图片处理功能&#xff0c;现在拍摄和制作的图片都比较大&#xff0c;在使用时经常会受到影响。在遇到无法上传、传输过慢的问题时会降低工作效率&#xff0c;所以掌握一招快速压缩图片是非常重要的。通过下面这篇文章来给大家介绍一下在线图片压缩的…

Flutter ffi Failed to lookup symbol

iOS release版本&#xff0c;解决方式参考官方文档&#xff1a;在 iOS 中使用 dart:ffi 调用本地代码 如果debug版本也报这个错误&#xff0c;很可能是有多个.c文件&#xff0c;编译的时候没带上&#xff01; 假设你的ffi模块名字是 c_lib 对于Android端&#xff0c;需要修改…

基于Pytorch框架构建AlexNet模型

Pytorch 一、判断环境1.导入必要的库2.判断环境 二、定义字典1.定义字典 三、处理图像数据集1.导入必要的模块2.定义变量3.删除隐藏文件/文件夹 四、加载数据集1.加载训练数据集2.加载测试数据集3.定义训练数据集和测试集路径4.加载训练集和测试集5.创建训练集和测试集数据加载…