(笔记)学习汇编语言1

视频地址:http://study.163.com/course/courseMain.htm?courseId=1003265009

近来研究操作系统,涉及到汇编语言相关知识点,故有此学习和记录!

汇编语言基础:

  1. 课程讲解 追求的目标,是从本质上知道程序是如何运行的。 比如if(){}else{}中,如何让else的那个不执行? 工作几年的程序员最大的悲哀,是只会调函数、画界面,进行重复劳动。做安全、架构,或者管理…… 基础最重要!

  2. 编译器 编译器将汇编语言转为机器语言 inc eax --> 0100 0000 C语言编译器 将 A+B --> 0100 0000 本质是编译器越来越牛b,是编译器帮我们做了更多事情。 不懂汇编的人,一定不专业。 不懂堆栈的人,一定不了解外挂。

  3. 进制 如将十进制定义为:由十个符号组成,分别是0132876945. 那么,这个新的定义做成加密,会对解密者造成极大的困扰 量子计算机:不止0和1

  4. 数据宽度: 存储超过最大值时,直接丢弃。

  5. 无符号数和有符号数 无符号数(正数):10011010直接存储,表示0x9A,或154(十进制) 有符号数:最高位是0为正数!!1为负数。 负数与正数编码规则不同。 原码:当前数的绝对值(正数的反码,补码,原码相同) 反码(负数):符号位不变,其余位取反 补码(负数):反码加一(负数以补码形式存储) 即,-1:原码,反码,补码 1000 0001 1111 1110 1111 1111 //FF:内存中以补码存储

  6. 位运算 你可以说知道2+3=5,但是如果仅仅只做CRUD,太low。 写代码就是体力活,理解原理很重要。 int表示32位

    1. 与运算: 都是1才是1,否则为0 1011 0001 and(&) 1101 1000

     	1001 0000
    
    1. 或运算: 只要有一个为1就是1 1011 0001 or(|) 1101 1000

     	1111 1001
    
    1. 异或运算: 不一样的时候是1 1011 0001 xor(^) 1101 1000

     	0110 1001
    
    1. 非运算: 0就是1,1就是0 not(~) 1101 1000

     	0010 0111
    
    1. 左移: 各二进位全部左移若干位,高位丢弃,低位补0 shl(<<)
      1101 1000 左移2位为:0110 0000
    2. 右移(略复杂):分两种情况 各二进位全部右移若干位,低位丢弃,高位补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);
    3. 总结:计算机只会做位运算,无法直接做加减乘除。
  7. 通过位运算实现加减乘除:

    1. 加法:先异或,再与(与后做左移)。再将两个结果异或,直到与运算结果为0为止

    2. 减法,相当于加法 4 - 5 = 4 + (-5)

    3. 乘法:X * Y,乘法的本质是加法(x个y)

    4. 除法:本质是减法,X/Y表示X能减去多少个Y

转载于:https://my.oschina.net/u/3572551/blog/1312276

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值