汇编
二进制
1、计算机中所有信息都是以二进制的形式储存的
2、CPU只认识0和1,即二进制 CPU<->硬编码<->汇编语言<->C语言代码
3、因为二进制复杂,所以很多软件改用十六进制简写二进制
数据宽度
- 位
bit,是最基础的概念,在计算机中,由于只存在逻辑0和逻辑1,因此很多东西、动作、数字都要表示为一串二进制。如:1001 0000 1101等。其中每一个逻辑0与1就是一个位,英文名叫‘bit’,是计算机中最基础的单位。
- 字节
byte,是由八进制组成的一个单元,也就是8个bit组成一个byte。在计算机中,用于表示ASCII字符,便是运用字节来记录表示字母和一些符号。
- 字
word,表示计算机处理指令或数据的二进制位数,是计算机进行数据储存和数据处理的运算的单位
通用寄存器
可以用于传送和暂存数据,也可以参与算数逻辑运算,并保存运算结果。除此以外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途及特殊用途,只有这样,才能在程序中做到正确、合理使用它们。
32位以下:
- EAX:(针对操作数和数据结果)累加器,返回函数结果
- ECX:(字符串和循环操作数)计数器
- EDX:(I/O指针)数据寄存器
- EBX:(DS段中的数据指针)基址寄存器
- ESP:(SS段中栈指针)栈指针寄存器
- EBP:(SS段中栈内数据指针)扩展基址指针寄存器
- ESI:(字符串操作源指针)源变址寄存器
- EDI:(字符串操作目标指针)目的变址寄存器
64位:RAX 16位:AX 8位:AL
汇编指令
r 通用寄存器
m 代表内存
imm 代表立即数
如:
r8 代表8位通用寄存器
m8 代表8位内存
imm8 代表8位立即数
按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。
运算
and运算(与)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。
or运算(或)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。
xor运算(异或)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
not运算(非)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
内存寻址
寄存器位于CPU中,执行速度快,内存速度相对较慢,但是空间很大。寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的。
在计算机中每一个字节都有一个编号,这里可以认为内存的编号就是字节,在32位下范围为00000000-FFFFFFFF,最大寻址为FFFFFFFF+1字节,即4G。
cs ds ss es: 在用户层中只是起寻址的作用,在内核层涉及到段、页会有其他的用途。
cs:代码段
ds:数据段
ss:堆栈段
es:附加段
向指定内存写入数据


