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

首先,我想很多人对伪指令语句与指令语句的区别不是太清楚吧,两者的区别在于:伪指令由汇编程序解释后完成相应的操作,会变厚不产生目标机器代码,进过汇编后的目标程序中,伪指令码已经不复存在。指令语句由汇编程序翻译成机器目标代码,一定有对应的目标代码,并且只能在程序运行时才能由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模块连接伪指令
因为这个我暂且未用到,所以有待以后再说。

转载于:https://blog.51cto.com/yiluohuanghun/939403

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

  1. linux汇编伪指令大全,ARM汇编的伪指令(一)

    ARM汇编伪指令介绍 在ARM汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,这些特殊指令助记符被称为伪指令,他们所完成的操作称为伪操作.伪指令在源程序中的作 ...

  2. linux汇编伪指令大全,RM汇编的伪指令(二)

    2)ARM杂项伪指令 1.ADR伪指令:小范围的地址读取伪指令. ADR指令将基于PC相对偏移的地址值读取到寄存器中.在汇编编译源程序时,ADR伪指令被编译器替换成一条合适的指令.通常编译器用一条AD ...

  3. 学 Win32 汇编[6]: 伪指令 DUP 与数组

    为什么80%的码农都做不了架构师?>>>    声明数组实例: ; Test6_1.asm .386 .model flat, stdcallinclude windows.inc ...

  4. 哈哈日语 日语五十音学记资料汇编

    每个小格内从左至右依次为:平假名.片假名.罗马读音.(括号内是与其他重复的) 新人加+日语群:376675070,,每天都有免费课程~! 表的横向称为[行],每行五个假名,共十行. 纵向称为[段],每 ...

  5. ARM汇编杂项伪指令

    杂项伪指令 杂项伪指令在汇编编程设计较为常用,如段定义伪指令,入口点设置伪指令,包含文件伪指令,标号导出或引入声明等,该类伪指令如下:          边界对齐: ALIGN.          段 ...

  6. 处理器startup.s 常见汇编指令,伪指令解释 .globl _start .section .data .text .align

    .section .data 汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为汇编指示(Assembler Directive)或伪操作(Pseudo- ...

  7. 汇编segment伪指令

    segment是段,是段定义的伪指令.在汇编中有数据段,代码段,堆栈段和附加段 [格式] segment_name SEGMENT [定位类型] [组合类型] [类别名] ···;here is yo ...

  8. 汇编 控制流伪指令 .break .continue .else .elseif .endif .endw .if .repeat .until .untilcxz .while

    条件控制流伪指令 .break .continue .else .elseif .endif .endw .if .repeat .until .untilcxz .while 条件控制流语法如下: ...

  9. 汇编: dup伪指令

    dup可以重复定义前面的数据 assume cs:code, ds:datadata segmentdb 10 dup (0) ; 连续定义10个字节型的0db 1,2,3,4,5,6 db 10 d ...

最新文章

  1. html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容
  2. Python中Queue.get()方法阻塞
  3. 程序世界的秘密(下)(完)
  4. php 一致性hash,【转载】memcache分布式 [一致性hash算法] 的php实现
  5. rancher添加私有仓库_CocoaPods搭建私有库
  6. android 重启app_[Boot]Android系统启动-zygote篇
  7. Groovy里使用Runnable实现多线程
  8. 常用排序算法-java实现(希尔,归并)
  9. Java static变量
  10. html5怎么把表格边框设为0,css表格边框怎么设置
  11. 迅手系统连接不到服务器,逆火快速上手.doc
  12. SpringBoot之下载Excel
  13. APS系统六大要素是什么?企业导入APS(高级生产计划与排程)有哪些好处?
  14. 看《李开复先生谈创新思维》
  15. 攻防世界MISC刷题1-50
  16. vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据
  17. kubernetes API 访问控制之:准入控制
  18. 人脸识别数据集-Glint360K
  19. python函数关键字参数传递_Python给函数传递不定关键字的参数
  20. 射频知识——基本概念和术语

热门文章

  1. C#编码标准--编码习惯
  2. 发送邮件程序(Csharp2005)
  3. Simple Dynamic Strings(SDS)源码解析和使用说明二
  4. C和C++安全编码笔记:指针诡计
  5. 【C++】C++11 STL算法(三):分隔操作(Partitioning operations)、排序操作(Sorting operations)
  6. 【python】使用python脚本将CelebA中图片按照 list_attr_celeba.txt 中属性处理(删除、复制、移动)
  7. 【python】使用python脚本将CelebA中同一人的图片捡到对应单独的文件夹中
  8. c语言规定预处理命令必须以什么开头,C语言规定预处理命令必须以___________开头...
  9. envoy实现_网络通信与治理,谁更在行?Envoy 和 Nginx 对比 | 本月送书活动来啦
  10. proxmoxve打造云桌面_AIO攻略 | 桌面云是如何解决外设问题的?