. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点 2.3 遇到的问题  [待解决] 回复[ 41次 ]   点击[ 1839次 ]  
zy3287
[帖 主]   [ 发表时间:2008-07-28 17:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-17 17:25
个人认为检测2.3的问题 CPU几次修改IP非常有代表性,,,但是最后IP中的值这个问题问的有点不对了!!!

首先书中并没有介绍sub命令,以至看过答案为0思考了好半天没弄明白..

CPU几次修改IP,最开始个人认为是3次,,而且把图 2.15 - 2.26看了几十次才发现问题所在

结论 当mov ax,bx执行后 读入指令写入指令缓冲器 IP进行第一次修改 执行控制器执行指令 读取sub ax,ax

       sub ax,ax执行后 读入指令写入指令缓冲器 IP进行第二次修改 执行控制器执行指令 读取jmp ax

       jmp ax   执行  没有读入指令 但同时IP进行了第三次修改 

       jmp ax  的执行结果是对IP的第四次修改

前两步都是有运算结果的,而IP修改都是再得出运算结果之前,第三步可以理解为IP第三次修改后的运算结果是第四次修改

不知道我这样说算不算简单明了,希望对新人有所帮助
tomato
[第1楼]   [ 回复时间:2008-07-28 20:06 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主理解得很透彻啊,不懂得学习者,看到楼主的帖子估计就恍然大悟了!
bigyu7
[第2楼]   [ 回复时间:2008-07-29 11:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-28 16:02
我总结为两点:
1、读入指令到指令缓冲器后,IP会修改一次。这在小结3的工作过程中已写明。
2、每个jmp指令的执行,会导致IP修改一次

所以,读入3条指令,会导致ip修改三次;jmp ax的执行,ip修改一次。合计四次。
tjtchly
[第3楼]   [ 回复时间:2008-08-19 23:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-08-16 22:05
呵呵,我怎么也认为是三次修改呢?得好好分析分析……
tjtchly
[第4楼]   [ 回复时间:2008-08-19 23:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-08-16 22:05
明白了,是读后过后就立即修改,并不是等“执行”完后才修改,所以,当读完JMP AX后,IP又指向了下一条指令,当JMP AX执行完毕后,又修改了一次,故JMP指令是执行的两次修改IP。LZ正解!
musicvs
[第5楼]   [ 回复时间:2008-08-21 00:31 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:14
注册日期:2008-08-20 11:21
引用:
“当mov ax,bx执行后 读入指令写入指令缓冲器 IP进行第一次修改 执行控制器执行指令 读取sub ax,ax ”


这里为什么不是 当mov ax,bx执行前,读入指令写入指令缓冲器?
为什么是执行后?不是执行前吗?
ktlwj
[第6楼]   [ 回复时间:2008-08-31 08:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-08-20 17:22
我总结为两点:
1、读入指令到指令缓冲器后,IP会修改一次。这在小结3的工作过程中已写明。
2、每个jmp指令的执行,会导致IP修改一次

所以,读入3条指令,会导致ip修改三次;jmp ax的执行,ip修改一次。合计四次。
------------------
回复:
我认为上面的解释是最好理解的。
至于最后IP的值应该是AX里的值。
liuxianming2001
[第7楼]   [ 回复时间:2008-09-05 00:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-03 00:18
我觉得要理解这个问题,最好把CPU工作过程的第二、三步的执行顺序理解透了就OK了
query123456
[第8楼]   [ 回复时间:2008-09-05 14:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-02 09:38
我在DEBUG里调试怎么就看出来又三次呢
query123456
[第9楼]   [ 回复时间:2008-09-05 14:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-02 09:38
原来读入JMP AX 时就修改一次IP地址,执行JMP AX 后又修改了一次IP地址
minedoc
[第10楼]   [ 回复时间:2008-10-18 01:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-17 16:40
ip的值为零怎么来的?
fairyhuang
[第11楼]   [ 回复时间:2008-10-18 08:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-14 21:07
应该是先把指令读如指令缓冲器,再执行吧
aimy
[第12楼]   [ 回复时间:2008-11-01 19:47 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-10-30 16:26
回复:[第10楼]
------------------
鄙人实在看不出来为什么是0,鄙人认为是AX里面的值
245610937
[第13楼]   [ 回复时间:2008-11-02 11:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-02 10:29
IP的值是怎么计算来的?
aimy
[第14楼]   [ 回复时间:2008-11-03 12:59 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-10-30 16:26
回复:[第13楼]
------------------
对CS:IP不可以使用MOV来改变,就目前的学习只可以JMP...
JMP有2种 JMP cs:ip ;修改CS和IP
         jmp 某一合法寄存器 ;修改IP的,意思直接用寄存器中的值负给IP
最后一步jmp ax读入后IP的值与它起始值以及上面的2条指令有关,当执行后就为AX中的值了.
guilai00
[第15楼]   [ 回复时间:2008-11-19 22:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-15 22:07
===========================================================================
关于ip被修改的总结:第一种情况,读取指令后,更详细的说是读取指令到指令缓冲器后,会修改ip.
第二种情况,执行某些指令后,比如jmp指令执行后.
注意的是:将要被执行的指令总是当前cs-ip所指向的指令,因此在一条指令执行完后,ip可能有
两次或者更多次被修改,但下一条指令的执行一般都在前一条执行完后,因此,ip的最终值应该是
一条指令执行完后.
===========================================================================
                                                                          ----
dongyu6515
[第16楼]   [ 回复时间:2008-11-21 09:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-12-14 12:34
修改了6次,jmp ax要修改2次,一共是6次
378499835
[第17楼]   [ 回复时间:2008-11-25 21:54 ]   [引用]   [回复]   [ top ] 
荣誉值:11
信誉值:1
注册日期:2008-11-24 20:35
虽然还是不怎么明白,但我会好好学的!
sunbird333
[第18楼]   [ 回复时间:2008-11-26 12:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-11-24 09:56
说的很详细.
不过楼主开始的写法说明 有问题哦.
       不是  "当mov ax,bx执行后" 读入指令写入指令缓冲器 IP进行第一次修改 执行控制器执行指令 读取sub ax,ax 
        再看下2.10 CS和IP 中的文字描述~~是 CPU从内存 段地址*16+偏移地址 处读入指令......
afgh2587849
[第19楼]   [ 回复时间:2008-12-04 20:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-20 15:19
8086CPU简要工作过程:
1 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区
2 IP=IP+所读取指令的长度,从而指向下一条指令
3 执行指令 转到步骤1 重复

请注意这3个步骤   指令读入指令缓冲区-> IP++ ->执行刚刚读入的指令->将下一条指令读入缓冲区  (循环)
lz所说的基本正确 但不应该是执行指令后修改IP  整体过程应该是
读入mov ax,bx指令到指令缓冲器 IP进行第一次修改 执行mov ax,bx 
读入sub ax,ax指令到指令缓冲器 IP进行第二次修改 执行sub ax,ax 
读取jmp ax   指令到指令缓冲器 IP进行第三次修改 执行jmp ax   IP进行第四次修改
欢迎讨论
san123
[第20楼]   [ 回复时间:2009-03-06 12:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-01 15:02
19楼的理解很透
cy3221
[第21楼]   [ 回复时间:2009-03-15 18:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-11 18:00
看了之后,明白了!!也基本上弄清了处理的过程!呵呵  努力!
prince888
[第22楼]   [ 回复时间:2009-03-24 10:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-19 19:26
那我再问哈。。。为什么mov指令在内存中占3字节呢?
evedyc
[第23楼]   [ 回复时间:2009-04-01 14:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-30 01:42
很透彻
q279449171
[第24楼]   [ 回复时间:2009-04-13 16:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-04 12:13
sub是什么指令呀?
liuj
[第25楼]   [ 回复时间:2009-04-14 12:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-10 20:16
减法命令
jnykq
[第26楼]   [ 回复时间:2009-04-15 18:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-07 20:10
看到这么多人在讨论  心里彻底有底了  不好意思说的是半年前我第一次学习汇编,感觉很难就放弃了  现在我重新学习   一定要学好
yakoo5
[第27楼]   [ 回复时间:2009-04-16 17:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-16 15:54
对19楼的补充:

(1) 读入mov ax,bx指令到指令缓冲器 IP进行第一次修改,ip指向下一条指令,即ip此时指向sub ax,bx
(2) 执行mov ax,bx, 读入sub ax,ax指令到指令缓冲器 IP进行第二次修改,ip此时指向jmp ax.
(3) 执行sub ax,ax, 读取jmp ax指令到指令缓冲器, IP进行第三次修改,之后ip指向sub ax,ax代码段后
    面的内容
(4) 执行jmp ax, IP进行第四次修改,此时ip=ax,即ip指向的内容即为ax中的相对地址指向的内容。
w58318265
[第28楼]   [ 回复时间:2009-04-18 12:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-08 20:57
对于IP为什么是0的回答:
     
 原因是 :指令SUb ax,ax等价于进行AX=AX-AX=0,SUB是减法运算。
          于是SUb执行后:
                          AX=O (既是0000H,表示的是偏移地址)
 接下来  :      Jmp ax  ;无条件跳转指令(跳到指定的偏移地址),AX寄存器中装的是内存地址:0000H,
       也就是这时候:CS:IP=CS:0000H
hellojuly
[第29楼]   [ 回复时间:2010-12-01 11:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-30 08:58
8086CPU简要工作过程:
1 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区
2 IP=IP+所读取指令的长度,从而指向下一条指令
3 执行指令 转到步骤1 重复

请注意这3个步骤   指令读入指令缓冲区-> IP++ ->执行刚刚读入的指令->将下一条指令读入缓冲区  (循环)
lz所说的基本正确 但不应该是执行指令后修改IP  整体过程应该是
读入mov ax,bx指令到指令缓冲器 IP进行第一次修改 执行mov ax,bx 
读入sub ax,ax指令到指令缓冲器 IP进行第二次修改 执行sub ax,ax 
读取jmp ax   指令到指令缓冲器 IP进行第三次修改 执行jmp ax   IP进行第四次修改
欢迎讨论
------------------
回复:
19楼正解,看过不少答案把第三和第四次IP修改次序搞混了。
rebelsky
[第30楼]   [ 回复时间:2010-12-01 15:05 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2010-09-13 09:09
sub ax,ax  的意思是ax=ax-ax=0
所以最后结果为ax=0
rebelsky
[第31楼]   [ 回复时间:2010-12-01 15:08 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2010-09-13 09:09
回复:[第20楼]
------------------
我认为是3次,因为题目说的是执行指令后,而不是读取指令后,因此第一次不能算在其中
ricecake
[第32楼]   [ 回复时间:2010-12-15 14:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-15 10:57
我想这是8086CPU的答案吧,其它CPU不一定啊..
liber
[第33楼]   [ 回复时间:2010-12-16 20:15 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2010-12-15 20:35
楼上的,王爽老师的书就是以8086为例说明的。所以默认就是8086了。

不过我觉得应该是5此次,就是在读取第一条指令前,得先把CS:IP给初始化了。这应该也算一次吧。
xin289379297
[第34楼]   [ 回复时间:2010-12-24 00:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-13 11:22
看了28楼的理解,觉得透彻了,应该是四次
yym2
[第35楼]   [ 回复时间:2010-12-26 09:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-17 16:43
回复:[贴 主]
------------------
JMP 的执行就是修改IP,执行完就不需要再改IP了。 
所以应该是本身也就是执行时修改1次。 
执行完不修改IP。(其余指令执行过程不修改IP,执行完修改IP)
共3次,前2条指令在执行后修改
第3条指令在执行时修改。
这个在debug下单步跟踪就知道了。
fushengli
[第36楼]   [ 回复时间:2011-03-18 22:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-03-18 22:13
都不要说了  19楼+27楼 就是标准答案 28楼的补充就更明白了
jackylee788
[第37楼]   [ 回复时间:2011-09-07 00:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-03 16:58
学习了。。。
yishuihan
[第38楼]   [ 回复时间:2011-10-30 15:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-23 20:55
有道理!
grc10010010
[第39楼]   [ 回复时间:2011-11-30 09:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38
楼主的理解基本上比较确切,但如果参照书本P179页的内容,觉得楼主的表述上还有些问题,就是要把每次的“执行后”去掉(如:当mov ax,bx<执行后> 读入指令写入指令缓冲器 IP进行第一次修改 执行控制器执行指令 读取sub ax,ax),因为CPU处理命令的过程是先读入指令到缓冲器(注意此时指令并未执行),然后再修改IP指向下一条指令,最后才执行缓冲器中的指令。
    如果不这样改,可能会产生误解。
wyxz125
[第40楼]   [ 回复时间:2012-02-01 17:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-30 17:17
。。。不用看几十次那么多吧。。
tiangcin
[第41楼]   [ 回复时间:2012-02-07 00:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-24 17:31
谢谢哦,在这里得到了顿悟
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved