指令是怎样取到它的偏移地址?

RRUURR 2010-12-19 01:56:41

计算机内部的工作原理怎样?
由指令的二进制机器码可以判断出来么?
...全文
516 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shzhfu 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rruurr 的回复:]
指令的数据寻址与存储器寻址有什么区别?

存储器寻址是否由段地址,偏移地址确定?
数据寻址是否也一样?
[/Quote]
数据寻址应该是操作数寻址的统称,它包括存储器寻址、寄存器寻址和立即数寻址。

存储器寻址是由段地址和偏移地址确定,但偏移地址可以直接给出,也可以通过BX等寄存器给出。数据寻址中的另外两种寻址都是在指令中直接带着的,无需按地址去找。比如"add ax,1",指令中直接带有立即数1,所以CPU就知道要把1拿来做加法,而"add ax,bx"中的源操作数也是寄存器,CPU就知道要把它自身内部的2个寄存器AX和BX中的值拿来相加。"add ax,[0]"就不同了,CPU自己完不成这个操作,必须借助地址总线和数据总线,把内存中某个单元的内容拿过来,才能完成加法运算。

至于CPU从指令中如何知道是存储单元的寻址还是立即数或寄存器的寻址,那确实是“指令编码”中的问题了。因为计算机内部要把一切内容(包括指令和数据)都变成二进制数,所以,设计师在“指令编码”中是下了很大功夫的。具体编码我没仔细研究,就举个简单的例子帮你理解吧(假设我们规定目标操作数必须是AX)。

比如我们规定最高3位是运算方法:000是加法,001是减法;再后面2位表示寻址方式:00是立即数,01是寄存器,10是存储器;若是立即数,后面的十六位就是这个数,若是寄存器,后面的4位是寄存器的编号(假设0000-ax,0001-bx,0010-cx,...),若是存储器,则后面16位是偏移地址。

于是
000 00 0000 0000 0000 0001 你就知道是ADD ax,1
001 01 0010 那就是SUB ax,cx
000 10 0000 0000 1111 1111 就是 ADD ax,[00FFH]
(注意这些不是真实的机器指令编码!)
RRUURR 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 masmaster 的回复:]

楼主可以找些intel指令编码方面的资料研究一下。
[/Quote]

到论坛问,当然是求个结果啦!
masmaster 2010-12-20
  • 打赏
  • 举报
回复
楼主可以找些intel指令编码方面的资料研究一下。
RRUURR 2010-12-20
  • 打赏
  • 举报
回复
指令的数据寻址与存储器寻址有什么区别?

存储器寻址是否由段地址,偏移地址确定?
数据寻址是否也一样?
chzhn 2010-12-20
  • 打赏
  • 举报
回复
例如:
mov edi,[ecx+C]
RRUURR 2010-12-20
  • 打赏
  • 举报
回复
指令:
mov ax,1020h

机器码:
B82010

这条指令是怎样寻址?
masmaster 2010-12-19
  • 打赏
  • 举报
回复
同意1楼观点
zybzyb1987 2010-12-19
  • 打赏
  • 举报
回复
这完全是编译器的工作。每当编译到一新段,编译器自动添加一个计数器,初始值为0。然后根据段内代码和数据的长度,计数器逐步增加。每遇到一个变量,地址计数器都设置一个端点,以方便变量偏移地址的取用。
znxllyuan 2010-12-19
  • 打赏
  • 举报
回复
这个是编译器的事吧
abgood 2010-12-19
  • 打赏
  • 举报
回复
计算机内部的工作都是基于CPU的,CPU执行的是二进制代码

21,497

社区成员

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

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