川本姨夫 发表于 2014-8-30 23:30:31

(连载) X64汇编 入门(1)--概览

       最近接触到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-R158个额外的通用寄存器。增加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编程感兴趣,以后再开贴吧

小靚同学Leon 发表于 2014-8-31 01:12:39

不错,不错,期待实际编程

ゃ莼处狼性ぉ 发表于 2014-8-31 11:06:21

支持楼主!加油

郭兴华1 发表于 2014-8-31 12:23:43

强烈支持楼主ing……

メ㊣逆ご帅☆ 发表于 2014-8-31 12:26:29

本帖最后由 メ㊣逆ご帅☆ 于 2014-8-31 12:29 编辑

感兴趣。希望多写一些关于兼容性等的。还有一些习惯x86编程在x64可能出错的细节的东西。

郭兴华 发表于 2014-8-31 13:15:04

强烈支持楼主ing……

雲裏霧裏 发表于 2014-8-31 17:09:33

支持楼主!加油,学习了

如是我闻 发表于 2014-8-31 18:23:08

{:5_94:}刚刚开始学32位

儁破孩@123 发表于 2014-8-31 21:17:55

看到这个好爽啊,强烈支持楼主

秋之帆 发表于 2014-9-1 10:08:38

{:7_125:}

dophc 发表于 2014-9-1 15:40:54

高人,请收下我的双膝

gyixue 发表于 2014-9-1 21:43:45

该觉16位和8位汇编拖累了CPU的设计,不过要是去掉这些模式,以后学习汇编的同志可能更难下手了

cxwzj 发表于 2014-9-3 07:56:37

其实这种东西不用nasm写个雏形出来光看很难理解的,想问你看的什么书?

洪仔 发表于 2014-9-4 17:20:22

楼主问你个问题,用ml64.exe 编译DAA 这条指令时出现 syntax error ,不知道楼主知不知道原因??
mov al, 27h
add al, 35h
DAA

川本姨夫 发表于 2014-9-4 23:01:08

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

没有语法错误
页: [1]
查看完整版本: (连载) X64汇编 入门(1)--概览