设计环境基础

取自<<汇编语言程序设计>>第一章节

书籍下载地址:

汇编语言程序设计

处理器指令

操作系统最底层,所有计算机处理器都按照厂商在处理器芯片内部定义的二进制操作数据。这些预制的代码被称为指令码。不同操作类型的处理器有不同的指令码

当计算机处理芯片运行的时候,他读取存储在内存中的指令码,每个指令码集合可能包含一个或者多个字节信息,这些字节信息指示处理器完成特定任务。每条指令码都是从内存读取的,指令码所需要的数据也是从内存中读取的。包含的 内存字节和包含处理器的使用数据字节没有区别。

为了区分数据和指令码,要使用专门的指针,帮助处理器跟踪数据和指令码存储在内存中的什么位置(数据指针和指令指针)

指令指针用来帮助处理器标识哪些指令已经被处理过,以及接下来要处理哪些指令码。当然有专门的指令码能更改指令指针的位置,比如跳转到特定位置。

数据指针用于帮助处理器了解内存中数据区域的起始位置是在哪里。这个区域被称为堆栈。当数据存入堆栈的时候,指针向下移动,读取的时候指针向上移动

每条指令必须包含一个操作码(opcode)。

指令码格式

Intel IA-32 系列微处理器包括IBM平台的微型计算机使用的所有当前类型的微处理器。IA-32指令码主要由四个部分构成

1)可选的指令前缀

2)操作码

3)可选的修饰符

4)可选的数据元素

操作码定义了要执行的功能

1.操作码

每个指令都必须要包含操作码,定义了处理器要执行的最基本任务     

比如OF A2 定义了CPUID指令。当处理器执行这个指令码的时候,它返回不同寄存器中关于微处理器的特定信息。程序员可以使用其他指令码提取信息,用来获取cpu程序的微处理器型号

2.指令前缀

指令前缀可以包含1~4个修改操作吗行为的1字节前缀。修改操作码的时候,每个组的前缀一次只能使用一个。这4个前缀组如下:

锁定前缀指令前缀将独占的使用共享内存区域。

重复前缀用于表示重复的功能。

段覆盖前缀定义了可以覆盖定义了的段寄存器指令。

操作数长度覆盖前缀通知处理器,程序性将在操作码之内切换16位和32位操作数长度,这使程序可以在使用大长度的操作数时候警告处理器,帮助加快寄存器的数据赋值

地址长度覆盖前缀通知处理器,程序将切换16位和32位的内存地址。

3.修饰符

一些操作码需要另外的修饰符来定义执行功能中涉及到什么寄存器和内存位置。

修饰符包含三个单独值中:

寻址方式说明符(ModR/M)字节

比例-索引-基址字节

1、2或者4个的移位字节

(1)ModR/M 字节

mod和r/m一起使用用于定义指令中使用的寄存器或者寻址模式。指令中寻址模式有24个加上8个可以使用的通用寄存器,所以有32个值。

reg/opcode字段用于允许使用更多的三位进一步定义操作码的功能,或者可以定义寄存器的值。

r/m字段定义用作该功能操作数的另一个寄存器 ,或者可以和mod结合在一起定义寻址模式

(2)SIB字节

比例字段指定操作的比例因子。

索引字段指定内存访问中用作索引寄存器的寄存器

基址指定用来内存访问的基址寄存器的寄存器

(3)地址位移字节

用来指定ModR/m和SIB字节中定义的内存位置偏移量。

4.数据元素

一些指令码从内存位置或处理寄存器读取数据,而一些指令码在其本身之内包含数据。

例如:

C7 45 FC 01 00 00 00 

C7是opcode 操作码

45 FC 是修饰符

最后四个是数据元素 01 00 00 00 ,不同处理器大小端排列也不一样

高级语言

编译语言:

解释器语言:

php

混合语言:

java

汇编语言

汇编语言允许程序员直接创建指令程序,无需担心处理器上众多指令码集合的组合。汇编允许使用助记符表示指令码。

汇编由三个组件构成

1)操作码助记符

2)数据段

3)命令

这样更容易理解每个指令什么意思,而不需要理解每个字节的作用,更加容易理解。

1.定义数据

HLL 程序:

汇编也允许这么做,而且有更大的控制权

1)使用内存位置

汇编语言定义变量有两个部分

指向内存位置标记;内存字节的数据类型和默认值

格式:

名字:
    .类型 默认值

  数据存储:

一个小例子:

第一条指令把 testvalue标记指向内存位置的4字节载入EBX 寄存器

第二条指令把EBX寄存器值加10

最后一条指令把ebx存储到testvalue

2.使用堆栈

在汇编中用来存储和检索数据的另一种方法叫堆栈。堆栈是特殊的内存区域,经常保留在程序中的函数之间传递数据。也可以使用它临时存储和检索元素。

3.命令

汇编中使用最重要的命令是.section。这个命令定义内存段,汇编语言程序在其中定义元素。所有汇编程序至少有三个必须声明的段落

数据段:用于声明为程序存储数据元素的内存区域,这一段不能扩展是静态的(代码中初始化的全局变量)

bss段。程序中声明数据的缓冲区。这一段特殊之处在于缓冲区内存区域是0填充的(代码中未初始化的全局变量)

文本段:存储指令码的区域(通常是指用来存放程序执行代码的一块内存区域)

联想linux进程环境

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值