纯x86汇编实现的多线程操作系统实践 - 第六章 AP1的用户进程

news2024/10/2 16:21:32

AP1用户进程的代码为task1.asm。

该用户进程将调用0x80系统中断在界面上显示一张BMP格式的图片。用户进程还使用了彩色转灰色技术,轮流显示该图片的彩色和灰色图。

代码解释如下:

调用0x39号系统中断,从300号扇区获得一个扇区的数据(512字节)到缓冲区buff中。一张32位色彩模式的BMP图片顺序的保存在硬盘上,300号扇区为图片数据的起始扇区。

BMP图片的格式如下:

其中,14字节的文件头部格式如下:

40字节的位图信息头格式如下:

更详细的解释可参考:https://www.cnblogs.com/kn-zheng/p/17001257.html

获取文件头中的文件长度,保存在pic_data_size中。再从位图信息头中获取图片的宽度,保存在pic_wide_size中。跳过54字节的BMP文件头(BMP文件头+位图信息头),直接就是BMP文件的位图数据(直接使用的是32位的色彩位图,BMP文件中没有调色板,文件头后直接跟32位的位图数据)。将buff缓冲区中的位图数据,以及位图数据长度作为参数,调用_draw_pic函数,显示图片的一部分。我们需要调用多次_draw_pic函数来逐步显示整张图片。

调用0x38号系统中断,用户进行将等待10ms后再继续执行。(由于连续读取硬盘扇区会导致VirtualBox重启,只能每次读取一个扇区的数据后,暂定一段时间)

当前读取的扇区号加一,然后读取下一个扇区的数据到buff缓冲区中。

pic_this_size记录本次调用_draw_pic显示图片时,传入数据的长度。pic_data_size记录图片还有多少位图数据未被显示。首先检测pic_data_size数据的长度,如果已经小于512字节,就将pic_this_size的值改为pic_data_size;否则每次用于显示的位图数据的长度都为512字节。

调用_draw_pic函数,显示图片。

剩余的位图数据长度减去本次用于显示的数据长度,如果图片所有位图数据都显示完毕,则跳转到_sleep处,等待1秒钟后,再一次从头开始显示图片;否则跳转到_disk_read处,继续读取下一个扇区,进行图片的显示。

执行到这里,说明图片的所有数据已经显示完毕,等待1秒钟。

复位各变量,如保留图片数据的起始扇区,图片左下角的X轴、Y轴等,其中,pic_color_fix标记用于告诉_draw_pic函数,显示彩色图片还是灰色图片。然后跳转到_again_and_again,开始重新显示图片。

下面介绍_draw_pic函数,该函数真正在界面上显示图片。

首先判断上一次调用_draw_pic函数时,是否还留下2字节的数据未显示。由于BMP文件的头部为54字节,一个扇区为512字节,一个RGB点需要4字节来保存色彩,这导致每次调用_draw_pic显示一个扇区的数据时,总会留下2字节的数据未显示。因此,tmp_data_size总等于2。

在这里,只要tmp_data_size不为0,本次显示的数据长度增加2,同时保留数据的缓冲头部往前移动2字节,再将tmp_data_size清零。这里为什么直接将保留数据的缓冲头部往前移动2字节?原因是每次剩下的未显示的2字节数据都被_draw_pic保留到tmp_data开头的2字节的缓冲区中,而tmp_data正好被放在buff这个缓冲区的前面2字节处,正好跟新读取的图片数据连在了一起…

如果剩余数据的长度小于等于2,就跳出_draw_pic函数。

这里在为调用0x80号中断,显示一个点做准备:x_coordinate为显示点的X轴,y_coordinate为显示点的Y轴,edx中保留本次要显示的32位色彩。再判断pic_color_fix的奇偶性,为奇数,就调用_color_to_gray函数,将本次要显示的点的颜色变为灰色。

调用0x80号系统中断,显示一个点。之后数据长度减4,数据指针加4,指向后一个点的32位颜色数据。

显示点的X坐标右移一位。判断本行是否已显示完毕。若是,下一个显示点的X坐标返回到预设值(就是图片左下角的X坐标),Y坐标减一,开始显示上一排的点。(由于大部分BMP文件都是倒向位图,如果按照从左往右从上往下的顺序进行点的显示,最终得到的是一张倒图。因此需要从下往上倒过来进行显示)

这里跳回_draw_pic_0处,继续从缓冲区获取下一个点的颜色数据,然后显示。

执行到这里,说明缓冲区中剩下的数据已经小于等于2。先判断数据长度是否为0,若是,说明图片的数据已经全部显示,退出_draw_pic函数;否则,将本次未显示的2字节数据保存到tmp_data缓冲区中,并置tmp_data_size为2,提醒还有2字节数据需要显示。

最后是_color_to_gray函数,该函数是将一个彩色点转变为灰色点,具体的公式是:Gray= 0.2989 * R + 0.5870 * G + 0.1140 * B。函数简单,这里就不再进行讲解。

task1.asm源代码地址:https://download.csdn.net/download/hanspruce_bird/87502149

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

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

相关文章

【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明身高排序题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:ht…

每日学术速递2.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.FiTs: Fine-grained Two-stage Training for Knowledge-aware Question Answering 标题:FiTs:用于知识感知问答的细粒度两阶段训练 作者:Qichen…

JavaWeb JavaBean,MVC三层架构

9、JavaBean 实体类 JavaBean有特定的写法: 必须要有一个无参构造属性必须私有化必须有对应的get/set方法; 一般用来和数据库的字段做映射 ORM; ORM :对象关系映射 表—>类字段–>属性行记录---->对象 people表 …

Qt 小项目 图片浏览系统

引言 本系统支持,自动播放,左右拖动切换,点击列表切换,点击按钮切换;是一个标准的图像浏览软件。 Windows 图片浏览器,可以查看当前文件夹下的图片,往上翻、往下翻并且自动播放; …

这只乌龟,当然离不开函数了!

什么是函数?函数就是执行特定任务和以完成特定功能的一段代码为什么需要函数?复用代码隐藏实现细节提高可维护性提高可读性便于调试函数的创建def 函数名 ([输入参数]) :函数体[return xxx]函数名需要遵循字母、数字、下划线# 这里的a,b是形式…

03 流程控制

3.1 条件判断3.2 循环控制3.3 中断循环 3.1 条件判断 if 条件判断 :单分支(if)、双分支(if…else…)、多分支(if … else if … else)Switch(Scala并没有 switch,用的是…

2023年鞋服配饰行业如何玩转全域经营?

2023年,鞋服配饰行业私域已进入深水区,这就对私域运营提出了更高的挑战和目标,企业纷纷发力以私域为基石、以消费者为核心的全域经营。 不过,虽然鞋服配饰行业私域起步早,玩法多。但在迈向全域经营的过程中&#xff0…

全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…

聚合效度全流程

聚合效度分析流程如下: 一、聚合效度定义 聚合效度(convergent validity),又称收敛效度,是指测量同一变量的测量项会落在同一因子上,强调本应该在同一因子下的测量项,确实在同一因子下。即一个…

基于nodejs+vue地方特色的风景文化宣传网站vscode

管理员可以根据系统给定的账号进行登录,登录后可以进入木里风景文化管理平台对木里风景文化所有模块进行管理。包括查看和修改自己的个人信息以及登录密码。 该系统为每一个用户都分配了一个用户账号,用户通过账号的登录可以在系统中查看木里风景文化信息…

怎么依靠网络赚钱,网上可以做什么副业

如今,网上赚钱已经成为许多人职业生涯的选择之一。网上有很多可靠的兼职,让你在家里轻松赚钱。今天给大家推荐五份可靠的网上兼职。一、怎样选择可靠的网络兼职可靠的网络兼职一般是指在家通过网络平台完成兼职任务,完成任务后即可获得报酬。…

JVM中TLAB(Thread Local Allocation Buffer)+逃逸分析

1、为什么有TLAB(Thread Local Allocation Buffer)堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地…

java地图导出——添加经纬线

概述 前面的文章Node实现切片的拼接和地图的导出和Java实现地图的导出分别讲述可如何在node和java中实现切片的拼接以及地图的导出。本文,书接前文,实现java导出时经纬度的添加。 实现后效果 实现 完整的实现思路流程如下图: 1. 根据切片…

什么是Makefile?如何编写Makefile?

🥇今日学习目标:什么是Makefile?如何编写Makefile? 🤵‍♂️ 创作者:JamesBin ⏰预计时间:10分钟 🎉个人主页:嵌入式悦翔园个人主页 🍁专栏介绍:L…

RabbitMQ实现死信队列

目录死信队列是什么怎样实现一个死信队列说明实现过程导入依赖添加配置编写mq配置类添加业务队列的消费者添加死信队列的消费者添加消息发送者添加消息测试类测试死信队列的应用场景总结死信队列是什么 “死信”是RabbitMQ中的一种消息机制,当你在消费消息时&#…

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义,就是栈内的元素是单调的。根据栈内元素的单调性的不同,可以分为: 单调递增栈:栈内元素是单…

LeetCode 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

为什么前序和中序或者中序和后序,两两组合能构建一个二叉树? 因为前序和后序可以确定根,而中序可以划分出左右区间。 文章目录从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树从前序与中序遍历序列构造二叉树 难度 中等 题目链…

基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …

TS泛型,原来就这?

一、泛型是什么?有什么作用? 当我们定义一个变量不确定类型的时候有两种解决方式: 使用any 使用any定义时存在的问题:虽然知道传入值的类型但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势 使用泛型 泛型…

记一次线上es慢查询导致的服务不可用

现象 某日线上业务同学反馈订单列表查询页面一直loding,然后提示请求超时,几分钟之后恢复正常 接到报障之后,马上根据接口URL,定位到了请求链路,发现是es查询超时,这里我们的业务订单表数据是由几百万的&a…