欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言学习总结一

程序员文章站 2022-03-13 10:54:22
...

一、什么是汇编语言?

其本质是机器语言的符号化。那什么是机器语言?
机器语言是机器指令的集合,是由0和1构成的二进制代码。
那什么是机器指令?机器指令是计算机CPU执行某种操作的命令编码。指令系统是指某一类型CPU中所有机器指令的集合。8086/8088CPU的指令系统共包含92种基本指令,按照功能可将它们分为6大类:数据传送指令、算术运算指令、逻辑运算和移位指令、串操作指令、控制转移指令、处理器控制指令。
嗯,,,,百度的概念,记不住。等哪天学到返璞归真了再来解释

二、 谁还在用它?可以用在哪些方面?

#我当然想知道这个有没有用,老师劈里啪啦说了一大堆,但并没有觉得它很有用。似乎程序员的社区里关心这个的比较少,还是说我没有找到?#
参考了以下网友的回答:
#在嵌入式、安全等领域相对校多,它可能是解决某个问题的关键点。
#学完X86汇编后还应该学以下ARM汇编,还有PPC汇编,MIPS汇编。没见过,估计是一通百通的。

三、 汇编难不难?

借用知乎一个前辈的回答
汇编语言本身很简单,常用指令没几个,语法规则也不多,看几个小时资料似乎就明白了,但其实不然。汇编的背后是体系结构,是程序设计抛开各种高层形态的最根本,最本质的解释。
#想掌握汇编,还是要多实践。
1 早年用汇编手写病毒。比如处理指令重定位,是真的用汇编计算指令地址,push push call 实现函数调用。

2 长期病毒木马2进制分析。分析明白各种 malware 的原理,实现查杀防。个别病毒,需要实现修复。

3 漏洞挖掘。fuzzer 发现漏洞,汇编级详细分析,exploit 编写,武器化利用,一条龙。

4 各种逆向分析。好的东西没有代码,IDA 里看就是了。

5 跟debuger 做朋友。从来看不上print 方式的bug定位。所有问题在调试器里分析明白,绝不靠猜。

6 编译器后端研究。什么指令选择,指令调度,寄存器分配,全都研究一遍。

7 底层开发,操作系统,设备驱动,虚拟化都走上一遍。X86很熟? ARM学一遍做对比。

四、额外的基础知识(期末考点)

#1、进位计数制及数制的转换。简单点说,要能够在二进制、十进制、八进制、十六进制中熟练的相互转换。
汇编语言学习总结一#这几个都是逢N进一。
汇编语言学习总结一二进制之间作加减乘除,不要熟练,至少要会。在汇编语言程序中,数据通常采用十六进制,十六进制的数制要熟练掌握。
#非十进制的数转换为十进制的数通常是按权展开。
而十进制的数转换为非十进制的数通常除K取余。要熟练,不能一知半解。
#如果是十进制的小数,如0.6875这种转换为非十进制的,采用“乘基取整法”。将十进制的小数乘以非十进制的基,记下产生的小数部分再乘,取出每次相乘得到的整数。直至积的小数部分为0为止。
#有符号数:最高位表示符号(正或负)其余位表示数的大小。
#它又称为机器数,机器数可以采用原码、反码、补码表示。
这好像又TM是个考点。
汇编语言学习总结一原码的最高位表示真值的数符,其余位为数值位,且与真值的数值位相同,必要时在数值位前加上前0。
数的原码表示具有直观、与真值的转换方法简单等优点,但是原码有着算术运算复杂的缺陷。与手算相同,做加法运算时,首先要判断两数的数符,同号则相加,异号则相减。做减法运算时,还必须比较两数的绝对值,用较大的绝对值减去较小的绝对值,差的数符则采用绝对值较大者的数符。以上的算法对于硬件实现来说比较困难。
3.补码
补码的引入,是为了简化减法运算。补码的概念在日常生活中经常用到,例如手表的校时。假定手表停在11时,而标准时间为9时,可以使用两种校时方法:一种方法是逆时针调2小时,即11-2=9;另一种方法是顺时针调10小时,在调至12时后则为0时,即到12时时归零,因此有11+10=9(称为模加)。于是,就手表校时而言有:
汇编语言学习总结一这里12称为模,10称为2的补数。由此看出,减去一个数等价于加上该数的补数。下面介绍计算机中使用的补码的含义、求取方法及其运算。
(1)补码定义

汇编语言学习总结一当一个数为正数,则其补码就是该数本身;为负数,则其补码等于模值与该数绝对值之差。式中的n为补码的位数。
(2)根据真值求补码
根据补码定义可以求取一个数的补码,然而还可以采用更为简便的方法。求取一个数的n位补码的简便方法是:对于正数,通过补前0,将其数值部分补至n位即可;对于负数通过补前0,将其数值部分补至n位,然后按位取反并在末位加1即可。
【例1.15】求出以下各数的8位补码:
+1000011B,-111000B,+1111111B,-10000000B,0
① 将+1000011B的数值部分通过补前0达到8位,即可得到其补码:

      [+1000011B]补=01000011B

② 将-111000B的数值部分通过补前0达到8位,即00111000B。

      按位取反后得到:11000111B
      末位加1后得到:11001000B
      [-111000B]补=11001000B

③ 将+1111111B的数值部分通过补前0达到8位,即可得到其补码:

      [1111111B]补=01111111B

④ -10000000B的数值部分已达8位,即10000000B。

      按位取反后得到:01111111B
      末位加1后得到:10000000B
      [-10000000]补=10000000B

⑤ 用同样方法不难求得:

      [0]补=0

(3)根据补码求真值
补码最高位为0,则真值数符为“+”,真值数值位与补码其余位相同;补码最高位为1,则真值数符为“-”,将补码所有位按位取反且末位加1后就可得到真值的数值位。
用这种方法可以方便的将【例1.15】中求得的补码还原为对应的真值

补码这块有点复杂,以后再说

4.反码

反码的最高位表示真值的数符,0表示正,1表示负。当反码最高位为0,则其余位与真值的数值位相同;当反码最高位为1,则其余位是真值的数值位按位取反后的结果。

#第一次差不多就到这里 了。学不懂,难受。
汇编语言学习总结一汇编语言学习总结一附上一张美女,让心情好一点,不然下回自己都不想看这篇博客了。