机器语言编写helloworld

kvmtool下载编译

git clone https://github.com/kvmtool/kvmtool.git 下载后进入到目录执行make即可。

补码

计算机怎么表示负数?以四位有符号数为例,使用高位作为符号位,最高位为0表示正数,为1表示负数,其余三位用来表示值。在计算机中,我们将这种表示方式称为原码。例如:

十进制二进制十进制二进制
20010-21010

使用原码表示时,数字0有两种编码:0000和1000。因此,如果使用原码,在设计系统时就需要额外的电路区分+0和-0更糟糕的是如果一个数的正数相加应为0,2 - 2为例:2 - 2 = 2 + (-2) = 0010 + 1010 = 1100 = -4 这明显不对,也就是说,原码不能正确计算减法。怎么办呢?聪明的人类发现使用补码表示数字就可以加减法了。

即:正数的反码和补码都是原码,负数的反码是除符号位以外按位取反,补码是在反码基础上+1。使用补码重新计算 2 - 2:2 + (-2) = 0010 + 1110 = 0000

ASCII码

计算机用高低电平分别表示0和1,所有的数据在存储和运算时都要使用二进制表示,如果我们想用数字表示文本,就要对每一个文本进行编码,目的就是文本转换成数值。具体用哪些二进制是数字表示哪个符号,美国国家标准协会制定了美国信息交换标准代码(American Standard Code for Information Interchange)简称ASCII。ASCII使用8位编码,最多可以表示256个字符,hello world使用的编码就是为:68 65 6C 6C 6F 77 6F 72 6C 64

写外设指令

操作码指令描述
EEout DX,AL将寄存器AL中的字节输出到寄存器DX中的I/O端口地址

第一列为操作码,第二列为汇编语法描述的指令,第三列是指令意义的详细描述。从描述中我们可以得到,EE操作码它会自动到寄存器AX中读取源操作数,到寄存器DX中读取目的操作数。out为操作码的助记符,AL为8位寄存器,DX是16位寄存器,ASCII码是8位的,串口的地址0x3F8(IBM计算机外设地址)是需要使用16位的表示的。

根据写串口指令的格式,我们的程序流程细化为:在执行EE命令前,将串口地址0x3F8存入寄存器DX,将字符存入寄存器AL。

准备源操作数

由out指令可见,在运行指令之前需要将字符A存储到寄存器AL中。x86提供了数据复制指令mov,用于将数据从原操作数复制到目的操作数。原操作数是一个8位立即数,目的操作数是r8,表示一个8位寄存器。

操作码指令描述
B0+rbmov r8,imm8将一个8位立即数复制到一个8位寄存器

指令编码为(B0+rb)ib。根据x86手册,其中rb表示使用操作码的低三位编码目的操作数,即将目的操作寄存器r8的编码嵌入操作吗的低三位。寄存器AL对应的编码为0,因此B0+rb最终编码为B0。

指令编码中的ib对应原操作数,其中i表示立即数,b表示立即数的宽度是一个字节。所以,ib表示跟在操作码之后的是一个8位立即数,和字符对应的ASCII码组合最终(B0+rb)ib的编码分别为:B068 B065 B06C B06C B06F B077 B06F B072 B06C B064。

准备目的操作数

我们需要将串口地址写到寄存器DX中,实质是将一个16位立即数复制到一个16位寄存器, 这显然还是一个数据复制操作

操作码指令描述
B8+rwmov r16,imm16将一个16位立即数复制到一个16位寄存器

这个格式mov指令也接受两个操作数,只不过是16位的。指令编码中的rw表示使用操作码的低三位编码目的操作数,即将目的操作寄存器r16的编码嵌入操作码的低三位。根据x86手册,寄存器DX对应的编码为2,因此B8+rw编码为BA。

指令编码的iw中的i表示立即数,w表示立即数的宽度是一个字,即两个字节。所以iw表示跟在操作码之后的是一个16位立即数,这里即串口地址。不过x86处理器使用小端模式,所以最终(B8+rw)iw的编码为BAF803。

跳转指令

我们的程序循环向串口输出字符串helloworld,在向串口输出后,需要跳转到程序开始的位置,因此需要一个跳转指令jmp,格式如下。

操作码指令描述
EB cbjmp rel8跳转到指令指针+rel8的位置

jmp指令后接一个rel8。rel是relative的缩写,表示相对的意思,8代表8位,因此可以跳转到相对这条指令-128~127的范围。在指令编码中操作码EB之后“cb”就是这个8位的相对偏移。

如果我们想让指令指针指向程序开头,即B0所在的内存地址,那么jmp需要向后跳转35个字节。因为是向后跳转,所以是-35,又因为计算机中使用的是补码,所以我们需要转换一下,根据原码转补码的规则-35的原码是10100011,补码就为11011101,使用16进制表示,即DD。

至此,我们就完成了这段程序的机器语言编码:

ba f8 03
b0 68
ee
b0 65
ee
b0 6c
ee
b0 6c
ee
b0 6f
ee
b0 77
ee
b0 6f
ee
b0 72
ee
b0 6c
ee
b0 64
ee
eb dd

创建程序文件

我们使用vim以二进制模式打开一个文件,vim -b hello_world.bin。按i进入插入模式,然后输入我们的代码
。输入完成后,按下ESC返回标准模式。在标准模式下按下“:”键,进入命令行模式。在“:”的后面输入将16进制转为二进制命令:

:%! xxd -p -r

"%"表示整个文件内容,”%!“一起使用表示将整个文件内容作为后面xxd的输入,然后使用xxd从16进制转为二进制的输出替换整个文件内容。-p 表示不需要任何格式,-r意为反过来。最后输入:“wq”保存退出

使用kvmtool运行程序

sudo kvmtool/lkvm run -c 1 -k hello_world.bin

在这里插入图片描述

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

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

相关文章

基于SSM远程同步课堂系统

基于SSM远程同步课堂系统的设计与实现 摘要 在这样一个网络数据大爆炸的时代,人们获取知识、获取信息的通道非常的多元化,通过网络来实现数据信息的获取成为了现在非常常见的一种方式,而通过网络进行教学,在网络上进行远程的课堂…

【软考】数据流图的设计原则

目录 1. 数据守恒原则2. 守恒加工原则3. 外部实体与外部实体之间不存在数据流4. 外部实体与外部存储之间不存在数据流5. 数据存储与数据存储之间不存在数据流6. 父图与子图的平衡原则7. 数据流与加工有关,且必须经过加工8.例题8.1 例题1 1. 数据守恒原则 1.输入与输…

嵌入式linux学习之opencv交叉编译

1.下载opencv源码 OpenCV官方源码下载链接为https://opencv.org/releases/,选择3.4.16版本下载。放在ubuntu系统~/opencv文件夹中,解压缩,opencv文件夹中新建build和install文件夹用于存放编译文件和安装文件: 2. 安装编译工具…

ES的RestClient相关操作

ES的RestClient相关操作 Elasticsearch使用Java操作。 本文仅介绍CURD索引库和文档!!! Elasticsearch基础:https://blog.csdn.net/weixin_46533577/article/details/137207222 Elasticsearch Clients官网:https://ww…

MD5 计算 (下一代加密辅助类, Win32, C++)

CCNGHelper.h #pragma once #include <string> #include <tchar.h> #include <windows.h> #include <bcrypt.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 下一代加密辅助类 // 客户端: Windows Vi…

Vue2(十二):Vuex环境搭建、Vuex工作原理、Vuex开发者工具、几个配置项、多组件共享数据、Vuex模块化

一、Vuex 1.概念 专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff08;use引入&#xff09;&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读&#xff0f;写&#xff09;&#xff0c;也是一种组件间通信的方式&…

阿里云优惠券领取方法大公开,省钱不再是难事

阿里云作为国内领先的云计算服务提供商&#xff0c;为广大用户提供了丰富的云产品和解决方案。为了吸引用户上云&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中最受用户欢迎的就是阿里云优惠券。那么&#xff0c;阿里云优惠券究竟是什么呢&#xff1f;我们又该如何领…

代码随想录第25天|216.组合总和III 17.电话号码的字母组合

216.组合总和III 216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 找出所有相加之和为 n 的 k 个数的组…

基于自动编码器的预训练模型方法模型预训练方法RetroMAE和RetroMAE-2

文章目录 RetroMAERetroMAE详情编码解码增强解码 RetroMAE-2RetroMAE-2详情编码[CLS]解码OT解码和训练目标向量表征 总结参考资料 RetroMAE RetroMAE 出自论文《RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder》&#xff0c;是一种针对于…

「MySQL」索引事务

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 索引&事务 &#x1f349;索引&#x1f34c;特点&#x1f34c;通过 SQL 操作索引&#x1f34c;底层数据结构 &#x1f349;事务&…

网络编程的学习1

网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输。 三要素 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识。 ipv4:采取32位地址长度&#xff0c;分成4组。 ipv6&#xff1a;采用128位地址长度&#xff0c;分成8组。 …

安卓SharedPreferences使用

目录 一、简介二、使用2.1 getSharedPreferences2.2 增加数据2.3 读取数据2.4 删除数据2.5 修改数据2.6 清除数据2.7 提交数据 一、简介 SharedPreferences是Android平台上一个轻量级的存储类&#xff0c;主要是保存一些常用的配置比如窗口状态&#xff0c;一般在Activity、重…

12.Python文件读写

文件是数据的载体&#xff0c;程序可以从文件中读取数据&#xff0c;也可以将数据写 入文件中&#xff0c;本章重点介绍如何在Python中进行文件读写。 1 打开文件 我们在使用文件之前要先将文件打开&#xff0c;这通过open&#xff08;&#xff09;函数实现。 open&#xff0…

JJJ:linux系统中第一个进程

以linux4.19内核linux系统中第一个进程。 执行shell指令 ps -ef 结果如下&#xff1a; xxxxxx-virtual-machine:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:55 ? 00:00:02 /sbin/init splash root …

【Web应用技术基础】CSS(4)——背景样式

第1题&#xff1a;背景颜色 .html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello World</title><link rel"stylesheet" href"step1/CSS/style.css"> </head><body>&…

词令蚂蚁庄园今日答案正确答案怎么获取查看蚂蚁庄园今天问题的正确答案?

词令蚂蚁庄园今日答案正确答案怎么获取查看蚂蚁庄园今天问题的正确答案&#xff1f; 1、打开「词令」关键词口令直达工具&#xff1b; 2、输入词令关键词直达口令「今日答案999」&#xff1b; 3、搜索直达词令蚂蚁庄园今日问题的正确答案&#xff1b; *注&#xff1a;词令蚂蚁…

【PythonGIS】Python实现批量导出面矢量要素(单个多面矢量->多个单面矢量)

可怜的我周六还在工作&#xff0c;已经很久没更新过博客了&#xff0c;今天正好有空就和大家分享一下。今天给大家带来的是使用Python将包含多个面要素/线要素的矢量批量导出单个要素的矢量&#xff0c;即一个要素一个矢量文件。之前写过多个矢量文件合并成一个矢量文件的博文&…

西南交大swjtu算法实验3.3|穷举法

1.实验目的 通过具体例子学习排列这种典型的穷举算法的求解过程以及程序框架&#xff0c;分析其算法的求解过程&#xff0c;以及如何设计穷举法解决实际问题。通过本实验&#xff0c;理解穷举法的特点以及实际应用中的局限性。 2.实验任务 有n (n>1&#xff09;个任务需要…

Visual Studio 2022 中VLD库如何安装

GitHub链接 Release v2.5.1 KindDragon/vld 点击可执行程序进行下载 点击可执行程序进行安装 双击打开 一直点击next即可完成安装&#xff08;不用在意安装路径&#xff0c;总共不到2MB&#xff09; 如果GitHub无法打开&#xff0c;可以私信我发你安装包直接安装

fpga_awb

色温: sesor原始图像中的白色如果不经AWB处理&#xff0c;在高色温(如阴天)下偏蓝&#xff0c;在低色温下偏黄。 引入白平衡算法 而AWB的核心就是调整图像色温&#xff0c;使得摄像头采集的图像更加真实&#xff0c;达到人眼观察的效果。 白平衡一般通过调节传感器输出图像RGB…