华为智能基座实验【计算机组成原理】

news2024/10/1 23:49:13

华为智能基座实验【计算机组成原理】

  • 前言
  • 推荐
  • 华为智能基座实验【计算机组成原理】
    • 1 课程介绍
      • 1.1 简介
      • 1.2 内容描述
      • 1.3 读者知识背景
      • 1.4 实验环境说明
    • 2 实验 1:hello-world 示例程序
      • 2.1 实验介绍
        • 2.1.1 关于本实验
        • 2.1.2 教学目标
        • 2.1.3 实验内容介绍
      • 2.2 实验任务操作指导
        • 2.2.1 创建示例程序源码
        • 2.2.2 思考题及答案
    • 3 实验 2:使用 C 语言代码调用汇编程序
      • 3.1 实验介绍
        • 3.1.1 关于本实验
        • 3.1.2 教学目标
        • 3.1.3 实验内容介绍
      • 3.2 实验任务操作指导
        • 3.2.1 创建示例程序源码
        • 3.2.2 进行编译运行
      • 3.3 思考题及答案
    • 4 实验 3:使用 C 语言代码内嵌汇编程序
      • 4.1 实验介绍
        • 4.1.1 关于本实验
        • 4.1.2 教学目标
        • 4.1.3 内容介绍
      • 4.2 实验任务操作指导
        • 4.2.1 创建示例程序源码
        • 4.2.2 进行编译
        • 4.2.3 进行运行
        • 4.2.4 思考题及答案
  • 最后

前言

2022-12-29 15:36:32

以下内容源自计算机组成原理
仅供学习交流使用

推荐

华为智能基座【计算机组成原理】

华为智能基座实验【计算机组成原理】

安装vim编辑器: yum install vim

安装gdb 编辑器: yum install gdb

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

1 课程介绍

1.1 简介

本手册适用于学习 ARM 平台汇编课程的学生进行实验练习,完成本实验手册后,您将能更加
充分理解 GNU ARM 汇编代码运行环境的搭建、配置及编译运行,掌握在华为鲲鹏云服务器
上进行环境配置。

1.2 内容描述

本实验指导书通过在华为鲲鹏云服务器上,编译运行 3 个不同功能的示例程序。完成实验操
作后,读者会掌握基本的汇编程序编写,ARMv8 开发编译环境的配置以及加深对 ARM 平台
的了解。

1.3 读者知识背景

本课程为 ARM 平台汇编基础课程,为了更好地掌握本书内容,阅读本书的读者应首先具备以
下基本条件:

  • 具备基本的 Linux 命令能力。

1.4 实验环境说明

  • 华为鲲鹏云主机、openEuler20.03 操作系统;
  • 安装 gcc7.3+版本;
  • 每套实验环境可供 1 名学员上机操作。

在这里插入图片描述

2 实验 1:hello-world 示例程序

2.1 实验介绍

2.1.1 关于本实验

实现 ARM 平台精简指令集(RISC)编写的 hello-world 程序的编译和运行。

2.1.2 教学目标

掌握 GNU ARM 平台汇编代码的编写以及编译运⾏方式。

2.1.3 实验内容介绍

在本例子中,两次使用软中断指令 svc 来进行系统调用,系统调用号通过 x8 寄存器传递。在
第一次使用 svc 指令来在屏幕上打印一个字符串“Hello”:x0 寄存器用于存放标准屏幕输出
stdout 描述符 0,表明将向屏幕输出一些内容;x1 寄存器用于存放待输出的字符串的首地址
msg;x2 寄存器用于存放待输出字符串的长度 len;x8 寄存器用于存放系统功能调用号 64,
即 64 号系统功能即系统写功能 sys_write(),写的目标在 x0 中定义;svc #0 表示是一个系统
功能调用。

第二次使用 svc 指令来退出当前程序:x0 寄存器用于存放退出操作码 123,不同的退出操作
码将对应不同的退出操作;x8 寄存器用于存放系统功能调用号 93,即 93 号系统功能即系统
退出功能 sys_exit(),退出操作码在 x0 中定义;svc #0 表示是一个系统功能调用。
注意:像这种系统功能调用的方式和功能号,都是基于 Arm64 处理器体系结构以及之上所运
行的 linux kernel 甚至 BIOS 来共同支持,而不仅仅是 Arm64 架构自身所能完成的。
在.data 部分,加载 msg 和 len 实际上使用的是文字池的方法,即将变量地址放在代码段中不
会执行到的位置(因为第二次使用 svc 指令来退出当前程序之后,是不可能将 svc #0 指令之
后的内容来当做指令加以执行的),使用时先加载变量的地址,然后通过变量的地址得到变量
的值。

本代码是 Aarch64 体系结构的汇编代码,需要在 ArmV8 处理器上运行。寄存器 Xn 都是
Aarch64 体系结构中的寄存器,svc 是 Aarch64 体系结构中的指令。

2.2 实验任务操作指导

2.2.1 创建示例程序源码

以下步骤以在华为鲲鹏云服务器上执行为例。

步骤 1 创建 hello 目录
执行以下命令,创建 hello 目录,存放该程序的所有文件, 并进入 hello 目录。

mkdir hello
cd hello

步骤 2 创建示例程序源码 hello.s
执行以下命令,创建示例程序源码 hello.s。

vim hello.s

代码内容如下:

.text
.global tart1
tart1:
	mov x0,#0
	ldr x1,=msg
	mov x2,len
	mov x8,64
	svc #0
	
	mov x0,123
	mov x8,93
	svc #0
.data
msg:
	.ascii "Hello World!\n"
len=.-msg

在这里插入图片描述


在这里插入图片描述


步骤 3 进行编译运行
保存示例源码文件,然后退出 vim 编辑器。在当前目录中依次执行以下命令,进行代码编译
运行。

as hello.s -o hello.o
ld hello.o -o hello
./hello

在这里插入图片描述


在这里插入图片描述


通过上述代码运行,可以看出,编写的 hello-wolrd 示例程序已经在华为鲲鹏云服务器上通过
编译和运行,并成功输出结果。

2.2.2 思考题及答案

  • 思考下同样的代码在 X86 平台能否运行,为什么?
    参考答案:
    不能,因为 X86 平台使用的是复杂指令集(CISC),而我们实验中使用到的华为鲲鹏云服务器
    是基于 ARM 平台的,使用的是精简指令集(RISC),二者的汇编指令差异较大。

3 实验 2:使用 C 语言代码调用汇编程序

3.1 实验介绍

3.1.1 关于本实验

实现 ARM 平台上通过 C 语言源码来调用汇编源码中的代码。

3.1.2 教学目标

掌握在 ARM 平台上使用 C 语言源码来调用汇编源码的方法。

3.1.3 实验内容介绍

该汇编代码是针对 Aarch64 架构的。在汇编程序中,用.global 定义一个全局函数 strcpy1,
然后该函数就可以在 C 代码中用 extern 关键字加以声明,然后直接调用。

3.2 实验任务操作指导

3.2.1 创建示例程序源码

以下步骤以在华为鲲鹏云服务器上执行为例。
步骤 1 创建目录
执行以下命令,创建 called 目录存放该程序的所有文件, 并进入 called 目录。

mkdir called
cd called

步骤 2 创建 globalCalling.c 源代码
执行以下命令,创建示例调用 C 语言程序源码 globalCalling.c。

vim globalCalling.c

代码内容如下:

/* globalCalling.c*/
#include <stdio.h>
extern void strcpy1(char *d, const char *s);
int main()
{
	 const char *srcstring="Source string";
	 char dststring[]="Destination string";
	 printf("Original Status: %s %s\n",srcstring,dststring);
	 strcpy1(dststring,srcstring);
	 printf("Modified Status: %s %s\n",srcstring,dststring); 
	 return 0;
}

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

步骤 3 创建 globalCalled.S 源代码
执行以下代码命令,创建被调用的汇编语言程序源码 globalCalled.S。

vim globalCalled.S

代码内容如下:

/* globalCalled.S */
.global strcpy1
# Start the function: strcpy1
strcpy1:
LDRB w2,[X1],#1
STR w2,[X0],#1
CMP w2,#0 //ascii code "NUL" is the last character of a string;
BNE strcpy1
RET

在这里插入图片描述


在这里插入图片描述


3.2.2 进行编译运行

保存示例源码文件,然后退出 vim 编辑器。在当前目录中依次执行以下命令,进行代码编译
运行。

gcc globalCalling.c globalCalled.S -o called
./called

在这里插入图片描述


在这里插入图片描述


通过上述代码运行,可以看出,编写的使用 C 语言代码调用汇编程序已经在华为鲲鹏云服务
器上通过编译和运行,并成功输出结果:
Original Status: Source string Destination string
Modified Status: Source string Source string

3.3 思考题及答案

  • 除了使用调用汇编脚本的方式,还有哪些方法可以使用 C 语言调用汇编代码?
    参考答案:
    可以使用 C 语言中的 asm 关键字来在 C 语言源码中嵌入汇编代码。

4 实验 3:使用 C 语言代码内嵌汇编程序

C语言实现反汇编【微机原理】

4.1 实验介绍

4.1.1 关于本实验

实现在 ARM 平台上通过 C 语言代码内嵌汇编代码的方式,将一个整数类型值,以字节为单位
从小尾端转到大尾端或者相反的功能。

4.1.2 教学目标

掌握在 ARM 平台上实现 C 语言代码中内嵌汇编代码的方法。

4.1.3 内容介绍

通过 C 语言代码内嵌汇编代码,将一个整数类型值,以字节为单位从小尾端转到大尾端或者
相反的功能。例如小尾端时 32bit 整数值用 16 进制表示为 0x12345678,将其以字节为单位
转换为大尾端存储后,该值为 0x78563412。

4.2 实验任务操作指导

4.2.1 创建示例程序源码

以下步骤以在华为鲲鹏云服务器上执行为例。
步骤 1 创建目录
执行以下命令,创建 builtin 目录存放该程序的所有文件, 并进入 bulitin 目录。

mkdir builtin
cd builtin

步骤 2 创建 C 语言内嵌汇编程序源代码
执行以下命令,创建 C 语言内嵌汇编程序源码 globalBuiltin.c。

vim globalBuiltin.c

代码内容如下:

/* globalBuiltin.c*/
#include <stdio.h>
int main()
{
	int val=0x12345678;
	__asm__ __volatile__(
		 "mov x3,%1\n"
		"mov w3,w3, ror #8\n"
		"bic w3,w3, #0x00ff00ff\n"
		"mov x4,%1\n"
		"mov w4,w4, ror #24\n"
		"bic w4,w4, #0xff00ff00\n"
		"add w3,w4,w3\n"
		"mov %0,x3\n"
		:"=r"(val)
		:"0"(val)
		:"w3","w4","cc"
	);
	printf("out is %x \n",val);
	return 0;
}

在这里插入图片描述


在这里插入图片描述


4.2.2 进行编译

保存示例源码文件,然后退出 vim 编辑器。在当前目录中依次执行以下命令,进行代码编
译。
步骤 1 预处理

gcc -E globalBuiltin.c -o globalBuiltin.i

步骤 2 编译

gcc -S globalBuiltin.i -o globalBuiltin.s

步骤 3 汇编

gcc -c globalBuiltin.s -o globalBuiltin.o

步骤 4 生成可执行文件

gcc globalBuiltin.o -o globalBuiltin 

命令和生成的文件如下:
在这里插入图片描述


在这里插入图片描述


4.2.3 进行运行

运行生成的 globalBuiltin 文件,查看输出结果。
命令如下:

./globalBuiltin

结果如下:
在这里插入图片描述


在这里插入图片描述


通过上述代码运行,可以看出,编写的 C 语言代码内嵌汇编程序已经在华为鲲鹏云服务器上
通过编译和运行,并成功输出结果:out is 78563412。

4.2.4 思考题及答案

  • 在 C 代码中内嵌的汇编语句的基本格式为是什么?
    参考答案:
__asm__ __volatile__ (asm code”
:输出操作数列表
:输入操作数列表
:clobber 列表
)

说明:《汇编与接口技术》课程配套实验手册中的实验内容由北京交通大学计算机与信息技术
学院赵宏智老师提供,华为公司负责实验手册文档的编写。

最后

2022-12-29 16:50:48

这篇博客能写好的原因是:站在巨人的肩膀上

这篇博客要写好的目的是:做别人的肩膀

开源:为爱发电

学习:为我而行

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

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

相关文章

宝宝多大戒尿不湿?不看年龄看表现,用对方法轻松戒掉尿不湿

宝宝刚出生的时候&#xff0c;大小便次数比较多&#xff0c;宝宝自己也控制不了。这时&#xff0c;使用尿布可以减少父母的大量工作。但使用尿布只是暂时的。当宝宝到了一定年龄&#xff0c;就应该戒掉。宝宝能戒尿多大&#xff1f;既然尿布是用来兜宝宝大小便的&#xff0c;如…

从零学习 InfiniBand-network架构(十一) —— 管理器的介绍

从零学习 InfiniBand-network架构&#xff08;十一&#xff09; —— 管理器的介绍 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;未经作者允许&#xff0c;禁止转载 &#x1f6a9;本专题部分内容源于《InfiniBand-network…

作为QA,我们要如何思考?

随着测试人员陆续开始尝试角色转变&#xff0c;坚守的QA需要找到自己的发展之路。兴趣和性格是客观因素&#xff0c;好奇心和发散性思维则是帮助成为优秀QA的必要因素。我想通过一些小的例子来与大家互动探讨。 测试你做对了吗&#xff1f; 让我们从这样一个现实中的小例子来…

【历史上的今天】12 月 30 日:C++ 之父诞生;Hotmail 创始人出生;Facebook 注册破百万

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 12 月 30 日&#xff0c;在 1930 年的这一天&#xff0c;“青蒿素之母”屠呦呦出生。2015 年 10 月 5 日&#xff0c;屠呦呦获得诺贝尔生理学或医学奖&#xf…

【Java基础知识】对Object类wait()和notify()方法的理解

wait()/notify()原理 当前线程必须拥有此对象的monitor监视器&#xff08;锁&#xff09;。&#xff08;不获取锁直接用Object对象调用wait和notify,会报错java.lang.IllegalMonitorStateException&#xff09;当前线程调用wait() 方法&#xff0c;线程就会释放此锁的所有权&a…

动态库和静态库

文章目录感性认识库动态库和静态库从库的设计者来看库制作静态库制作动态库库的使用者的角度静态库的使用使用动态库1.把头文件和库文件拷贝到系统的路径下2.修改对应的环境变量更改文件 ld.so.conf.d在系统的库路径下建立对应的软链接动态库如何加载感性认识库 首先&#xff…

关于GNSS关键性能测试,应该如何选择?

现在&#xff0c;GPS/GNSS信号无处不在&#xff0c;而GNSS接收机芯片的低成本和高性能也让在不同设备中安装GNSS接收机变得更为容易。然而&#xff0c;与此同时又存在一个问题&#xff0c;如果想将这些接收器芯片集成到一个设备或系统中&#xff0c;该如何对其进行全面的GNSS测…

方法注解@Bean与对象注入

1.类注解是添加到某个类上的&#xff0c;⽽⽅法注解是放到某个⽅法上的&#xff0c;如以下代码的实现&#xff1a; 注&#xff1a;方法注解一定要搭配类注解使用&#xff0c;否则会报错 2.重命名Bean 多个重命名&#xff0c;使用多个名称获取的对象都是同一个 3.获取 Bean 对象…

全网惟一面向软件测试人员的Python基础教程-在Python中列表是什么?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

TTL(RGB)接口液晶显示屏的调试方法

TTL接口的液晶显示屏一般会使用DE模式驱动它。首先需要CPU带有LCD控制器&#xff0c;能够产生出液晶显示屏所需要的以下几个信号&#xff1a; 1.时钟信号(DOTCLK) 2.行同步信号(HSYNC) 3.场同步信号(VSYNC) 4.DEN(数据允许信号) 6.数据信号&#xff08;R0-R7;G0-G7;B0-B7)…

第02讲:Git分支操作

一、什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于…

剑指 Offer 17. 打印从1到最大的n位数

题目 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。 思路 本题应该考虑的是大数问题&#xff0c;但是返回数组为int[]。。。所以两种方法都做一下 方法一&#xff1a;普通解法&#xff…

天翼云服务器性能评测,4H8G贵阳节点性能跑分

天翼云号称全球运营商云第一、中国公有云用户数第二、政务云公有云第一。那么天翼云服务器用起来到底怎么样呢&#xff1f; 目前&#xff0c;蓝队云这边一共有19个天翼云节点云服务器&#xff0c;覆盖全国多个核心省市及地区&#xff0c;节点选择的话一般就是按照就近原则。 …

权威报告出炉:2022年移动机器人出货量增长53%!2023年移动机器人迎来发展新拐点?

原创/文 BFT机器人 近日&#xff0c;全球权威研究机构Interact Analysis重磅发布移动机器人领域的“风向标”——《2022年移动机器人市场报告》&#xff08;The Mobile Robot Market 2022&#xff09;&#xff0c;深入探究真实市场数据&#xff0c;对全球移动机器人领域的发展现…

当压力传感器遇到汽车电子系统 智芯传感打造车规级智能感知传感器产品

汽车电子系统是汽车数字化的发端和基础&#xff0c;更是汽车智能化的前提。近年来&#xff0c;伴随着汽车电子技术的快速发展与应用&#xff0c;汽车电子系统在车辆控制精度、范围、适应性和智能化等方面&#xff0c;都实现了大幅优化提升。而压力传感器作为汽车电子系统的主要…

RHCSA 第五天笔记

用户和组管理 用户分为三类&#xff1a; 超级用户 root 普通用户 只能切换到自己有的用户 系统用户&#xff08;不常用&#xff0c;没办法登录&#xff09; 组分为两类 定义概念 基本组&#xff08;私有组&#xff09; 没指定所属组&#xff0c;系统建立和用户同名的组 附加…

诺依文件上传支持阿里云oss

文章目录描述后端引入依赖application.yml 添加访问oss需要的参数编写oss工具类编写controller前端更改调用接口![在这里插入图片描述](https://img-blog.csdnimg.cn/efc28eb8244e4da482d46327ab29a999.png)去掉baseUrl回调成功后url改成真实urlmain.js中挂在该组件具体调用代码…

华为手表开发:GT3(1)配置调试设备

华为手表开发&#xff1a;GT3&#xff08;1&#xff09;配置调试设备初环境与设备获取手表UUID登录 AppGallery Connect 点击用户与访问初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统&#xff1a;window 设备&#xff1a;HUAWEI WATCH 3 Pro 开发工具&…

自动化测试到底该怎么学?

从功能测试到自动化测试 &#xff0c;待遇翻倍&#xff0c;我整理的超全学习指南&#xff01; 首选你需要拥有一个全网最牛最全面的软件测试全职业生涯进阶从零基础到测试开发学习路线图。 其次跟着大纲的内容慢慢学习&#xff0c;当然配套的【教学视频配套的学习资料】肯定是…

代码随想录二刷day4 24.两两交换链表中的结点 19.删除链表的倒数第n个结点 链表相交(环形链表)

二刷复习 文章目录二刷复习24.两两交换链表中的结点19.删除链表的倒数第n个结点链表相交环形链表224.两两交换链表中的结点 思路还是挺简单的&#xff0c;在纸上画一个图就行了 思考的过程&#xff1a; 1.我会思考需要用一个指针curr还是两个指针prev和curr&#xff0c;思考的…