0 前言
全是基于x86系列处理器
1 寄存器与存储器的区别
2 汇编程序员眼中的系统结构
- 指令寄存器 PC(Program Counter)
指向下一条指令的地址
- 16位 CS:IP
- 32位 EIP
- 64位 RIP
- 寄存器与寄存器堆(Registers)
- 在处理器内部以名字方式访问的快速存储单元
- 寄存器堆:一系列寄存器的集合
- 条件码(Condition Codes)
汇编程序员眼中,就是CPU,Memory还有他们直接的通路,还有他们的内部信息,汇编程序员直接考虑CPU和Memory要去怎么做。
3 指令的执行过程
执行完指令之后,会有状态的变化(Condition codes的变化),这些变化,会被后面的其他指令作为依据进行相关判断,从而执行相关命令,例如C语言if else
的本质,就是这么回事。
4 C语言与汇编语言
在AT&T格式中,通过后缀,表明操作的是哪种类型的数据。
这种表示方式,不容易出错,显式地说明了数据的宽度。
5 汇编语言实例:两个整数相加
C语言代码
#include <stdio.h>
#include <Windows.h>int main() {int a = 1;int b = 3;int t = a + b;int c = 1 + 22;system("pause");return 0;
}
对应的汇编代码
右图可知
- 对于
int t = a + b;
被分解为三个步骤- 从内存中取得a
- 从内存中取得b并于a相加
- 结果放入内存中的t中
- 对于
int c = 1+ 22;
在编译阶段,直接将立即数的加法算了出来。
寻址方式中的[bx - 11H]
减法没有关系,如果减过头(bx < 11H),那么就会重新轮回,这个要根据机器数的宽度决定。
x86指令集是变长的,不同指令的字节数不一样。
add指令,整数加法不区分有无符号,本质都是机器数相加,输出什么取决于放在哪里,当然,没有这么做加法的,因为没有实际意义。
给出一段代码比较
unsigned short a = 40000;
short b = 1;
unsigned short c = a + b;
2.
unsigned short a = 40000;
short b = 1;
short c = a + b;
思考:浮点数加法呢?
6 mov传送指令
不能两个都是内存单元,是因为硬件不好实现。
x86指令中,至多有一个操作数是内存单元。