第一章:基本概念

1.1欢迎来到汇编语言的世界

主要介绍与运行Windows 32位和64系统的Intel 和 AMD 处理器相兼容的微处理器编程

1.12汇编语言的应用

应用类型高级语言汇编语言
商业或科学应用程序,为单一的中型或大型平台编写规范结构使其易于组织和维护大量代码最小规模结构,因此必须具有不同程度经验的程序员来维护结构,这导致对已有的代码维护困难
硬件设备驱动程序语言不一定提供对硬件的直接访问。即使提供了,可能也需要难以控制的编码技术,这导致维护困难对硬件的访问直接且简单。当程序较短且文档良好时易于维护
跨平台性通常可移植,在每个操作系统上,源程序只做少量修改就能重新编译需要为每个不同平台单独重新编写代码,每个汇编器都使用不同的语法,维护困难

C和C++语言具有一个独特的特性,能够在高级结构和底层细节之间进行平衡。直接访问硬件是可能的,但是完全不可移植。大多数C和C++编译器都运行在其代码中嵌入汇编语句,以提供对硬件细节的访问

1.2虚拟机概念

计算机通常可以执行用其原生机器语言编写的程序。这种语言的每一条指令都可以简单到赢相对少量的电子电路来执行,为了简便,称这种语言为L0。
由于L0极其详细,并且只由数字组成,因此,程序员编写程序就非常困难。如果能构造出一种较易得新语言L1;那么久可以用L1编写程序。有两种实现方法:

  • 解释(Interpretation):运行L1程序时,他的每一条指令都由一个L0语言编写的程序进行译码合执行。L1程序可以立即开始运行,但是运行之前,必须对每条指令进行译码。

  • 翻译(Translation):有一个专门设计的L0程序将真个L1程序转换为L0程序。然后得到的L0程序就可以直接在计算机硬件上执行。

简洁的说就是程序员用某种高级语言写出来的代码再有某个解释器进行解释,Java编程语言就是以虚拟机概念为基础的。Java编译器把用Java语言编写的程序翻译成为Java字节码(java byte code) 。后者是一种低级语言,能够运行在java虚拟机(JVM)上程序快速执行。JVM已经在许多不同的计算机系统上实现了,这使得Java1程序相对而言独立于系统。

level 4高级语言
level 3汇编语言
level 2指令集架构(ISA)
level 1数字逻辑

指令集架构(level 2):计算机芯片制造商在处理器内部设计一个指令集来实现基本操作,如传送,加法和乘法。这个指令集也被称为机器语言。每一个机器语言指令或者直接在机器硬件上执行,或者由嵌入到微处理器芯片的程序来执行,该程序被称为微程序。

汇编语言(level 3):在ISA层,编程语言提供一个翻译层,来实践大规模软件开发。汇编语言出现在Level 3,使用短助符,如ADD,SUB,MOV,易于转换到ISA中。汇编程序在执行之前要全部翻译为机器语言。

高级语言(level 4):诸如C,C++和Java,这些语言所包含语句功能强大,并翻译为多条汇编指令,比如查看C++编译器生产的列表文件输出,就可以看到这样的翻译。汇编语言代码由编译器自动汇编为机器语言。

1.3数据表示

汇编语言程序员处理的是物理级数据,因此他们必须善于检查内存和寄存器。通常二进制数被用于描述计算机内存的内容,有时也用十进制和十六进制数,所以必须输了掌握数据格式转换。

系统基数可能的数字
二进制201
八进制801234567
十进制100123456789
十六进制160123456789ABCDEF

1.31 二进制整数

计算机以电子电荷集合的形式在内存中保存指令和数据。用数字来表示这些内容就需要系统能适应开/关(on/off)或者真/假(true/false)的概念。二进制数用两个数字做基础,其中每一个二进制数子不是0就是1,位自右向左。
比如 10的二进制数 1010
十进制转换二进制
10 转换 二进制 就是 1010
10/2 商为5 余0
5/2 商为2 余1
2/2 商为1 余0
1/2 商为0 余1
在反过来就是 1010

二进制转换10进制
1010 转换十进制
0x2的0次方 得0
1x2的1次方 得 2
0x2的2次方 得0
1x2的3次方 的8
最后相加 0+2+0+8=10

1.32二进制加法

两个二进制整数相加时,是对位处理的,从最低的一对(右边)开始,依序对位进行加法运算,两个二进制数字相加有四中不同的结果,如图所示:

0+0=00+1=1
1+0=11+1=10

两个二进制数相加如下
0000 0100 =4
0000 0111 =7
0000 1011 =11
逢2就进一位

1.33整数存储大小

再x86计算机中,所有数据存储的基本单位都是字节(byte),一个字节是8位,其他的存储单位还有如下

单位名称字节
字节8
16
双字32
四字64
八字128

大的度量单位 对于内存和磁盘空间而言,还可以使用更大的度量单位

1千字节 等于 2_10次方,或1024字节
1兆字节(MB) 等于2_20次方 ,或1048576字节
1吉字节(GB)等于2_30次方 ,或1073741824字节
1太字节(TB)等于2_40次方 ,或1099511629776字节
1拍字节等于2_50次方 ,或 1125899906842624字节;
等等

1.34十六进制整数

大的二进制数读起来很麻烦,因此十六进制数字就提供一种简便的方式来表示二进制数据;
十六进制整数中的1个数字表示4个二进制位,2个十六进制数字就能表示一个字节。一个十六进制数字表示的范围是0-15,所以用A到F来表示十进制数10-15;

无符号十六进制数转换10进制

十六进制数中,每一个数字位都代表了16的幂,这有助于计算一个十六进制数的十进制数值,假设使用下标来对一个包含4位数字的十六进制数编号D3,D2,D1,D0;下列计算了这个整数的十进制值:

dec=(D3X16_3)+(D2X16_2)+(D1X16_1)+(D0X16_0)

这个表达式可以推广到任意n位数的十六进制数上;

dec=(Dn-1X16_n-1)+(Dn-2X16_n-2)…(D0X16_0);

比如十六进制数:1234就等于 (1x16_3)+(2x16_2)+(3x16_1)+(4x16_0)=4660;
同样3BA4就等于 (3x16_3)+(11x16_2)+(10x16_1)+(4x16_0)=15268;

无符号十进制到十六进制的转换

十进制数:422

除法余数
422/16266
26/161A
1/1601
十六进制加法

调试工具程序,通常使用十六进制来表示内存地址,为了定位一个地址常常需要把两个地址相加,幸运的是十六进制和二进制加法是一样的只需要跟换基数就可以了

有符号二进制整数

有符号的二进制整数就有正数和负数,在x86处理器中MSB表示的是符号位0是正数1是负数

负整数的二进制数如何表示呢简单来说就其绝对值的二进制数在进行去取反+1操作
比如 -1的二进制数可以表示为
取绝对值 1 0000 0001
取反 1111 1110
+1 1111 1111

二进制的减法

二进制减法采用和十进制减法相同的方法,如下所示
01101 (十进制数 13)
00111 (十进制数 7)
从右开始算
1-1=0 所以最后一位是 0
0-1不够向左边借一位就 2-1 =1
因为借了1位所以就是 0-1 不够再向左借一位 2-1=1
然后最高2位都是0所以得到结果 00110
转换十进制就是6

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值