那些年,我们一起学过的汇编----之伪指令

简介:

  弄懂了前面几篇关于基础的文章,下面就开始我们真正的汇编之旅了,在这一篇中我们着重来强调下汇编语言的伪指令。伪指令是汇编语言程序设计中的一个主要的部分,属于控制命令,在汇编语言中的数据定义、存储单元分配、指示程序结果等功能。

首先,我想很多人对伪指令语句与指令语句的区别不是太清楚吧,两者的区别在于:伪指令由汇编程序解释后完成相应的操作,会变厚不产生目标机器代码,进过汇编后的目标程序中,伪指令码已经不复存在。指令语句由汇编程序翻译成机器目标代码,一定有对应的目标代码,并且只能在程序运行时才能由CPU完成其操作。
 
一、符号定义伪指令
1】、等值伪指令EQU
伪指令格式: 符号名 EQU 表达式
功能:用一个符号名代替表达式的值,是符号名与表达式等价。
2】、等号伪指令“=”
伪指令格式: 符号名  =  表达式
等号伪指令“=”的功能、含义和表达式的内容等都与等值伪指令EQU基本相同,其主要不同点是:
a、等号伪指令允许重新定义。
b、等号伪指令后的表达式不能是指令助记符或关键字。
 
二、数据定义伪指令
1】、DB伪指令
伪指令格式:  变量名   DB, 表达式1[,表达式2][,表达式3....]
功能: 定义字节变量,每个表达式的值占一个字节。
字节的值域对于无符号整数为0--255, 对于有符号整数位-128--127, 个表达式之间用逗号隔开,变量名为各表达式中第一项数据在存储单元的符号地址,第一项数据后面的各项数据的单元地址依次在该符号地址上增一,如果某项数据的初值为“?”,则对应字节单元将不赋初值,其内容为不确定值。
2】、DW伪指令
伪指令格式:  变量名   DW, 表达式1[,表达式2][,表达式3....]
功能: 定义字变量,每个表达式的值占一个字。
字节的值域对于无符号整数为0--65535, 对于有符号整数位-32768--32767, 个表达式之间用逗号隔开,变量名为各表达式中第一项数据在存储单元的符号地址,第一项数据后面的各项数据的单元地址依次在该符号地址上增一,如果某项数据的初值为“?”,则对应字节单元将不赋初值,其内容为不确定值。
3】、DD伪指令
其格式与功能同DB/DW,不同点是它定义的是双字变量。
4】、DQ伪指令
其格式与功能同DB/DW,不同点是它定义的是四字变量。
5】、DT伪指令
其格式与功能同DB/DW,不同点是它定义的是五字变量。
 
三、LABEL属性定义伪指令
伪指令格式: 名称   LABEL 类型
功能:为当前的变量或标号定义一个新的类型,其功能同PTR运算符
LABEL指令通常与指令语句或数据定义伪指令连用,这时名称就为与之连用的数据定义伪指令语句或指令语句中的变量或标号定义一个新的变量名或标号,以便补充和设置与之连用的变量或标号的类型属性,因此,LABEL伪指令的名称同样具有段、偏移量和类型3个属性。
 
四、SEGMENT/ENDS段定义伪指令
之前我们都知道Intel 8086/8088  CPU是通过4个段寄存器按分段寻址的方式来方位1MB的存储器的,因此汇编语言源程序也是按段来组织的,一个程序可以由多个逻辑段组成,分别来存放数据、作堆栈使用、存放主程序、存放子程序等,而构造这些段用段定义伪指令SEGMENT/ENDS。
段定义伪指令格式:
 
 
  1. 段名  SEGMENT [定位类型][组合类型][类别名] 
  2. ....        ;段的主体部分 
  3. 段名  ENDS 
功能:用于把程序分成若干个逻辑段,这些逻辑段根据其用途的不同分为代码段、数据段、堆栈段和附加段。
1、定位类型
定位类型有5中:PARA、PAGE、DWORD、BYTE、WORD。
2、组合类型组合类型指定段与段之间的连接和定位关系,组合类型有6种:
NONE、PUBLIC、COMMON、STACK、AT、MEMORY
3、类别名
 
五、ASSUME段寻址伪指令
当CPU要访问存储器中某个存储单元时,要把逻辑地址转换成物理地址,那么要由某个段寄存器提供该存储单元所在逻辑段的段基值,因此,要指定逻辑段与CPU中各段寄存器之间的关系,而段寻址伪指令ASSUME就是用来指示汇编程序对应关系的。
段寻址伪指令格式:ASSUME 段寄存器名:段名, 段寄存器名:段名, ....
其中段寄存器为CS, DS, SS, ES中的一个,段名是由SEGMENT/ENDS定义的段名。
 
六、PROC/ENDP过程定义伪指令
   如果你懂一门最基本的语言,比如C语言的话,那这个伪指令应该会很好理解的,它跟高级语言的模块化程序设计有点像,就是一个子函数,这样才能使我们的程序实现“高聚合,低耦合”。
过程定义伪指令格式:
 
 
  1. 过程名 PROC    [NEAR/FAR] 
  2.     ..... 
  3.     RET 
  4.     ..... 
  5. 过程名 ENDP 
这里的过程名就是在汇编程序中CALL的操作数,每一个过程中肯定要有一个返回指令RET,它可以在过程的任何位置。一个过程也不一定只有一条返回指令。
 
七、ORG定位伪指令和$当前位置计数器
当前位置计数器是一个功能很强大的伪指令,例如:
 
 
  1. DATA    SEGMENT 
  2.     STRING  DB  'YangZhiSen' 
  3.     LENG    DB  $-STRING 
  4. DATA    ENDS 
在上例中,有对$的使用,LENG的值就为字符串STRING的长度,
对于ORG定位伪指令的格式:
ORG 表达式
功能:将表达式的值赋给当前位置计数器,ORG语句后面的指令或数据以表达式给定的值作起始偏移量。
 
八、TITLE标题伪指令
标题伪指令格式:
TITLE 标题名
功能:给程序指定一个标题,以便在列表文件中每一页的第1行都显示这个标题。
 
九、END程序结束伪指令
程序结束伪指令格式:
END 起始地址
功能:标志源程序结束,并指定程序运行时的起始地址,即一方面告诉编译程序END伪指令后面的任何语句在汇编时都被省去,另一方面又告诉汇编程序在程序装入内存时根据起始地址的段基值和偏移量分别自动装入CS和IP中。
 
十、PUBLIC和EXTRN模块连接伪指令
因为这个我暂且未用到,所以有待以后再说。
 
 
     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/939403,如需转载请自行联系原作者

相关文章
|
数据安全/隐私保护
Win32汇编:算术与伪指令
每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备,加密数据,以及实现高速图形运算时特别有用,移位指令也是汇编语言中最具特征的指令集,`移位(Shifting)`的含义是在操作数内向左或向右移动数据位,Intel处理器提供了多种移位指令,具体如下表所示:
245 0
|
Android开发
【Android 逆向】x86 汇编 ( align | db | dw | dd | nop | 伪指令 )
【Android 逆向】x86 汇编 ( align | db | dw | dd | nop | 伪指令 )
187 0