关于汇编语言读取指令问题

CPU内部的段地址和偏移地址都是十六位的;通过地址加法器合成二十位物理地址,如20000H;请问20000H这个物理地址只能表示2000:0这个内存单元啊,假如20000里面存放的是B8,20001里面存放的23,20002里面存放的01;为什么能通过20000H这个地址读取到mov ax,0123?

在16位字长的机器里,用什么办法来提供20位地址呢?在IBM PC机里采用了存储器地址分段的办法。

程序员在编程序时要把存储器分成段,每段大小可达64K,这样内存地址可用16位表示。IBM PC机对段的起始地址有所限制,段不能起始于任意地址,而必须从任一小段(paragraph)的首地址开始。机器规定:从0地址开始,每16字节为一小段(正如我们平时在16进制编辑器中看到的一样,一行16字节)。下面列出了存储器最低地址区的3个小段的地址区间,每行为一小段:

00000,00001,00002,。。。,0000E,0000F
00010,00011,00012,。。。,0001E,0001F
00020,00021,00022,。。。,0002E,0002F

其中,第一列就是每小段的首地址。其特征是:在16进制表示的地址中,最低为0(即20位地址的低4位为0)。在1M字节的地址空间里,共有64K个小段首地址,可表示如下:

00000H
00010H
00020H
。。。
41230H
41240H
。。。
FFFE0H
FFFF0H

在1M字节的存储器里,每一存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。CPU在访问存储器时,必须先确定要访问的存储单元的物理地址才能取得(或存入)该单元中的内容。20位物理地址由16位段地址和16位偏移地址组成,段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低4位一定是0,这样就可以规定段地址只取段起始地址的高16位值。偏移地址则是指在段内相对于段起始地址的偏移值。这样,物理地址的计算方法可表示如下:
XXXX XXXX XXXX XXXX 0000 (前面是16位,后面4位0是16位左移后补的)
+   XXXX XXXX XXXX XXXX
-----------------
XXXX XXXX XXXX XXXX XXXX (即20位)

也就是说:把段地址左移4位再加上偏移地址值就形成物理地址。或写成:
16 X 段地址 + 偏移地址 = 物理地址

根据上述原理,楼主要表示20001H这个物理地址中的数123h,则可以:
段地址设为2000H,偏移地址设为0001H
当然还可以:
段地址设为1F00H,偏移地址设为1001H

总之,段地址左移4位再加上偏移地址值=物理地址 即可。偏移地址在0000H至FFFFH之间。

不知这样说你是否明白?
mov ax,2000H
mov ds,ax
mov bx,1
mov di,ds:[bx] ; 取出的di即123h追问

谢谢你这么详细的回答,我想再请问一下mov ax,0123这条指令;

IP指向的只是2000:0这个内存单元,2000:0这个单元存放的只有B8,CPU是如何将2000:0001里面的23,2000:0002里面的01联系起来形成mov ax,0123这条指令的呢?这是机器码里面的知识了吗?

追答

原来还真的是讲主程序。按我上面说的,16X段地址+偏移地址=物理地址
CS就是段地址,IP就是偏移地址。即20000H+0000H=20000H。正好就是指令所在的物理地址。至于如何取、一次取多少字节,则是CPU的控制单元来控制的,比如该例mov ax,0123h3字节,则控制单元读取3字节,执行后,控制单元自动读取下一条指令来执行,它知道下一条指令是多少字节,IP能准确定位到相应地址。

追问

谢谢啦,我在汇编网也看到讨论的问题,是关于如何判断一条指令的长度的~指令有一个特征编码呀,CU(控制单元)通过特征编码,控制读取指令的长度的~我还是回头看汇编吧,这又牵涉到微机原理了~

追答

是的。就你的例子而言,mov ax,0123的机器码是B82301,其中B8就是操作码,二进制就是:
10111000
对应的操作码格式是:
1011wrrr
表明:1)这是一条mov指令;2)rrr=000,表明目标寄存器是ax;3)w=1,表明操作数是字而不是字节,即B8的后面应是2字节的操作数(0123H)。因此该指令共3字节。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-04
同学你想太多了,
CS=2000
IP=0000
通过cpu的地址加法器得到的物理地址是20000H
再通过输入输出控制电路将物理地址20000H送上地址总线,从20000H单元开始存放的机器指令通过数据总线送到CPU,输入输出控制电路将机器指令送入指令缓冲器,接下来IP自动增加,执行控制器执行指令。
具体的你可以去看王爽的《汇编语言》第二章,CS和IP本回答被网友采纳
相似回答