2024王道考研计算机组成原理

您所在的位置:网站首页 x86汇编指令格式是什么样的 2024王道考研计算机组成原理

2024王道考研计算机组成原理

2024-07-12 10:35| 来源: 网络整理| 查看: 265

零、本章概要

指令寻址:解决的是PC+"1"的问题 数据寻址:使用寄存器/内存/结合

基址寻址:用于多道程序的并发执行 直接寻址:call 0x12345678 变址寻址:esi edi用于循环,因为使用直接寻址需要一堆地址很麻烦,速度也慢 相对寻址:地址针对的是相对于PC的位置,在代码位置发生改变的情况下用于实现跳转 PSW就是EFLAGS

x86汇编: 使用cmp+jnz(等)实现跳转指令;cmp会修改PSW的内容,jnz指令执行的适合会根据psw来判断需不需要跳转 循环语句:for(int i=0;i64(edx:eax) ,商存入eax,余数存入edx

intel格式(Windows)&AT&T(Linux&Unix)格式(汇编格式)

六、C语言选择语句的汇编实现

在x86当中IP就是PC

和前面提到的一样,我们这样写汇编代码,但是其实最后变成机器码的时候他会给我们翻译成与PC有关的指令,这样代码段即使移动位置,当PC指向这条语句的时候也能够跳转到正确的地址(使用PC+一个补码)

使用标号可以更方便程序员去编写汇编代码,最后编译器要做的就是把这个标号改成对于的地址

条件转移指令通常与cmp指令配合食用🤣🤣🤣 

switch语句:离散情况不生成大表和if...else效率一样,连续的时候生成大表,先比较数值-1超过第二大的数就直接跳到default,否则直接根据edx*4+func(函数首地址) 来去查大表,直接得到跳转地址而不用像if..else那样进行多次的比较!!!

只有特定的指令(比如运算指令,和ALU有关,本质上不就是加法器那些产生的符号位吗?)才会修改PSW寄存器里面的标志位,cmp指令本质上就是做了一个减法(但是结果不保存,只改变符号位),产生了符号位,然后条件转移指令再根据减法所产生的标志位(去PSW寄存器中获取)来决定要不要进行跳转!!!

六、C语言循环语句的汇编实现

i++后面紧跟的就是cmp,一旦越界就跳出循环

for:①先初始化,第一次直接判断是否跳出循环

②循环主体&i++③cmp i ,cnt(没结束就往上跳是for循环的一大重要特征!)

七、C语言函数调用的汇编视角 

  

x86的push和pop默认是按照4字节压栈/出栈的

esp指向的是栈顶的位置(有元素)

push eax:①先sub esp,4 ②再mov [esp],eax

pop eax:①先mov eax,[esp] ②再add esp,4

call eax:①push eip ②jmp eax

ret:pop eip(默认是ret 4)

真实的堆栈以及函数调用:

所谓堆栈平衡就是函数调用前和调用后esp和ebp的位置保持不变! 

试试看能不能画到堆栈平衡?

外平栈(默认采用的调用约定):cdcall(右左,外平栈:add esp,8)

内平栈:stdcall(右左,内平栈:ret 8(相当于add esp,8))

注意:一个线程里面的所有函数都使用同一个堆栈

int main(){

fun(2,3);  push 3 push 2 call fun(push eip + jmp fun)

fun:

八、CICS和RISC指令集的对比

你RISC只能通过寄存器来访存,寄存器可不得比CICS多吗? 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3