学习:汇编语言

来源:互联网 发布:天猫双十一数据分析 编辑:程序博客网 时间:2024/04/30 14:18
一、leaveq与retq
leaveq和retq中的q是指64位操作数。
leaveq相当于:
movq %rbp, %rsp
popq %rbp

retq相当于:
popq %rip
注意leaveq跟开头是对应的:
push   %rbp
mov    %rsp,%rbp

有些指令集也把它叫做enterq。
而与retq对应的是callq,相当于:
pushq %rip
jmpq addr


二、系统启动时BIOS会找到启动设备,然后把其第一个扇区的512字节内容复制到RAM中从物理地址0x00007c00开始的位置,然后跳转到这个地址处,开始执行刚刚装载进来的代码。

三、8个通用寄存器,6个段寄存器,EFLAGS寄存器,,EIP (instruction pointer) 寄存器构成了IA-32体系的基本执行环境,用以执行通用指令。

四、Intel 64

在"x86-64"出现以前,英特尔与惠普联合设计出"IA-64"架构,惟这款64位架构并不与x86兼容,且市场反应较冷淡,同时受制于多个专利权,使其他厂商不能模仿。与x86兼容的AMD64架构便应运而生,其主要特点如名称所述,既有支持64位通用暂存器、64位整数及逻辑运算,以及64位虚拟地址。

AMD64代表AMD放弃了跟随Intel标准的一贯作风,选择了像把16位的Intel 8086扩充成32位的80386般,去把x86架构扩充成64位版本,且兼容原有标准。

AMD64架构在IA-32上新增了64位暂存器,并兼容早期的16位和32位软件,可使现有以x86为对象的编译器容易转为AMD64版本。除此之外,NX bit也是引人注目的特色之一。AMD64能有效地把x86架构移至64位的环境,并且能兼容原有的x86应用程序。

Intel 64计划的历史可谓相当长及复杂,其原因主要是因为Intel自身的内政问题。该计划开始时,其代号为Yamhill,不过Intel一直对外宣称其计划不存在,至2004年初才改口承认,并把代号改为CT(Clackamas Technology)。在宣布CT计划的数个星期内,Intel为计划给予多个新名称。在2004年春季的IDF开发者论坛后,Intel将之命名为“IA-32E”,意即IA-32的延伸,在数星期后才改称为EM64T。

Intel曾长时间把该计划保持机密,其原因有以下两点。第一,Intel不想给客户混淆信息,把未来Itanium IA-64处理器的展望与x86混为一谈,但在Intel眼见使用AMD64的Opteron及Athlon 64取得成功,便需要对竞争者的威胁作出迎击。而第二个原因,是Intel为了自身的面子,必然不会承认使用了对手AMD的技术,因此Intel把该技术以EM64T这个名字来推出,虽然核心与AMD64几乎相同,犹如一对孪生兄弟,但如果Intel使用了AMD64这名字,等于在帮对手做广告宣传。在以往Intel的营销中,Intel总把AMD的产品贬为自家技术的仿制品,不过这回AMD率先开发民用64位技术,Intel需要反过来吸纳AMD的技术,使Intel在研发x86处理器技术的领导地位受到重挫,因此Intel在造势方面便需要使用更多的人力物力。Intel主席Craig Barrett之后也承认在保密方面,这个机密算是保护得最差的。

在Intel 64(EM64T)的文件中,对于其指令集的起源只字不提,因此有媒体便为它起了“iAMD64”这个别名,讽刺Intel在迎击AMD的民用64位技术上,使用了AMD的技术,直接把AMD64吸纳过来,并以新名重新包装使用。后来Intel索性将此技术正式命名为Intel 64

Intel自家的64位IA-64与Intel 64并不兼容,即IA-64的软件不能直接在Intel 64上运行。Intel 64所用的x86-64是IA-32指令集的延伸,而IA-64则是另一款独立的架构,没有任何IA-32的影子。虽然IA-64可通过模拟来运行IA-32的指令,但指令在运行前需经转换,才能在IA-64上运行,导致其速度变慢。由于x86-64是从IA-32派生而来,因此运行IA-32与64位程序的表现也显得绰绰有余。

五、Intel 64通用寄存器(general-purpose registers,GPRs) 的数量是16。 GPRs是64-bits宽且支持对字节,字, 双字和四倍长字整数的操作. 访问字节寄存器统一地通过访问最低8 bits来实现。instruction pointer寄存器变成64 bits。EFLAGS寄存器被扩展到64 bits宽,并且被用作RFLAGS寄存器。RFLAGS寄存器的高32 bits被保留,低32 bits与EFLAGS寄存器是相同的。

六、Instruction Pointer Sizes in 64-Bit Mode
                                                   名称      使用位     高位
16-bit instruction pointer            IP       低16位     Not Modified
32-bit instruction pointer          EIP       低32位    Zero Extension
64-bit instruction pointer          RIP       全部64位
    
七、保护模式下寻址的机制
1、段寄存器中存放段选择子Selector
2、GDTR中存放着段描述符表的首地址
3、通过选择子(放在段寄存器中)根据GDTR中的首地址,就能找到对应的段描述符
4、段描述符中有段的基址(可以是这个段的线性首地址),就得到段在内存中的首地址
Linux系统中所有段的基地都为0,故其逻辑地址与线性地址一致

5、加上偏移量,就找到在这个段中存放的数据的真正线性地址。

八、Intel 8086 16位CPU环境下:
物理地址=段值X16 + 偏移
在GAS汇编代码中表示为%es:(%bx),即%es<<4 + %bx

九、系统在进入保护模式之后会先建立分页机制,这时内存寻址方式是段寻址;在Linux中段的基址为0,故其地址等于物理地址;在分页建立完成后,设置cr0寄存器的PG=1,则分页开始生效;这时内存寻址方式是分页寻址。

十、执行call指令时,当前执行代码的下一条指令的地址被压栈,这就是所谓的“返回地址”;call执行时,栈顶会指向这个返回地址;当call调用的函数返回前,会执行ret指令,这样就会把之前压栈的地址弹出到EIP寄存器,然后CPU根据EIP寄存器中保存的地址执行下一条指令。


0 0
原创粉丝点击