• 64位返回值
    • x86平台
    • ARM平台
  • 参数传递及加减运算
    • x86平台
    • ARM平台
  • 右移
    • x86平台
    • ARM平台
  • 32位数据转换为64位数据
    • x86平台
    • ARM平台

32位系统的通用寄存器GPR只能容纳32位数据,所以这种平台必须把64位数据转换为一对32位数据才能进行运算

64位返回值

#include <stdio.h>
uint64_t f()
{return 0x1234567890ABCDEF;
};

x86平台

32位系统用寄存器组合EDX:EAX回转64位值

_f procmov eax, -1867788817; 90abcdefHmov edx, 305419896; 12345678Hret 0
_f ENDP

ARM平台

ARM系统用寄存器组合R0:R1回转64位值,其中,返回值的高32位存器在R1寄存器,低32位存储在R0寄存器中。

||f|| PROCLDR r0, |L0.12|LDR r1, |L0.16|BX lrENDP
|L0.12|DCD 0x90abcdef
|L0.16|DCD 0x12345678

参数传递及加减运算

#include <stdint.h>
uint64_t f_add(uint64_t a, uint64_t b)
{return a + b;
}
uint64_t f_sub(uint64_t a, uint64_t b)
{return a - b;
}
uint64_t f_add_test(uint64_t a, uint64_t b)
{#ifdef __GNUC__printf("%lld\n",f_add(12345678901234, 23456789012345));
#elseprintf("%I64d\n",f_add(12345678901234, 23456789012345));
#endif
}

x86平台

_f_add:mov eax, DWORD PTR [esp+12]mov edx, DWORD PTR [esp+16}add eax, DWORD PTR [esp+4]adc edx, DWORD PTR [esp+8]ret
_f_sub:mov eax, DWORD PTR [esp+12]mov edx, DWORD PTR [esp+16}sub eax, DWORD PTR [esp+4]abb edx, DWORD PTR [esp+8]ret
_f_add_test:sub esp, 28mov DWORD PTR [esp+8], 1972608889mov DWORD PTR [esp+12], 5461mov DWORD PTR [esp], 1942892530mov DWORD PTR [esp+4], 2874call _f_addmov DWORD PTR [esp+4], eaxmov DWORD PTR [esp+8], edxmov DWORD PTR [esp], OFFSET FLAT:LCOcall _printfadd esp, 28ret

1、参数传递:每个64位参数被拆分为2个32位数据,高32位数据先入栈,低32位后入栈(即:在内存中,高32位数据在前,低32位在后)。
2、加减法运算:进行加减运算分步进行,先对低32位进行运算,后对高32位进行运算。

ARM平台

f_add PROCADDS r0,r0,r2ADC r1,r1,r3BX lrENDPf_sub PROCSUBS r0,r0,r2SBC r1,r1,r3BX lrENDPf_add_test PROCPUSH {r4,lr}LDR r2, |L0.68|LDR r3, |L0.72|LDR r0, |L0.76|LDR r1, |L0.80|BL f_addPOP {r4,lr}mov r2, r0mov r3, r1ADR r0, |L0.84|B __2printfENDP
|L0.68|DCD 0x75939f79
|L0.72|DCD 0x00001555
|L0.76|DCD 0x73ce2ff2
|L0.80|DCD 0x0000b3a
|L0.84|DCD "%I64d\n",0

1、参数传递:每个64位的参数被拆分为2个32位数据,分别存储在R0(第一参数低32位)、R1(第一参数高32位)、R2(第二参数低32位)、R3(第二参数高32位)中,如果寄存器不满足输入参数,则拆分成两个32位数据,高32位数据先入栈,低32位后入栈。
2、加减法运算:进行加减运算分步进行,先对低32位进行运算,后对高32位进行运算。

右移

#include 《stdint.h>
uint64_t f(uint64_t a)
{return a >> 7;
};

x86平台

_f:mov edx, DWORD PTR [esp+8]mov eax, DWORD PTR [esp+4]shrd eax, edx, 7shr edx, 7ret

位移运算:第一步处理低32位数据,第二步处理高32位数据,其中SHLD和SHRD是双精度左(右)移位指令,将目的操作数移动指定位数,移动形成的空位由源操作数的高(低)位填充,SHLD(SHRD) dest, source, count

ARM平台

||f|| PROCLSR r0, r0, #7ORR r0, r0, r1, LSL #25LSR r1, r1 #7BX lrENDP

ARM把64位移位拆分位移位和或运算,进行等效处理

32位数据转换为64位数据

#include <stdint.h>
int64_t f(int32_t a)
{return a;
};

x86平台

_a$ = 8
_f PROCmov eax, DWORD PTR _a$[esp-4]cdqret 0
_f ENDP

CDQ指令进行有符号数的格式转换(无符号数的转换过程较为直接),把EAX的值扩展为64位,将结果EDX:EAX寄存器中,也就是说,CDQ指令获取EAX寄存器中的符号位(最高位),并按照符号位的不同把高32位都设计位0或1,与MOVSX指令相似。

ARM平台

||f|| PROCASR r1, r0, #31BX lrENDP

使用算术右移指令,会用符号位填补移位产生的空缺位,在生成64位值的时候,高32位应当存储在R1 寄存器里。

32位系统处理64位数据相关推荐

  1. 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

    原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表 我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的 ...

  2. phoronix-test-suite测试套件使用-树莓派32位系统 vs 64位系统下CPU性能对评测

    一直传闻64位系统性能更好,但到底好多少,一直也没个量化的标准,今天就来测试下树莓派4运行32位系统和运行64位系统下CPU的性能差异,注意这是测试对比CPU性能,并非测试系统性能,两个之间还是有差异 ...

  3. 【32位系统与64位系统可访问内存的大小】

    64位系统究竟能支持多大内存? 1.理论计算 对较大存储数据的形象解释: 一卷磁带:200MB 一张CD光盘:500MB 一部广播级质量电影:1GB 一卷大型数字磁带:100GB 五万棵树制成的纸:1 ...

  4. 32位系统与64位系统各数据类型所占空间大小

    不同系统下各数据类型大小 数据类型 32位字节数 64位字节数 数据值范围 bool(布尔型) 1 1 ture(非0),false(0) char(字符型) 1 1 -128~127 unsigne ...

  5. 32位系统 和 64位系统 C 程序中 为什么 指针的内存大小的不一样

    以下均为自己猜想: 32位系统是因为有32根地址总线 ,64位系统由64根地址总线 所以从根本上有了32位和64位的系统的根本区别 指针就是地址,所不管什么类型的指针在32位的系统上,就是一个32位的 ...

  6. 64位计算机可以安装32位软件,【64位可以安装32位系统】64位安装32位的软件_64位系统改装32位系统...

    2017-12-05 16:46:37 浏览量:1233 系统可以在线安装吗?怎么安装?我们知道电脑都需要安装系统才能正常使用,安装系统多数是通过U盘或光盘安装,现在则出现了在线安装系统工具,可以帮助 ...

  7. [转载]32位系统与64位系统的区别(整合三篇写的比较好的文章)

    来源:鲁大师 作者:节能降温 连接:http://www.ludashi.com/html/20101028/1107.html 简单的说x86代表32位操作系统 x64代表64位操作系统.如果你的C ...

  8. c语言如何判定是32位系统还是64位系统

    32位和64位指的是操作系统的位数,映射到C语言中,最直观的就是指针类型占用的字节数. 1.32位系统: 地址占32位,所以指针类型同样占32位,即4字节. 2.64位系统: 地址占64位,所以指针类 ...

  9. oracle c 64位系统时间戳,64位系统时间的AOI 架构(64Bit Interpreted AOI)

    原标题:64位系统时间的AOI 架构(64Bit Interpreted AOI) 本文档目的: 有些客户需要在人机界面上显示SOE的时间戳,但是不利用报警事件里的控件来显示,有时候用的HMI还不是F ...

最新文章

  1. aidl实现进程间通信
  2. Java IO 体系(三):Reader与Writer
  3. 解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题
  4. 多线程 python tcp 图片_Python第四周之网络编程TCP (服务器/客户端; 线程下载图片;线程版服务器和客户端(单人、多人)) UDP...
  5. access转换成oracle,Access转Oracle工具
  6. 那些离开工业界,回归学术界的AI科学家们!
  7. 安装android sdk,后出现导出错误,提示命令行找不到解决方案
  8. 牛客16596 计算系数(排列组合)
  9. 简明Python教程学习笔记_1_基本
  10. CSU 1120 病毒
  11. 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
  12. 微软:SolarWinds 黑客的目标是受害者的云数据
  13. Linux中shell编程的for循环用法
  14. 计算机原理华东理工大学期末成绩查询,华东理工大学微机原理历年真题第十一章.ppt...
  15. Java中一个逐渐被遗忘的强大功能,强到你难以置信!
  16. 安卓扫描文字识别软件
  17. HihoCoder 1838 贪心
  18. Android baidu地图定位实现签到打卡功能(附源码)
  19. else用法的一个小细节
  20. 原创如何看机械硬盘SMART信息

热门文章

  1. 一个关于美工的面试题
  2. 瘟疫模拟——群体建模专题设计第一阶段
  3. java cookie 无法删除不了_java中无法删除cookie之解决
  4. 王小卤进驻电商年销过亿,挑战绝味与周黑鸭还差什么?
  5. Linux修改文件句柄数
  6. spring boot + spring mvc 原理解析
  7. 前端之文档流浮动以及定位
  8. 【Spring】第三课 Spring框架搭建MVC三层架构
  9. ElasticSearch学习宝典
  10. Vue生成带图片logo以及文字的二维码组件,可下载二维码为图片,附组件调用代码--核心qrcode