Moving x86 assembly to 64-bit (x86-64)
While 64-bit x86 processors have now been on the market for more than 5 years, software support is only slowly catching on. 64-bit x86, or x86-64 as its inventors at AMD called it, not only offers programmers the ability to manipulate and address data in larger chunks, but added some other niceties like an additional 8 general purpose registers.
Transitioning assembly code from x86 to x86-64 is pretty straightforward, but there are some changes worth noting.
- Full 64-bit registers are prefixed with r. So for 64-bit operations, you use
rax
rather thaneax
,rdi
rather thanedi
and so forth. - The 8 new integer registers are labeled
r8, r9, ... r15
. To use only a part of the register, a suffix is added. 8-bits = b, 16-bits = w, 32-bits = d, meaningr8b, r8w and r8d
in the case ofr8
. - 32-bit operations on a register automatically zero out the upper 32-bits of that register. For instance, if you load 0 into
eax, rax
is guaranteed to be 0. - The C ABI and calling conventions are substantially different. On standard x86 (32-bit), arguments are passed on the stack. On x86-64, many of the arguments are passed via registers.
For Linux, the calling conventions are as follow:
Registers
rbp, rbx and r12 through r15
belong to the calling function. If the called function intends to modify them, it should save them at the beginning and restore them before returning. The caller must assume that all other registers can be changed by the called function.As in x86, integral return values are passed in
rax
. Parameters are trickier. The first 6 integral parameters are passed left-to-right, inrdi, rsi, rdx, rcx, r8 and r9
respectively. Remaining integral parameters are passed on the stack, but from right-to-left.p. 21 of the x86-64 ABI has a good explanation.
In Windows x64, the system is similar. Registers
rbp rbx, rdi, rsi and r12 through r15
belong to the calling function. All others belong to the called function. Return values are via rax. Input parameters are passed first inrcx, rdx, r8 and r9
(left to right). Remaining arguments are passed via the stack, right to left. pushad and popad
are gone. There are no 64-bit equivalent instructions. Presumably this is because with a greater number of registers, there should be no need to save and restore all registers when entering and exiting a function.cqo
is the newcdq
. For sign-extending fromeax to edx
(32 bit),cdq
was used. For sign-extendingrax
tordx, cqo
(convert-quad-to-oct) is used. It’s a handy little instruction, and not one that I managed to find easily.
Moving x86 assembly to 64-bit (x86-64)的更多相关文章
- 64位主机64位oracle下装32位客户端ODAC(NFPACS版)
64位主机64位oracle下装32位客户端ODAC(NFPACS版) by dd 1.下载Oracle Data Access Components(ODAC) Xcopy的两个版本: x86:(我 ...
- autoCAD 2008 Win7 64位, win8 64位 安装 燕秀工具箱 yanxiu.cui 文件下载
Win7 64位, win8 64位 安装 燕秀工具箱 , 提示没有权限. 网站上下载燕秀工具箱, 安装后. 提示权限不够. 解决办法如下; 1. CAD, 权限修改. 2. 下载 yanxiu.cu ...
- 利用Powerdesigner16.5(64位)连接64位oracle 配置系统odbc驱动
利用Powerdesigner16.5(64位)连接64位oracle逆向工程数据库 记录一次Powerdesigner通过odbc连接64位oracle数据库.林林总总国内看到都是些乱七八糟没几个靠 ...
- 浅淡Windows7 32位与64位/x86与x64的区别
看到有很多会员问到底是选Windows7 x86,还是选x64.这里简单的谈一下这这两种系统的区别. 简单的说x86代表32位操作系统 x64代表64位操作系统. 简单的判断电脑是否支持64位操作系 ...
- win2008 64位 + oracle11G 64位 IIS7.5 配置WEBSERVICE
第一个错误: 安装过程依旧是那样简单,但在配好IIS站点,准备连接数据库的时候出错了,以下是错误提示:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更 ...
- Oracle Linux(64位)安装64位Oracle10g遇到ins_ctx.mk问题
在Oracle Linux Server Release 5.7上安装64位Oracle 10g 时,遇到如下问题: Error in invoking target 'install' of mak ...
- ubuntu16 64位 编译64位程序和32位程序
安装了ubuntu16 64位的系统,想在该环境下用gcc编译64位和32位的程序 默认已经安装了64位环境的gcc 1. 首先确认安装的环境是不是64位的 cocoa@cocoaUKlyn:~/De ...
- 32位x86处理器编程导入——《x86汇编语言:从实模式到保护模式》读书笔记08
在说正题之前,我们先看2个概念. 1.指令集架构(ISA) ISA 的全称是 instruction set architecture,中文就是指令集架构,是指对程序员实际"可见" ...
- c# excel 读写 64位操作系统 64位excel
用c#读写excel时,会出现 “本机未注册Microsoft.ACE.OLEDB.12.0 驱动(什么的,忘了)” 读写 64位的excel 时,要在项目属性里改一下目标平台,默认的为*86, 改为 ...
随机推荐
- Java四个关键字 this super final static
一.this 关键字主要有三个应用: this调用本类中的属性,也就是类中的成员变量: this调用本类中的其他方法: this调用本类中的其他构造方法初始化对象,调用时要放在构造方法的首行. 引 ...
- Codeforces Round #598 (Div. 3) C. Platforms Jumping 贪心或dp
C. Platforms Jumping There is a river of width n. The left bank of the river is cell 0 and the right ...
- 【微信小程序】mpvue中页面之间传值(全网唯一真正可行的方法,中指推了一下隐形眼镜)
摘要: mpvue中页面之间传值(注意:是页面之间,不是组件之间) 场景:A页面跳转B页面,在B页面选择商品,将商品名带回A页面并显示 使用api: getCurrentPages step1: A页 ...
- cd 到目录自动ls
$vim ~/.bashrc 文件末尾加入: cdls() { cd "${1}" ls; } alias cd='cdls' $source ~/.bashrc
- mysql--事务详解
事务的四大特性: # 原子性(atomicity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作 ...
- js 的cookie问题
获取时解码可以用decodeURIComponent(),代替 unescape() // 设置cookiefunction setCookie(name,value) { var Days = 30 ...
- IT兄弟连 HTML5教程 HTML文件的主体结构
每个页面都是一个独立的HTML文档,每个HTML文档的主体结构又都是相同的,而且在一个文档中这样的主体结构只能声明一次.可以简单的将HTML文档主体结构分为两部分,一部分是定义文档类型,HTML5中声 ...
- MySQL变量介绍和用法简介
目录 一.用户变量 1.1.用户变量定义 1.2.用户变量用法 二.系统变量 2.1 系统变量简单介绍 2.2 系统变量用法简介 本博客介绍一下MySQL中变量的用法和注意细节 @ 一.用户变量 1. ...
- keras对图像数据进行增强 | keras data augmentation
本文首发于个人博客https://kezunlin.me/post/8db507ff/,欢迎阅读最新内容! keras data augmentation Guide code # import th ...
- elementui中的el-table中拼接两个列表字段
我们知道,在ElementUI中我们是使用下面的语法来展示列表字段的: <el-table :data="yanggbs" stripe style="width: ...