汇编-第一章 基础知识

前言

本系列以,《汇编语言》-王爽,这本教材为基础展开。如果懒得看书和博客,可以参考小甲鱼的《零基础入门学习汇编语言》的视频教程。
1、编程语言、汇编、机器码区别
世面上有很多解释,但是我感觉一直没有说明为什么研究破解及外挂的朋友必须要学习汇编。那原因是什么呢?如下图所示:

这里写图片描述

如上图所示,以打印“Hello World”为例,各种语言有不同版本的写法,但是通过编译器编译后,都会生成相同的机器码(根据不同的CPU也可能有差异,目前理解为相同即可)。
为什么是相同的机器码?因为机器码是由CPU的生产商固化到CPU的,也就是指令集,所以CPU才能识别编译器生成的机器码。
打个比方,例如机器码1010就是打印“Hello World!”到屏幕的指令,这条指令被CPU生产商固化到CPU中。编译器或者IDE开发商就会根据CPU这条指令,将各种版本的打印”Hello World!“编译为1010。当CPU读取到1010时,就是进行打印“Hello World!”到输出设备的操作。
汇编语言的巧妙用处之一是,可以将不同语言生成的可执行程序,以汇编语言语法的方式展现出来。这就使得,在没有源代码的情况下,通过汇编语言调试各种语言编写的可执行程序成为可能。
例如可以利用OD工具,对读取到内存中,准备执行的程序,以汇编语言的形式进行调试。

2、内存地址空间

 “内存地址空间”是一个很重要的概念,再此着重阐述。其它内容,书本中已经讲的很清楚,不再累述。本节重点是搞清楚,内存单元、内存单元地址、数据与程序之间的关系,以及一些计算方法。

这里写图片描述
如图所示,左图为内存的物理存在形式,它说明“内存地址空间”是由各个硬件设备的存储构成的,大家了解即可。
右图是我们应该重点掌握的,它是“内存地址空间”的逻辑结构,
由两部分组成,“内存单元”、“内存单元地址”,且是连续的,在右图中分别用1、2标注。
“内存单元”是用来存储程序、数据的,它的最小单位是bit即一个2进制位,8个bit=1个Byte=1个字节,我们在写程序时习惯采用字节为最小单位。
“内存单元地址”是用来索引“内存单元”的,它存储了“内存单元”在“内存地址空间”中唯一的编号,它与内存单元的表现形式是一样的,都是用2进制表示的,它的大小、位数与地址总线的宽度有关。
如右图所示,8086CPU的地址总线是20,所以它的“内存单元地址”用20位2进制表示,大小为2^20=2^10*2^10=1MB, 1MB说明8086CPU可以索引到1MB个“内存单元”。再例如我们常用的win32位操作系统,它的地址总线宽度为32,所以它的“内存单元地址”用32位2进制表示,大小为2^32=2^2*2^10*2^10*2^10=4GB,说明可以索引4GB个“内存单元”,这也说明了为什么win32操作系统的内存最大只能是4GB。
在实际编程中,我们通常用16进制来表示“内存单元”、“内存单元地址”的内容。如右图所示,内存单元地址为000000000000的内存单元,它的内容是11100000。用16进制可以表示为,内存单元地址为00000的内存单元,它的内容是E0。
我们还需要掌握如下计算知识:
1、通过地址总线宽度 求 内存地址空间大小
2、通过内存地址空间大小 求 地址总线宽度
通过公式,内存寻址能力即内存地址空间=2^地址总线宽度,即可解决以上2个问题。例如地址总线宽度为32,则内存寻址能力为2^32=2^2*2^10*2^10*2^10=4GB,即可以索引4GB个“内存单元”。这里需要说明一下,2^10代表1KB,2^10*2^10代表1MB,2^10*2^10*2^10代表1GB,所以要将2^32拆解成2^2*2^10*2^10*2^10的形式,来计算寻址能力。
反过来计算,4GB=2^2*2^10*2^10*2^10,指数相加为32,32即是地址总线宽度。
3、求某一段地址空间的大小
例如计算地址A000至FFFF的大小。
第一步,FFFF-A000+1=6000 计算出大小,注意此时是用16进制表示大小
第二步,6000=6*1000=6*16^3=6*(2^4)^3=6*2^12=6*2^2*2^10=24KB。 该步骤是将16进制转换成10进制。

检测点1.1

(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为
答:8KB=2^3*2^10,指数相加为13,因此地址总线宽度为13
(2)1KB的存储器有1024个存储单元。存储单元的编号从0到1023
(3)1KB的存储器可以存储8*1024个bit,1024个Byte
(4)1GB、1MB、1KB分别是
1*2^10*2^10*2^10
1*2^10*2^10
1*2^10*
个Byte
(5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力风别为:
2^16=2^6*2^10=32KB
2^20=2^10*2^10=1MB
2^24=2^4*2^10*2^10=16MB
2^32=2^2*2^10*2^10*2^10=4GB
(6)8080、8088、8086、80286、80386的数据总线宽度分别是8根、8根、16根、16根、32根,则它们一次可以传送的数据为:
1B
1B
2B
2B
4B

(7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。
(8)在存储器中,数据和程序以2进制形式存放。

引用

《汇编语言》清华大学出版社,王爽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值