. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  28页第一张图,有不明之处,望高手指点!  谢谢!  [待解决] 回复[ 35次 ]   点击[ 1298次 ]  
gao693282043
[帖 主]   [ 发表时间:2010-04-10 08:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-06 11:41
书上说:8086机中,任意时刻,cpu将cs:ip指向的内容当做指令执行。

将CS:IP计算得出物理地址是20000H没错,但应该取20000H的内存单元存放的内容才对啊,为什么是连取3个内存单元(20000H~20002H)的内容呢? 我这里强调的是内容。
还有,内存单元中的内容事先已经存在了吗?例如:20000H-20005H单元,B8 23 01 代表了一个指令mov ax,0123H ;BB 03 00代表了一个指令mov bx,0003H  都是十六进制的数字 凭什么知道哪个代表 mov 哪个代表ax,bx?如果说内存单元中的数据是预先存在的,那么B8 23 01 这几个数是不是绑定在一起就不会变了?或者说要变的话,三个一起变?
versaariel
[第1楼]   [ 回复时间:2010-04-10 12:14 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
1.你所想的不是当前学习的重点

2.8086机中,任意时刻,cpu将cs:ip指向的内容当做指令执行.这才是重点^-^
yeshuping
[第2楼]   [ 回复时间:2010-04-20 15:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-20 13:53
我也是正在烦这样的事~~
二楼你说主要掌握CS:IP的含义!
但是在执行过程中IP为什么是变更为0003,再又变更为0006,然后又变更为0008,,
这个地方想了两天了一点头绪都没有!请指点!!!
versaariel
[第3楼]   [ 回复时间:2010-04-20 20:29 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
03->06说明ip把030405这3个字节当作一条完整的指令来执行
06->08说明ip把0607这2个字节当作一条完整的指令来执行
取多少个字节是CPU根据指令来计算的,这些不是重点
zeeyhl
[第4楼]   [ 回复时间:2010-04-21 19:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-21 18:54
我同一楼都一样,整晚在想MOV AX BX,之后才想清楚,那个不是重点
anywherefeng
[第5楼]   [ 回复时间:2010-04-27 16:06 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-04-26 11:19
1,这真不是现在要抓的重点。
2,至于真正的原因则是编译器编译的结果。编译器怎么告诉cpu那三个内存是一起读的我这也明白。
wtw11897
[第6楼]   [ 回复时间:2010-05-08 23:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-27 17:58
这个貌似是做CPU控制器的难点
youth25
[第7楼]   [ 回复时间:2010-05-18 11:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-18 10:25
我的理解是cpu先取一个字节,然后判断是几字节指令,然后再取相应的几个字节,如果是一字节指令就直接执行了。
joying
[第8楼]   [ 回复时间:2010-05-25 18:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-25 18:13
这个也曾困扰了我一段时间,虽然现在也不是太明白,但我是这么想的:不知道你有没有发现书中的"B8"代表的是 mov ax,而"BB"代表的是mov bx,“B9”代表的是 mov cx,书上没提到dx,所以我也不知道了啊,但你想总共就4个通用寄存器,所以我们可以事先规定哪个代表哪个的,然后寻址的时候一旦碰到“B8”就说明是mov ax,而遇到了“BB”就是mov bx,至于后面的那两位是要传送的数据,第一个是低位,第二个是高位。不知道有没有看懂,鄙人不才啊,只是自己的一点拙见,见笑了~
qa6791558
[第9楼]   [ 回复时间:2010-05-26 17:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-29 03:03
受益匪浅 真是个学习汇编的好论坛 大家的想法都一样,,,还好我得到大家的提点能够不长困扰。
virtue
[第10楼]   [ 回复时间:2010-06-25 22:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-02 11:23
这个是可以根据机器码的指令部分来划分取多少字节的,就可以确定ip一次加几位了。比如cpu遇到指令mov ax,bx和指令mov ax,1000h,这两个的指令部分的操作码是不一样的,也就是提示cpu应该取几个字节当做一条完整的指令就行执行。
mywiil
[第11楼]   [ 回复时间:2010-06-29 19:35 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
cs:ip指向的内存是数据不假,但是,取多少数据可不一定,因为cs:ip指向的数据要作为指令,而一条指令多少数据可不一定。可以把cs:ip读数据当做不定类型大小的。呵呵
woaiballack
[第12楼]   [ 回复时间:2010-07-19 14:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-04 13:13
这个问题我也想问来着,但是后来一想,和计算机组成原理有一定的联系,不知楼主有没有学过
CPU的工作过程实际上就是取指令,然后执行指令,每一个指令的周期长度是不一样的。而且,只有当CPU执行完一条指令后,才可以取下一条指令。在计算机的指令系统中,指令分为五种,其中move作为取指操作要用到3个机器周期。我想这就是原因所在吧。
我讲的可能有点笼统,其实这个真不是学习汇编的重点,楼主如果热于钻研,可以查阅一下有关计算机组成原理的书,重点看指令系统和CPU这两章,肯定会有更高层次的认识。
ended
[第13楼]   [ 回复时间:2010-09-12 19:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-09-07 23:17
其实这个问题我也很疑惑,但我还不明白的是明明8086CPU的数据总线为16根一次最多也只能读2个字节但为什么传送的数据成了3个字节…小弟不才,自学到这里问题感觉多了好多…不解啊…望老师们赐教…
anuya
[第14楼]   [ 回复时间:2010-09-14 13:48 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-09-13 18:17
之前执行的cs:ip是2000:0对不?它对应一条完整的指令MOV ax,0123h(机器码b8 23 01),一次执行完这条命令,之后ip加3(因为b8 23 01三条机器码被执行过了),所以ip变为0003了
anuya
[第15楼]   [ 回复时间:2010-09-14 14:04 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-09-13 18:17
欢迎加群 116783338
luhaoyu
[第16楼]   [ 回复时间:2010-09-20 10:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-09-20 10:32
我也苦恼于这个问题,楼主和各位真的给了我很大的帮助
77434568
[第17楼]   [ 回复时间:2010-09-28 14:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-03 18:15
我也是刚学习汇编,不过我在刚学到这的时候并没有这个困惑,或许我比较笨吧,,,但我没有困惑的原因是起初,我知道mov ax,0123H这条指令是占三个字节的,而这条指令用一个内存单元又装不下,所以CPU在读取指令的时候读完20000H这个单元时发现不是一条完整的指令,所以继续读知道读取一条完整的指令为止,这个是我最初的理解,至于内部怎么实现,我们当然无从知道。。
ljfrog
[第18楼]   [ 回复时间:2010-10-10 20:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-10 08:28
我和7楼想法一样,不知对否?
eaglex
[第19楼]   [ 回复时间:2010-10-12 10:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-12 10:09
我的想法是
1.cpu将cs:ip指向的内容当做指令执行
2.根据读到的机器码来判断后面还有几个字节

这个假设的前提是同一个指令,当处理不同情况的时候指令码是不同的
mov 在mov ax,立即数 的时候是 B8  mov bx,立即数的时候是BB
mov ax,寄存器 的时候是:89
eaglex
[第20楼]   [ 回复时间:2010-10-13 23:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-12 10:09
http://www.intel.com/design/pentiumii/manuals/243191.htm
godok220
[第21楼]   [ 回复时间:2010-10-27 16:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-21 13:38
同样困惑 我的想法是 mov bx 后面就是16位=2个字节的数据。mov bl 后面是8位=1个字节的数据。20楼给的是inter指令集手册吧 纯英文看起来吃力......
lovelyboy
[第22楼]   [ 回复时间:2010-11-04 14:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-28 14:05
说实话,还真没想过这个问题,不要太钻牛角尖吧,因为不明白的太多了,还有13楼说的好像不对吧,16根数据线,一根数据线对应一位电信号,即二进制位,8个2进制位组成一个字节
xohome
[第23楼]   [ 回复时间:2010-11-24 20:28 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
有人说学汇编这个问题不重要  这是错误的 因为我指定的地址结果取了三个内存单元的数据 如果我下面的CS:IP地址为多取的那部分呢? 那不是乱套了 所以这个必须弄清楚 不然根本没法写程序 
我理解是:CPU指令分长短 可能有单字节指令可能有双字节指令 取数据可能就是根据这个规律来取 具体如何取目前不清楚  而且 执行一条指令绝对不止取一次  具体怎么弄的要到后面才知晓 并且大数据的操作也还没学到  但到了这里就要求开始写程序了 这个我十分不解,地址问题都还没解决 能写出才怪
jtrakn
[第24楼]   [ 回复时间:2010-11-27 22:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2010-11-25 19:35
ip在寄存器指定后会制动加一。。。
goodxiaowan
[第25楼]   [ 回复时间:2010-12-10 09:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-23 12:24
mov ax,0123H ;可以这样理解,
理论上应该占四个字节:0123H 就占内存单元(两个字节),控制指令占一个字节,
寄存器标示另占一字节;
为什么只占三个指节?
难到其中一字节包含(控制指令和寄存器标示)吗?
goodxiaowan
[第26楼]   [ 回复时间:2010-12-10 10:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-23 12:24
http://hiphotos.baidu.com/%CF%FC%CD%E7/pic/item/fe7966344d63a0c6a71e124b.jpg
zchkun
[第27楼]   [ 回复时间:2010-12-13 18:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-13 08:38
书上说:在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086cpu将从
内存M×16+N单元开始,读取一条指令并执行。cpu从内存中读取的内容是以指令为单位,
而不是以内存单元为单位。
ricecake
[第28楼]   [ 回复时间:2010-12-15 13:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-15 10:57
ip的方式是由上一条指令执行情况决定的,是CPU中EU的设计所决定的,跟汇编程序无关
ricecake
[第29楼]   [ 回复时间:2010-12-15 13:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-15 10:57
ip的方式是由上一条指令执行情况决定的,是CPU中EU的设计所决定的,跟汇编程序无关
------------------
回复:因该是控制单元CU..写错了,这部分是计算机结构的内容
bully
[第30楼]   [ 回复时间:2010-12-20 13:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-15 16:35
收益非浅啊 。。我刚刚也问了这个问题
eaookii
[第31楼]   [ 回复时间:2013-03-16 16:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-16 12:52
哈哈,看来大家都有过这个困惑啊。
lonelyhover
[第32楼]   [ 回复时间:2013-04-09 00:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29
这个实际上已经是组成原理的问题了,是属于计算机硬件的范畴之中了。也就是说,汇编语言对应于内存中的代码不能按照高级语言中的习惯去分析,因为那些代码已经不是软件的语法了,而是直接面对CPU的硬件指令,是一串0和1的组合,只不过按16进制表示了出来,所以不能简单的以数学分析的方法去寻找其规律。事实上每一位比特对对应于cpu中的一个控制单元(简单的说),直接通过高低电平来控制cpu的工作。包括IP的增加,也涉及到指令长度的问题。所以大家在这里就不要纠结与这个问题了,如果确实感兴趣,建议去学习下《计算机组成原理》中关于CPU以及“指令设计”的章节。
geshaer
[第33楼]   [ 回复时间:2013-05-20 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-20 15:54
ip是指令的存放地址,不同的指令汇编后占用的地址单元(即字节数不一样)
29960758
[第34楼]   [ 回复时间:2013-06-15 15:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-06-15 10:10
应该是困扰于:
CPU如何辨认指令?
肯定有一个固定的标准了,
比如,我们看到句号,就知道一句话玩了。
或者没有句号,我们看到“?”
或者没有标点,看到“了”“吗”,也可以认为是一句话完了
或许,为什么是连取3个内存单元 ——就是这么规定的。

mov bx,0003H  都是十六进制的数字 凭什么知道哪个代表 mov 哪个代表ax,bx?
cpu内部有个“表”,好像叫什么指令集,

B8 23 01 这几个数是不是绑定在一起就不会变了?或者说要变的话,三个一起变?
它们之间,是组合,不是搅拌。所以能单独变化。任何一个变了,意思就不同了。
29960758
[第35楼]   [ 回复时间:2013-06-15 15:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-06-15 10:10
应该是困扰于:
CPU如何辨认指令?
肯定有一个固定的标准了,
比如,我们看到句号,就知道一句话玩了。
或者没有句号,我们看到“?”
或者没有标点,看到“了”“吗”,也可以认为是一句话完了
或许,为什么是连取3个内存单元 ——就是这么规定的。

mov bx,0003H  都是十六进制的数字 凭什么知道哪个代表 mov 哪个代表ax,bx?
cpu内部有个“表”,好像叫什么指令集,

B8 23 01 这几个数是不是绑定在一起就不会变了?或者说要变的话,三个一起变?
它们之间,是组合,不是搅拌。所以能单独变化。任何一个变了,意思就不同了。

另外,这些指令,在指令集里头应该都有固定的长度,就好像ASCII码。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved