客片欣赏文字:为什么目的操作数不能是立即数等问题?

来源:百度文库 编辑:中财网 时间:2024/04/30 06:44:30

问题:

我是一个编程爱好者,在决心学习汇编语言的时候,在选择教材时,我曾经徘徊不下,毕竟一本好书,一本好的教材.可以让一个程序员在学习时,能少走一点弯路,更重要的是,书中的编程风格,直接会影响到读者本人.

在一个朋友的介绍下,我接触了你写的<<新版汇编语言程序设计>>,读后让我受益匪浅.与别的大学的教程相比,你的教程,叙述通俗易懂,主次分明,突出重点,特别是计算机的一些术语的解释.

读到2章后,我有一点疑问,就在群里发表.大家虽然也能回答,但说到原因,"为什么不能",个个就目瞪口呆了,所以不好意思,就来向你请教,本想发表在你的微辅网上,但今天发现,好象打不开,所以就给你发电子邮件了.

问题如下:能否给个详细描叙,这恐怕也是初学汇编的学生都想提出的一个代表性问题

<1>为什么目的操作数不能为立即数?(是结果没有地方存么?)

<2>为什么段寄存器之间不能传递数据?

<3>为什么目的操作数不能为段寄存器?但有的大学教程说除了cs外,别的可以,真把我搞糊涂了.

<4>为什么两存储器地址间不能传送数据?


解答:

你的问题是初学者常见的问题。问题的解答很简单,处理器设计时已经确定这样实现,无法改变。
具体来说:

<1>为什么目的操作数不能为立即数?(是结果没有地方存么?)
立即数是编码在处理器指令代码中的,而处理器指令代码执行时通常禁止修改。所以,结果无法存在指令代码中。

<2>为什么段寄存器之间不能传递数据?
段寄存器的改变会影响程序的执行,不应该随意改变。所以,设计师考虑不设计这个功能的指令。毕竟,设计一条指令就需要具有相应的实现电路。

<3>为什么目的操作数不能为段寄存器?但有的大学教程说除了cs外,别的可以,真把我搞糊涂了.
少数几个指令允许段寄存器为目的操作数,例如MOV和POP指令。但通常不要改变CS、即将CS为目的操作数,因为这样程序执行的位置就改变了。绝大多数指令都不把段寄存器作为操作数,不管是目的操作数还是源操作数,例如算术逻辑运算指令。

<4>为什么两存储器地址间不能传送数据?
如果设计两存储器地址互相传送数据,在指令代码中需要两个指明存储器地址的字段,通常会大大增加指令代码的长度,还会增加指令解码的难度和电路复杂性。

总之,指令的设计需要硬件电路支持,不是随心所欲的。这就是用汇编语言进行编程为什么很烦琐的原因之一。