计算机组成原理 之 第四章 指令系统

 1. 指令格式

        通常包括操作码字段(OP)和地址码字段(A),有的指令不需要地址码

        指令系统(指令集):一台计算机的所有指令的集合,eg:X86、ARM

(1)指令的分类: 

        a. 根据地址码的条数不同:零地址指令、一地址指令……

        零地址指令:不需要操作数,如空指令、关中断、停机等指令;堆栈计算机(隐含在栈里)

        一地址指令:只需要单个操作数(加1、取反、求补等,OP(A)->A,需要三次访存,取指->读A1->写A1);需要两个操作数、但是一个操作数隐含在某个寄存器里(隐含在ACC中,(ACC)OP(A)->ACC,需要2次访存,即取指->读A);

        二地址指令((A1)OP(A2)->A1);  

        三地址指令((A1)OP(A2)->A3);

        四地址指令(三地址的基础上给出下一条指令的地址,)。

         b. 按长度进行分类:定长操作码、可变长操作码

                定长操作码:n位->2^n条指令

                可变长操作码:指令系统中的各指令操作码长度可变(译码电路复杂灵活度高

                *扩展操作码 指令格式

        c. 按操作类型分类

 (2)补充:扩展操作码 

         设地址长度为n,上一层留出m种状态,下一层可扩展出m*2^n种状态

2. 指令寻址

        顺序寻址:通常情况,PC自动+1(指令字长)(定长指令字) 

        跳跃寻址:转移类指令,修改PC的值,JMP(类似goto)

 3. 数据寻址

a. 直接寻址

b. 间接寻址

c. 寄存器寻址(直接给出操作数所在的寄存器编号,访存1次)

d. 寄存器间接寻址

e. 隐含寻址(如+操作中第二个操作数在ACC中的潜规则)

f. 立即寻址(寻址特征为#,指令中直接存放操作数,但是长度有限制)

偏移寻址:

g. 基址寻址(BR(专门存放基地址的寄存器BR或通用寄存器)存放程序的起点,EA = (BR)+A,操作数 = (EA),程序员不能随意更改基地址)

h. 变址寻址:类似于基址寻址,只是寄存器里IX放偏移量,指令中的A放基地址(优点:运行遍历连续地址的程序,如果采用传统寻址方式,必须条指令的A依次递增,寄存器的值无法改变(基地址),然而将A放入IX寄存器,只用反复改变IX的值就对连续地址进行遍历)

 ​​​​​​​

 h. 基地&变址复合寻址

 g. 相对寻址:PC+A(PC每次取值都会自动+1,EA=PC+A(偏移量),基于下一条指令的偏移量)

 h. 堆栈寻址(寄存器(硬堆栈)或主存(软堆栈),栈顶指针SP)

        就像一个桶,桶顶地址为0

3  x86架构汇编语言

3.1 只需要知道寄存器的名字:通用寄存器EAI、变址寄存器ESI、堆栈基地址EBP

        通用寄存器:

        如果只用低16bit:则用AX,E:延展的意思

        AH与AL长度为8bit

 x86架构不允许有两个操作数同时来自内存,<reg><mem><con>

 逻辑运算指令​​​​​​​

AT&T格式与intel格式的对比

()选择语句的机器级表式

        a. PC的别名IP

        b. 无条件状态转移指令jmp <地址>、jmp 128、jmp eax、jmp [999]、jmp NEXT1、用标号锚定位置:’NEXT1:‘(使用锚定地址方便了程序员的编写)

        c. jmp的变体,通常搭配cmp获取两操作数的大小关系、C语言翻译成汇编

        d. cmp的底层实现、PSW状态字寄存器存储运算标志位(OF、SF、ZF、CF )

()循环语句

        a.   用条件转移指令实现循环

        b.  使用Loop指令(配合ECX寄存器计数)实现循环(loopx指令)

 ()函数调用的机器级表示

        a. 调用函数(C all)=压入栈帧至栈顶;IP旧值压栈保存,设置新IP值并转移

        b. 调用和返回时的enter与leave指令

                enter:push edp + mov edp esp ->之后可以向新函数栈帧压入数据

                leave:mov esp edp + pop edp

        c. 函数通用结构:enter、leave、ret(IP值的恢复)

()栈帧的内容(整个调用过程)

        a. edp:存放上一层栈帧的基址;esp+4:存放IP旧值(返回地址)

        b. 局部变量最先定义在顶部(edp-4、edp-8),函数调用的参数最先出现也在顶部(edp+8、edp+12)

        c. 为了追求对其,gcc编译器会设置为16B的整数倍

        d. 必要的时候调用函数前需要将寄存器的值压栈保存

        e. 过程:

        调用者:1⃣️保存必要寄存器 2⃣️写入调用参数 3⃣️执行call (IP旧值入栈顶)4⃣️使用返回值(eax)

        被调者:1⃣️enter 2⃣️ 初始局部变量 3⃣️一系列逻辑操作 4⃣️传递返回值 5⃣️leave 6⃣️ret(恢复IP值)

5. CISC RISC复杂指令集(x86)与精简指令集(ARM,手机、开发版)

        指令也遵循二八定律

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值