汇编基础(1)

        一直想了解下汇编,觉得Richard Blum的《汇编语言程序设计》还是相对讲的通俗、实践性强一点。选择它主要还是因为和Linux打交道的日子比较多,书里的汇编版本也是比较经常会见到的AT&T的风格。毕竟它是一门与机器相关的语言,选择一个什么样的环境来了解还是需要考虑一下的,这里用Intel IA-32平台 + Ubuntu 10.04(2.6.32),文中的插图摘自原书。


机器指 令码格式

注意,这里的指令码其实就是若干字节的十六进制数据。

一、修饰符
定义执行功能中涉及到的寄存器和内存位置,从图上看一共包含三部分
  • 寻址方式说明符字节(ModR/M)
  • 比例-索引-基址字节(SIB)
  • 1、2或4个地址位移字节
二、数据元素
表示静态数据(比如要加的数据)或者内存位置, 其长度可以包含1、2或者4个字节的信息。
例如指令码:C7 45 FC 10 00 00 00,它定义操作码C7,把值传送到内存位置的指令。内存位置由45 FC表示,45表示EBP寄存器中的值,FC表示所指示的内存地址开始的4个字节。10 00 00 00表示放置到这个内存块里的数值内容,其实就是1,注意计算机数据分布的大小端表示。要是这样写程序,会让人疯掉的,所以出现了下面要说的高级语言(编译型和解释型)。


高级语言到机器语言

总要有个高级语言到机器语言的转换过程,最终还是转换为CPU认识的指令语句,过程如下:

这个过程其实就两个步骤:
  • 把高级语言(C/C++等)编译为目标代码。
  • 连接原始指令码来生成可执行文件。
目标代码(*.obj)在宿主机上不能运行的,因为每种操作系统只能识别特定的可执行文件的格式,而且当前的目标代码很有可能要和其他的目标代码的功能,于是连接器(Linker)就产生了。连接器把应用程序的目标代码文件和应用程序所有需要的附加其他的目标文件连接起来,并且生成目标操纵系统(这里考虑交叉编译的情况)可以识别的可执行文件输出格式,这个过程还是比较容易理解的。
这里特别说明JAVA,其被编译为字节码的形式,字节码和处理器上看到的指令码类似,但它本身比不和任何系列的处理器兼容,相反,JAVA通过JAVA虚拟机(JVM)进行解释,JAVA虚拟机单独运行在宿主的计算机上。JAVA字节码是可以移植的,就是说它可以同过任何类型的宿主计算机的任何JVM来运行。其优势在与ORACLE提供了不同平台的特定JVM,这些JVM用于解释形同的字节码,从而无需从源代码重新编译。


汇编语言构成

使用助记符表示指令码,类似于使用英文样式的词语表示指令码,而让汇编器来讲汇编语言助记符转换为原始指令程序,汇编语言的构成:

1、操作码助记符,如常见的push、mov;助记符没有统一的标准&
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值