指令系统
指令的基本格式
- 操作码和地址码
- 指令长度
- 按地址码数目不同分为
- 零地址指令
- 不需要操作数的指令
- 隐含
- 一地址指令
- 原操作数和目的操作数一样的
- 隐含目的操作数的
- 二地址指令
- 前一个操作数保存结果
- 三地址指令
- 第三个操作数保存结果
- 四地址指令
- 外加下一条指令地址(下址)
- 零地址指令
定长操作码指令格式
扩展操作码指令格式
指令的操作类型
- 数据传送
- 算术和逻辑运算
- 移位操作
- 转移操作
- 输入输出操作
指令的寻址方式
指令寻址和数据寻址
- 指令寻址
- 顺序寻址
- 跳跃寻址
- 数据寻址
常见的数据寻址方式
- 隐含寻址
- 立即(数)寻址
- 直接寻址
- 间接寻址
- 寄存器寻址
- 寄存器间接寻址
- 相对寻址
- 基址寻址
- 变址寻址
- 堆栈寻址
指令执行过程
指令周期
- 指令周期
- 取指
- 访存取指令
- 对应CPU内标志触发器FE
- 间址
- 访存取有效地址
- 对应IND
- 执行
- 访存取操作数
- 对应EX
- 中断
- 访存保存断点对应INT
- 取指
- 机器周期
- 时钟周期
指令周期的数据流
- 取指周期
- 任务
- 数据流
- PC->MAR->data bus->main mem
- CU->control bus->main mem
- main mem->data bus->MDR->IR
- CU->PC
- 间址周期
- 任务
- 数据流
- 执行周期
- 中断周期
指令执行方案
- 单指令周期
- 多指令周期
- 流水线方案
程序的机器级代码表示
常用汇编指令介绍
- 相关寄存器
- EAX
- AX
- AH
- AL
- AX
- EBX
- …
- ECX
- …
- EDX
- …
- 除EBP和ESP之外的寄存器用途比较任意
- EAX
- 汇编指令格式
- 常用指令
- 数据传送指令
- mov(不能内存到内存!)
- push(栈中元素固定32位)
- pop
- 算术和逻辑运算指令
- add/sub
- inc/dec
- imul
- 两个操作数版
- 结果放在第一个
- 三个操作数版
- 第二个和第三个相乘,结果放在第一个
- 第一个操作数都必须是寄存器
- 两个操作数版
- idiv
- 只有除数
- 被除数为edx:eax(64位)
- and/or/xor
- 逐位
- 结果放在第一个
- not
- neg
- 取负
- shl/shr
- 逻辑移位
- 操作数1表示目标数
- 操作数2表示移动位数
- 控制流指令
- jmp <label>
- jcontition
- cmp/test
- cmp 比较两个操作数,前者是否怎样怎样
- test逐位相与
- 都不保存结果,只置状态字
- 与jcondition搭配使用
- 举例
- call/ret
- call <label> 首先需要将下一条指令地址入栈
- ret
- 数据传送指令
过程调用的机器级表示
选择语句的机器级表示
循环语句的机器级表示
边界对齐、大小端存储
边界对齐
对于一个结构体内的元素,按元素自身大小的整数倍确定偏移量。例如,int大小为4B,则只能从0,4,8,处开始存放一个元素。
对于结构体整体,需按照最大元素对齐。(事实上更为复杂)
大小端存储
大端存储,就是一个元素的各个字节按照从前往后的顺序存储。小端存储,就是一个元素的各个字节按照从后往前的顺序存储。例如,int型变量x=-192 (FFFFFFC0H),按照小端存储,示意图如下
小端存储示意图asadfsad
一道例题(2012)
![]()
答案 D(好像是)
cmp、test指令与jmp指令的一个简单例子
cmp eax, ebx
jle done #如果eax的值小于或等于ebx值,跳转到done,否则执行下一条指令
cmp dword ptr [var], 10 #将var指示的主存地址的4字节内容,与10比较
jne loop #如果相等则继续顺序执行;否则跳转到loop
test eax, eax #测试eax是否为零
jz xxxx #为零则跳转到xxxx