. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  【热烈讨论】汇编中的伪指令  [待解决] 回复[ 8次 ]   点击[ 1501次 ]  
fishboy
[帖 主]   [ 发表时间:2007-10-29 17:02 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
hellowworld老兄的一个“dw是伪指令”,引发了伪指令的讨论。在dreamhk的博客中不少人写下了自己的意见,可以看出,对于伪指令的认识,大家还是有比较大的分歧的。
本人现在将这个问题提到论坛里来,希望大家都来讲讲自己的看法,也希望高手能给个比较权威的说法。
希望得到以下问题的答案:
(1)什么是伪指令?伪指令和指令的区别是什么?
(2)汇编中那些是伪指令?标号算是伪指令吗?
大家对伪指令有什么疑问也可以跟帖提问,大家一起来明确汇编语言中伪指令的概念。首先,本人附上自己查到的一些资料(摘自百度贴吧)。
[指令语句] 
每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句。每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于计算机内的中央处理器(CPU)、存储器、I/O接口等硬件设备来实现的。 

[伪指令语句] 
伪指令语句是用于指示汇编程序如何汇编源程序,所以这种语句又叫命令语句。例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中哪些是当前段,它们分别由哪个段寄存器指向;定义了哪些数据,存储单元是如何分配的等等。伪指令语句除定义的具体数据要生成目标代码外,其他均没有对应的目标代码。伪指令语句的这些命令功能是由汇编程序在汇编源程序时,通过执行一段程序来完成的,而不是在运行目标程序时实现的。
另外,本人在博客里转载了几篇关于伪指令的文章,供讨论者参考。
http://www.asmedu.net/blog/user/mypost.jsp?neighborId=1118&kindLevel=1&kindId=2821
我们的目标是“知其然,知其所以然”!希望高手们不吝指教。
sunshine
[第1楼]   [ 回复时间:2007-10-30 09:09 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
1 dw 是伪指令.它没有对应的机器码
2 汇编语言组成:指令,伪指令,符号. 他们属于并列关系.
3 标号属于符号范围
我的意见
fishboy
[第2楼]   [ 回复时间:2007-10-30 11:16 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
比如说地址标号 A: ... jmp A ,在编译后,程序中的A就被赋值了 ,比如jmp A 就成了形如 jmp 1234H 的了。也就是说,标号的处理是在编译期间,不是在运行期间,应该属于伪指令的定义范畴啊。不明白了。
Wednesday
[第3楼]   [ 回复时间:2007-10-30 21:27 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
比如说地址标号 A: ... jmp A ,在编译后,程序中的A就被赋值了 ,比如jmp A 就成了形如 jmp 1234H 的了。也就是说,标号的处理是在编译期间,不是在运行期间,应该属于伪指令的定义范畴啊。不明白了。
------------------
回复:我觉得你思路上弄乱了。确实,伪指令的处理是在编译期间,不是在运行期间。但是不能说——在编译期间处理的源程序元素就是伪指令啊。

楼主转载的文章(《汇编伪指令二》)中如是阐述:

标号或名字是由用户自定义的标识符,指向存储单元,分别表示其存储内容的逻辑地址。标号指示硬指令的地址,变量名指示所定义变量的开始地址,段名指示相应短的起始地址,子程序名指示相应子程序的开始地址,所以标号和名字一经定义,就具有以下三种属性: 
1、段值:标号和名字对应存储单元所在的段地址。 
2、偏移值:标号和名字对应存储单元所在段的段内偏移地址。 
3、类型:标号、子程序名的类型可以是NEAR(近)或FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等。 

综上,个人认为: 
问题的所在无非是 标号 的界定(它们到底是不是伪指令?)。对于 END  [ 标号 ],这样的表达方式,标号充其量是 END 伪指令的参数罢了。

此外,在汇编语言中伪指令和指令的区别,我觉得至少有两点:
一个是静态的:伪指令在指令集中没有对应的机器码,也就是说它不能直接指导机器的运行,而指令有,能;
一个是动态的:伪指令在编译过程中由编译器处理,指导编译器对源程序的编译过程,而指令被编译器编译为对应的机器码,直接参与程序执行,或者说是程序功能实现的主体的必要元素集合。

以上描述是个人的理解(尤其是 静态动态 之说法),不妥之处,望各位不吝赐教!
suzukilt
[第4楼]   [ 回复时间:2007-10-31 19:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-29 22:20
同1楼

伪指令不产生机器码, 仅仅是给汇编程序看的

标号 是个符号地址,不是伪指令
fishboy
[第5楼]   [ 回复时间:2007-11-01 12:20 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
我这样理解一下,看看有什么意见不:
伪指令不产生机器码,从这一点来看我们的标号。从debug中可以看到,标号在编译后,在标号的声明处并没有产生内存来存放标号产生的机器码,也就是说,标号在定义的时候根本就没有产生机器码,也就没有占据程序中的任何空间。符合伪指令不产生机器码的定义范畴。同样,dw这样的数据定义标识,也同样没有在编译后的程序中占用任何空间,可见,其也没有产生机器码,也是伪指令。
我现在也就理解到这个程度了。至少能说服自己标号是伪指令了。
Wednesday
[第6楼]   [ 回复时间:2007-11-02 10:41 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
所有的杯子都能装水,
水桶能装水,
所以水桶是杯子。

上升到逻辑学了阿,哈哈

按照楼上这位朋友的意思和逻辑学中的这个悖论,推而广之,源程序中的注释符号“;”也可以称作伪指令了。

之所以汇编语言中有指令,伪指令和其他符号的概念划分,是因为它们之间互相区别,各有性格,不然就都叫汇编指令算了(不排除它们有共性分享)。

对于这种概念的划分,我觉得同我们定义生活中的其他所有事情一样,可以称它为thing_a ,可以称他们为thing_b,但是我们为什么最后决定把它叫做thing_c 呢?是因为它具有 c 类事物区别于 a 类和 b 类事物个性。而我们定义一个事物的过程也是逐渐认识一个事物的过程,认识了事物,我们就要把它和其他事物加以区分,区分的依据就是他的个性,万万不能是它和其他事物的共性吧?!

指令的个性:与机器码一一对应;
伪指令的个性:指导编译器工作;
标号的个性:没有固定的名称;

指令和伪指令的区分点:是否有机器码与之对应,最终能否被机器执行,影响程序的功能实现;
伪指令和标号的区分点:是否有明确且固定的名称。(依据我的认识,我的表达)

还有一个问题,我们为什么要定义世间万物呢?
是因为我们要使用它们,更加合理的定义它们能够是我们找到更加合理的使用他们的方法,不然宇宙尚洪荒,天地且玄黄,世间万物混沌中生,混沌中灭。

大家继续交流。
philmei
[第7楼]   [ 回复时间:2007-12-21 21:08 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
我不听什么这个那个的!
能编译掉的就是伪指令。
转为机器语言的就是指令。
解释那么多干嘛,麻烦。。。
Wednesday
[第8楼]   [ 回复时间:2007-12-23 09:57 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
不求甚解

有的时候是一种境界

有的时候是一种无知
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved