学习:汇编语言

学习:汇编语⾔
⼀、leaveq与retq
leaveq和retq中的q是指64位操作数。
leaveq相当于:
movq %rbp, %rsp
popq %rbp
2001年南充案popq %rbp
铌高
retq相当于:
popq %rip
popq %rip
注意leaveq跟开头是对应的:
push  %rbp
mov    %rsp,%rbp
mov    %rsp,%rbp
有些指令集也把它叫做enterq。
⽽与retq对应的是callq,相当于:
pushq %rip
jmpq addr
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寄存器中保存的地址执⾏下⼀条指令。

本文发布于:2024-09-20 13:54:55,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/648714.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:地址   寄存器   技术   计划   兼容   找到   指令集   开始
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议