视频地址:http://study.163.com/course/courseMain.htm?courseId=1003265009
近来研究操作系统,涉及到汇编语言相关知识点,故有此学习和记录!
汇编语言基础:
-
课程讲解 追求的目标,是从本质上知道程序是如何运行的。 比如if(){}else{}中,如何让else的那个不执行? 工作几年的程序员最大的悲哀,是只会调函数、画界面,进行重复劳动。做安全、架构,或者管理…… 基础最重要!
-
编译器 编译器将汇编语言转为机器语言 inc eax --> 0100 0000 C语言编译器 将 A+B --> 0100 0000 本质是编译器越来越牛b,是编译器帮我们做了更多事情。 不懂汇编的人,一定不专业。 不懂堆栈的人,一定不了解外挂。
-
进制 如将十进制定义为:由十个符号组成,分别是0132876945. 那么,这个新的定义做成加密,会对解密者造成极大的困扰 量子计算机:不止0和1
-
数据宽度: 存储超过最大值时,直接丢弃。
-
无符号数和有符号数 无符号数(正数):10011010直接存储,表示0x9A,或154(十进制) 有符号数:最高位是0为正数!!1为负数。 负数与正数编码规则不同。 原码:当前数的绝对值(正数的反码,补码,原码相同) 反码(负数):符号位不变,其余位取反 补码(负数):反码加一(负数以补码形式存储) 即,-1:原码,反码,补码 1000 0001 1111 1110 1111 1111 //FF:内存中以补码存储
-
位运算 你可以说知道2+3=5,但是如果仅仅只做CRUD,太low。 写代码就是体力活,理解原理很重要。 int表示32位
- 与运算: 都是1才是1,否则为0 1011 0001 and(&) 1101 1000
1001 0000
- 或运算: 只要有一个为1就是1 1011 0001 or(|) 1101 1000
1111 1001
- 异或运算: 不一样的时候是1 1011 0001 xor(^) 1101 1000
0110 1001
- 非运算: 0就是1,1就是0 not(~) 1101 1000
0010 0111
- 左移: 各二进位全部左移若干位,高位丢弃,低位补0 shl(<<)
1101 1000 左移2位为:0110 0000 - 右移(略复杂):分两种情况 各二进位全部右移若干位,低位丢弃,高位补0或者补符号位 shr 1101 0101 -> 0011 0101 对应C语言(>>) unsigned int a = 10 printf("%d\n",a>>2); ---------------- sar 1101 0101 -> 1111 0101 对应C语言(>>) int a = 10; printf("%d\n",a>>2);
- 总结:计算机只会做位运算,无法直接做加减乘除。
-
通过位运算实现加减乘除:
-
加法:先异或,再与(与后做左移)。再将两个结果异或,直到与运算结果为0为止
-
减法,相当于加法 4 - 5 = 4 + (-5)
-
乘法:X * Y,乘法的本质是加法(x个y)
-
除法:本质是减法,X/Y表示X能减去多少个Y
-