鱼C论坛

 找回密码
 立即注册
查看: 3186|回复: 15

[技术交流] (连载) X64汇编 入门(1)--概览

[复制链接]
发表于 2014-8-30 23:30:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
       最近接触到X64汇编,不得不说32位和64位汇编差别蛮大的。 不论内存模式, 寻址,还是参数传递都有很大差别,就连段寄存器在X64汇编中都没用了,当然为了兼容32位平台,还是保留了段寄存器。       先说AMD平台提供的运行模:
            1、长模式
                   (1)、64位模式
                   (2)、兼容模式
            2、遗留模式(听名字就知道以后要扔掉)
                   (1)、实模式
                   (2)、保护模式
                   (3)、虚拟8086模式


      首先当然必须的,AMD64平台是兼容16位和32位模式的,但是它不叫兼容模式,而是用了一个遗留模式的名字,等将来CPU结构越来越复杂,Intel,AMD这些公司估计就会考虑解决一些历史遗留问题了。  遗留模式其实就是一个32位的CPU,在遗留模式下编程看到的就是IA32的体系结构。

      遗留模式我们虽然熟悉,但是重点不是这个,长模式才是重点。长模式顾名思义就是64位了,它有两个子模式,分别是64位模式和兼容模式,听起来可能有点绕,单它就是起了这样一个淡疼的名字。说明白一点,就是64位系统就运行于长模式下,其他的就是遗留模式。但是要在64位系统下运行32位程序,就进入兼容模式,但没提供16位模式。这么说懂了吧。这就是为什么64位win7下不能运行16位程序,但32位的win7却可以的原因。

       下面是64位平台的特点,如果连32位平台都不了解,先自行补习吧,限于篇幅就不写了

             1、寄存器        
                      当CPU运行于长模式下,可用的寄存器有极大的扩展,首先,32位下的8个通用寄存器全部扩展成64位EXX->RXX,比如EAX成了RAX,并增加了R8-R15  8个额外的通用寄存器。增加8个XMM寄存器,指令指针寄存器EIP扩展为64位的RIP
             2、CPU 栈
                      长模式下push操作只针对64位数据。
             3、参数传递
                      这是唯一在X64平台下反而变简单了的一个元素, 以前那些__stdcall,__cdecl,__fastcall,__thiscall,__nakedcall,__pascal什么的,统统扔掉,现在基本统一成一种方式----寄存器传参数(类似于fast call)。64位汇编的前4个参数分别用rcx,rdx,r8,r9来传递,如果超过4个参数,才会用到堆栈来传递,被调用者不会清理堆栈(这个似乎把任务交给编译器了,总不能让程序员手动把)。
       4、内存模型
             这里只讨论64位模式,在64位模式下段寄存器不再有用,不只是在用户级,在内核也不再有用了,这似乎是个好消息,内存通过分页机制直接映射为物理地址,这个真是喜大普奔,想以前被Intel的段机制弄得一团屎,到了32位Intel还是没舍得仍,现在终于是时候舍弃这个臃肿的机制了,建议大家不要纠缠段机制了,特别是32位的段机制,臃肿不堪,而且完全可以不用就实现内存保护,早就该扔了。不得不说Linux还是有远见,设计的时候就巧妙地绕过了Intel的段机制,直接将所有段描述符置为0,都从00000000h开始寻址。至于16位的段机制,系统启动必须要通过实模式进行跳转到更长的模式的准备工作,比如初始化32位模式的段描述符,编程8259A中断芯片,打开A20地址线之类的琐事。暂时还不能丢弃,但是也是迟早的事。   
        至于字节存储顺序,还是小端法,不谈。




          这大概就是X64平台与32位平台的一些区别,当然这只是一小部分,还只是概览(看标题),关于编程细节的话,如果有人对X64编程感兴趣,以后再开贴吧

评分

参与人数 2荣誉 +6 鱼币 +5 贡献 +6 收起 理由
漠水 + 1 + 1 热爱鱼C^_^
小靚同学Leon + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 01:12:39 From FishC Mobile | 显示全部楼层
不错,不错,期待实际编程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 11:06:21 | 显示全部楼层
支持楼主!加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 12:23:43 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 12:26:29 From FishC Mobile | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2014-8-31 12:29 编辑

感兴趣。希望多写一些关于兼容性等的。还有一些习惯x86编程在x64可能出错的细节的东西。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-8-31 13:15:04 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 17:09:33 | 显示全部楼层
支持楼主!加油,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 18:23:08 | 显示全部楼层
刚刚开始学32位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 21:17:55 | 显示全部楼层
看到这个好爽啊,强烈支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-1 10:08:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-1 15:40:54 | 显示全部楼层
高人,请收下我的双膝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-1 21:43:45 | 显示全部楼层
该觉16位和8位汇编拖累了CPU的设计,不过要是去掉这些模式,以后学习汇编的同志可能更难下手了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-3 07:56:37 | 显示全部楼层
其实这种东西不用nasm写个雏形出来光看很难理解的,想问你看的什么书?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-4 17:20:22 | 显示全部楼层
楼主问你个问题,用ml64.exe 编译  DAA 这条指令时出现 syntax error ,不知道楼主知不知道原因??
mov al, 27h
add al, 35h
DAA
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-4 23:01:08 | 显示全部楼层
洪仔 发表于 2014-9-4 17:20
楼主问你个问题,用ml64.exe 编译  DAA 这条指令时出现 syntax error ,不知道楼主知不知道原因??
mov a ...

没有语法错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 16:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表