请问: 为什么不允许原操作数和目的操作数都为内存地址?

aurora001 2009-06-02 06:11:57
我是新手,看那些指令是发现好像所有指令都不允许目的操作数和原操作数同时为内存寻址的,为什么呀?
...全文
1053 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycwp12 2009-06-11
  • 打赏
  • 举报
回复
cpu的存在。最为中转站,快速的进行处理数据。立即数可以存到内存 ,段寄存器也可以存在内存,通用寄存器也可以的。不过原操作数和目的操作数是在8086上说的。用MOV指令和一些汇编指令进行使用时说出来的。处理的实质是CPU的完成
gzgzlxg 2009-06-11
  • 打赏
  • 举报
回复
86系列的指令 rep movsb(w,d) 或类似的比较、查询指令,都是通过数据总线直接完成的,也就是从内存直接到内存,对于单个数据移动指令,那是一定将CPU做中转站的。
  • 打赏
  • 举报
回复
没错,(大部分)x86指令其实是宏指令,要分解成若干risc86指令再执行。从Pentium开始就如此了(也许AMD K6/2)。

小赌移情 2009-06-10
  • 打赏
  • 举报
回复
Intel的x86並非純CISC, 指令其實都是由微指令來完成的...
  • 打赏
  • 举报
回复
呃……Intel CPU支持立即数到内存,所以17字节的指令是存在的……
================================================================
不存在,最长15字节。x64并不支持64位立即数到内存(64位地址),只能32位立即数到内存(32/64位地址)。



事实上Intel 所使用的CISC本身就是效率低下的代名词。
最简单的例子是指令不能和数据一样对齐到边界,这个损失其实还是不小的。(Intel使用了指令Cache,所以平时看不出来,但是一旦Cache不中,呵呵呵……就等着几十个时钟周期废掉吧。
================================================================
综合而言,x86/x64的效率还是很高的,浮点性能差一些。并非只是靠兼容取胜。
cache不命中,刷新肯定是要损失十几到几十时钟周期的。risc架构也免不了。
goodider 2009-06-10
  • 打赏
  • 举报
回复
还是设计理念上的问题。INTEL不能。不代表别的系统就没有。
Tippisum 2009-06-10
  • 打赏
  • 举报
回复
呃……Intel CPU支持立即数到内存,所以17字节的指令是存在的……
事实上Intel 所使用的CISC本身就是效率低下的代名词。
最简单的例子是指令不能和数据一样对齐到边界,这个损失其实还是不小的。(Intel使用了指令Cache,所以平时看不出来,但是一旦Cache不中,呵呵呵……就等着几十个时钟周期废掉吧。
  • 打赏
  • 举报
回复
x86的不定长指令编码理论上是允许无限制扩充的。
不过内存到内存操作,64位地址模式的话,一条指令至少长17个字节,有点恐怖。:)


nanlingcg 2009-06-09
  • 打赏
  • 举报
回复
使CPU更复杂且失去汇编的延续性,除一些不必保存的双操作数适用外,对一些仍需保存原操作数可能不太适用,而且可能会牺牲CPU的某些性能。
估计是得不偿失吧!
killbug2004 2009-06-09
  • 打赏
  • 举报
回复
intel指令编码个人感觉好乱,为了应对新的需求扩展指令和寻址方式,说不定哪天就支持内存到内存的操作指令,做预言是愚蠢的,但是个人觉得按照这样的趋势发展会很尴尬,不过intel太普及了
  • 打赏
  • 举报
回复
主要还是为了节省指令编码空间,不是访问效率的问题。
M<->M的访问效率也可以很高,使用cache是常规的方法,有没有寄存器都可以这么用,还可以在执行单元中集成数百字节的超高速缓存,访问速度等同于寄存器,作为cache的cache。
xyblack 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 crossrowman 的回复:]
这个要从OpCode的寻址方式来理解
opcode定义寻址采用oorrrmm(占用指令的一个Byte)的方式进行
正常情况下(opcode的d位为0时)
rrr用来指示目的操作数
oo+mmm组合决定源操作数 该操作数可以为寄存器也可为内存地址

总的来说 由于OpCode只给操作数留了一个供内存寻址的位置 所以我们看到的汇编指令中最多只能有一个内存寻址操作数
[/Quote]

从opcode来考虑没有太大意义,因为opcode本身就是intel定义的指令格式。

应该还是从效率来考虑的吧。
因为我们假设cpu可以使两个内存单元进行相互传送。那么它必定需要一个缓存区来进行保存源地址的数据,然后将缓存区的数据mov到目的内存单元,另外一点因为我们如果要对我们的内存单元中的数据进行操作,将他取得到寄存器中在进行操作,无疑效率是颇高的。


  • 打赏
  • 举报
回复
transmeta曾经有一款处理器就提供内存到内存操作,而且根本就不提供寄存器,只有内存到内存操作。:)
shuiyeweizhi 2009-06-09
  • 打赏
  • 举报
回复
这是硬件设计的原因。intel不这样设计。但是飞思凯尔(摩托罗拉前半导体部)的就提供这样的指令。
cnzdgs 2009-06-02
  • 打赏
  • 举报
回复 1
因为这样设计会使指令系统很复杂,而且没有必要提供这样的指令。
crossrowman 2009-06-02
  • 打赏
  • 举报
回复
这个要从OpCode的寻址方式来理解
opcode定义寻址采用oorrrmm(占用指令的一个Byte)的方式进行
正常情况下(opcode的d位为0时)
rrr用来指示目的操作数
oo+mmm组合决定源操作数 该操作数可以为寄存器也可为内存地址

总的来说 由于OpCode只给操作数留了一个供内存寻址的位置 所以我们看到的汇编指令中最多只能有一个内存寻址操作数
大熊猫侯佩 2009-06-02
  • 打赏
  • 举报
回复
速度!速度!
friendly_ 2009-06-02
  • 打赏
  • 举报
回复 1
如果都是内存寻址,即内存到内存,那还要cpu干嘛,要寄存器干嘛。
以上仅是个人观点。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧