首页 > 编程语言 >程序的机器级表示

程序的机器级表示

时间:2024-04-24 20:26:27浏览次数:25  
标签:表示 int32 机器 int 程序 long return uint32 def

常数,变量和运算

一、常数

int f() { return 0x123; /* 291 */ }
int g() { return -1; }
int h() { return 0x1234; /* 4660 */ }
int i() { return 0xbb8; /* 3000 */ }

在C中看这些常数如何被装入计算机中,首先看0x123,十进制表示为291,正好可以被addi的立即数表示,反汇编结果如下:
image
而return -1也是如此,1也可以用立即数表示,0xfff表示-1,可以通过一条addi指令表示出来。
image
0x1234超过12位立即数表示范围了。所以通过lui和addi一起来操作。lui装入0x1,放在高20为,然后再用addi装载剩余的234,
image
0xbb8也是要分成前后两端分别装入。这里要注意,我们的addi立即数并没办法满足0xbb8的大小,而lui的0x1(4096)又大于0xbb8,所以我们只能进行负数操作,先用lui加载一个高20位的1(4096),而后用addi加载个负数,最后得到0xbb8.
image
结论:
image

而对于64位的常数在RV64装入来说:

long long j() { return 0x1234567800000000; }
long long k() { return 0x1234567887654321; }

对于long j()来说:
通过li addi
先把先前非0的装载到a0中,a0 = (0x12345678 >> 3)
而后通过后续指令 -> a0 = a0 << 35;
image

对于long k()来说:
对于一个复杂的64为常数,编译器直接把它放到内存中,其中LC0就是0x123456...的十进制表示。 ld a0,LC0 就是直接加载LC0寄存器的值。
image

image
在64位常数在RV32中的装入,只需要用两个32位寄存器联合存放一个64位数据。
变量的大小与对齐的具体规定实在RISCV的两套整数ABI中,其中RV32是在ILP32 ABI中定义,64位是在LP64 ABI定义的。
image
在变量分配过程中,把常用的放在寄存器中,寄存器在RV32中只有32个,其中内存的访问速度比较慢,但是容量非常大(8~32G)
image
所有变量都分配在内存空间,需要访问在读入寄存器。
对于程序的内存分布来说,分为静态数据取,堆区和栈区。
堆和栈是动态区,随着变量的增加而增加。其
其中全局变量分在data区,例如

#include <stdio.h>
#include <stdlib.h>
int g;
void f(int n) {
  static int sl;
  int l, *h = malloc(4);
  printf("n = %2d, &g = %p, &sl = %p, &l = %p, h = %p\n", n, &g, &sl, &l, h);
  if (n < 5) f(n + 1);
}
int main() { f(1); printf("===\n"); f(1); return 0; }

中的static int s1;就放在data区,int g也是全部变量,也放在data区。
非静态局部变量,也就是int l,就放在stack区。最后一类是动态变量,需要malloc就是动态分配的,也就是在堆区。
image
关于RV变量的访问,示例代码如下:

#define def(type, name) \
  volatile type name ## _a; \
  volatile type name ## _b; \
  void f_##name () { name ## _a = name ## _b; }

def(_Bool, _Bool)
def(char, char)
def(signed char, signed_char)
def(short, short)
def(unsigned short, unsigned_short)
def(int, int)
def(unsigned int, unsigned_int)
def(long, long)
def(long long, long_long)
def(void *, void_)
def(float, float)
def(double, double)
rv32gcc -O2 -S a.c
rv64gcc -O2 -S a.c

发现不同类型的变量访问指令:
image
对于变量分配不对齐,会降低访问效率:
不对齐即addr(n) % align(n) != 0, 如int变量分配在地址0x13

硬件支持不对齐访存: 电路更复杂, 且需要两个周期以上
软件支持不对齐访存: 抛异常, 效率很低

运算和指令
对于C运算符,RV指令有对应关系

+, -, *, /, % 	 add, sub, mul, div, rem
= 	         mv, 访存指令
&, |, ^ 	 and, or, xor
~ 		 xori r, r, -1
<<, >> 		 sll, srl, sra
! 		 sltiu r, r, 1
<, > 		 slt

而对于编译优化来说,之前我们在编译过程中常用的 -O

-O0 - 每次计算前先从内存读出变量, 每次计算后马上写回内存
-O1 - 开始计算前从内存读出变量, 计算过程在寄存器中进行, 计算全部结束后再写回内存
-O2 - 编译器直接把结果算好了

标签:表示,int32,机器,int,程序,long,return,uint32,def
From: https://www.cnblogs.com/ink-bai/p/18156210

相关文章

  • C# winform程序中 使用全局公有变量
    在winform项目中用于存用户名,权限的全局公有变量。如果采用登陆后在主窗体存储,每一次实例子窗体时,再传参过去。这种方法也行,就是有点太麻烦了。我采用的是 存储在 Program.cs文件中定义 全局公有变量方案。也有缺点但相对方便些。Program.cs文件usingSystem......
  • ZYNQ程序固化过程
    SDK跟vitis的不太一样,这边用正点原子的文档对比着记录一下。在固化程序到QSPIFLASH的时候,点击Xilinx然后programdevice。然后出现这种问题。点错了,应该是下面的programflash一开始也有点问题,后来重新创建工程编译之后就好了,能够从QSPIFLASH启动。SD卡的启动,正点原子文档......
  • XMU《UNIX 系统程序设计》第二次实验报告
    一、实验内容描述实验目的掌握与文件和目录树有关的系统调用和库函数。实验要求编写程序myfind命令语法myfind<pathname>[-comp<filename>|-name<str>...]命令语义(1)myfind<pathname>的功能除了具有与程序4-7相同的功能外,还要输出在<pathname>目录子树之下,文......
  • 03_微信小程序页面之间的数据通信
     1.父传值子,数据绑定:propertiesComponent({properties:{propA:{type:String,//传递的数据类型value:''//默认值},propB:Number//简化的定义方式}})<!--引用组件的页面模板--><view><costompropA="{{name}}&quo......
  • oracle连接数据库报错ORA-12541:TNS:无监听程序
    最近闲来无事修改了电脑的用户名,本来以为不会影响什么,后来发现oracle数据库连接不上了,报错如下图:查看服务发现确实停止了,启动也启动不起来了搜索NetManager查看配置, 发现配置里面是我修改前的电脑名,才发现问题所在,随后我又把电脑名称改回来了数据库才能正常连接修改用户......
  • 使用SSH从公网服务器简易使用内网任意机器服务,比如从外部下载代码
    如果有一个台外部的机器waibu-host,位于阿里云,腾讯云,亚马逊,azure云等等; 假设你想从这个waibu-host上访问公司任意服务,下载代码,访问http服务,等等,或者你机器上的服务,不需要额外工具,只要ssh反向就可以实现; 借个图,如下: 举个例子,如果你想从公司内部......
  • Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【JethroShen】问了一个Python谷歌驱动下载的问题。二、实现过程这里【Kim】和【Crazy】给了一个指导,如上图所示。说来奇怪,在链接中看了没有124版本的,以前找114、96版本的,每次屡试不爽,现在最新的浏览器,反而下载不......
  • 随机生成三百道四则混合运算题目程序
    22521362252130这位是一个程序,可以随机生成300道四则混合运算题目程序,并可以输入题号做题,输入答案后,程序会判定你做的是否对。点击查看代码publicclassOperation{publicstaticvoidmain(String[]args){List<String>validEquations=generateValidEqua......
  • 20231325 贾罗祁 实验三《Python程序设计》实验报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验三报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年4月17日必修/选修:公选课1.实验内容创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套......
  • 吴恩达机器学习-第二课-第四周
    吴恩达机器学习学习视频参考b站:吴恩达机器学习本文是参照视频学习的随手笔记,便于后续回顾。决策树决策树模型(DecisionTreeModel)猫分类示例通过决策树模型判断是否为猫一些术语:根结点,决策节点(包括根结点),叶子结点决策树算法是在所有的决策树模型中选一个效果很好的学......