|
主题 : : 28页第一张图,有不明之处,望高手指点! 谢谢! [待解决] |
回复[ 35次 ]
点击[ 1298次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 这几个数是不是绑定在一起就不会变了?或者说要变的话,三个一起变? | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-04-10 12:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14 |
1.你所想的不是当前学习的重点
2.8086机中,任意时刻,cpu将cs:ip指向的内容当做指令执行.这才是重点^-^ | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-04-20 15:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-20 13:53 |
我也是正在烦这样的事~~
二楼你说主要掌握CS:IP的含义!
但是在执行过程中IP为什么是变更为0003,再又变更为0006,然后又变更为0008,,
这个地方想了两天了一点头绪都没有!请指点!!! | | |
|
|
|
|
[第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根据指令来计算的,这些不是重点 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-04-21 19:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-21 18:54 |
我同一楼都一样,整晚在想MOV AX BX,之后才想清楚,那个不是重点 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-04-27 16:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-04-26 11:19 |
1,这真不是现在要抓的重点。
2,至于真正的原因则是编译器编译的结果。编译器怎么告诉cpu那三个内存是一起读的我这也明白。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-05-08 23:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-27 17:58 |
|
|
|
|
|
[第7楼]
[ 回复时间:2010-05-18 11:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-18 10:25 |
我的理解是cpu先取一个字节,然后判断是几字节指令,然后再取相应的几个字节,如果是一字节指令就直接执行了。 | | |
|
|
|
|
[第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,至于后面的那两位是要传送的数据,第一个是低位,第二个是高位。不知道有没有看懂,鄙人不才啊,只是自己的一点拙见,见笑了~ | | |
|
|
|
|
[第9楼]
[ 回复时间:2010-05-26 17:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-12-29 03:03 |
受益匪浅 真是个学习汇编的好论坛 大家的想法都一样,,,还好我得到大家的提点能够不长困扰。 | | |
|
|
|
|
[第10楼]
[ 回复时间:2010-06-25 22:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-02 11:23 |
这个是可以根据机器码的指令部分来划分取多少字节的,就可以确定ip一次加几位了。比如cpu遇到指令mov ax,bx和指令mov ax,1000h,这两个的指令部分的操作码是不一样的,也就是提示cpu应该取几个字节当做一条完整的指令就行执行。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2010-06-29 19:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29 |
cs:ip指向的内存是数据不假,但是,取多少数据可不一定,因为cs:ip指向的数据要作为指令,而一条指令多少数据可不一定。可以把cs:ip读数据当做不定类型大小的。呵呵 | | |
|
|
|
|
[第12楼]
[ 回复时间:2010-07-19 14:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-04 13:13 |
这个问题我也想问来着,但是后来一想,和计算机组成原理有一定的联系,不知楼主有没有学过
CPU的工作过程实际上就是取指令,然后执行指令,每一个指令的周期长度是不一样的。而且,只有当CPU执行完一条指令后,才可以取下一条指令。在计算机的指令系统中,指令分为五种,其中move作为取指操作要用到3个机器周期。我想这就是原因所在吧。
我讲的可能有点笼统,其实这个真不是学习汇编的重点,楼主如果热于钻研,可以查阅一下有关计算机组成原理的书,重点看指令系统和CPU这两章,肯定会有更高层次的认识。 | | |
|
|
|
|
[第13楼]
[ 回复时间:2010-09-12 19:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-09-07 23:17 |
其实这个问题我也很疑惑,但我还不明白的是明明8086CPU的数据总线为16根一次最多也只能读2个字节但为什么传送的数据成了3个字节…小弟不才,自学到这里问题感觉多了好多…不解啊…望老师们赐教… | | |
|
|
|
|
[第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了 | | |
|
|
|
|
[第15楼]
[ 回复时间:2010-09-14 14:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-09-13 18:17 |
|
|
|
|
|
[第16楼]
[ 回复时间:2010-09-20 10:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-09-20 10:32 |
我也苦恼于这个问题,楼主和各位真的给了我很大的帮助 | | |
|
|
|
|
[第17楼]
[ 回复时间:2010-09-28 14:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-03 18:15 |
我也是刚学习汇编,不过我在刚学到这的时候并没有这个困惑,或许我比较笨吧,,,但我没有困惑的原因是起初,我知道mov ax,0123H这条指令是占三个字节的,而这条指令用一个内存单元又装不下,所以CPU在读取指令的时候读完20000H这个单元时发现不是一条完整的指令,所以继续读知道读取一条完整的指令为止,这个是我最初的理解,至于内部怎么实现,我们当然无从知道。。 | | |
|
|
|
|
[第18楼]
[ 回复时间:2010-10-10 20:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-10 08:28 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第20楼]
[ 回复时间:2010-10-13 23:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-12 10:09 |
|
|
|
|
|
[第21楼]
[ 回复时间:2010-10-27 16:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-21 13:38 |
同样困惑 我的想法是 mov bx 后面就是16位=2个字节的数据。mov bl 后面是8位=1个字节的数据。20楼给的是inter指令集手册吧 纯英文看起来吃力...... | | |
|
|
|
|
[第22楼]
[ 回复时间:2010-11-04 14:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-28 14:05 |
说实话,还真没想过这个问题,不要太钻牛角尖吧,因为不明白的太多了,还有13楼说的好像不对吧,16根数据线,一根数据线对应一位电信号,即二进制位,8个2进制位组成一个字节 | | |
|
|
|
|
[第23楼]
[ 回复时间:2010-11-24 20:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04 |
有人说学汇编这个问题不重要 这是错误的 因为我指定的地址结果取了三个内存单元的数据 如果我下面的CS:IP地址为多取的那部分呢? 那不是乱套了 所以这个必须弄清楚 不然根本没法写程序
我理解是:CPU指令分长短 可能有单字节指令可能有双字节指令 取数据可能就是根据这个规律来取 具体如何取目前不清楚 而且 执行一条指令绝对不止取一次 具体怎么弄的要到后面才知晓 并且大数据的操作也还没学到 但到了这里就要求开始写程序了 这个我十分不解,地址问题都还没解决 能写出才怪 | | |
|
|
|
|
[第24楼]
[ 回复时间:2010-11-27 22:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2010-11-25 19:35 |
|
|
|
|
|
[第25楼]
[ 回复时间:2010-12-10 09:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-23 12:24 |
mov ax,0123H ;可以这样理解,
理论上应该占四个字节:0123H 就占内存单元(两个字节),控制指令占一个字节,
寄存器标示另占一字节;
为什么只占三个指节?
难到其中一字节包含(控制指令和寄存器标示)吗? | | |
|
|
|
|
[第26楼]
[ 回复时间:2010-12-10 10:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-23 12:24 |
|
|
|
|
|
[第27楼]
[ 回复时间:2010-12-13 18:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-13 08:38 |
书上说:在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086cpu将从
内存M×16+N单元开始,读取一条指令并执行。cpu从内存中读取的内容是以指令为单位,
而不是以内存单元为单位。 | | |
|
|
|
|
[第28楼]
[ 回复时间:2010-12-15 13:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-15 10:57 |
ip的方式是由上一条指令执行情况决定的,是CPU中EU的设计所决定的,跟汇编程序无关 | | |
|
|
|
|
[第29楼]
[ 回复时间:2010-12-15 13:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-15 10:57 |
ip的方式是由上一条指令执行情况决定的,是CPU中EU的设计所决定的,跟汇编程序无关
------------------
回复:因该是控制单元CU..写错了,这部分是计算机结构的内容 | | |
|
|
|
|
[第30楼]
[ 回复时间:2010-12-20 13:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-15 16:35 |
|
|
|
|
|
[第31楼]
[ 回复时间:2013-03-16 16:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-03-16 12:52 |
|
|
|
|
|
[第32楼]
[ 回复时间:2013-04-09 00:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29 |
这个实际上已经是组成原理的问题了,是属于计算机硬件的范畴之中了。也就是说,汇编语言对应于内存中的代码不能按照高级语言中的习惯去分析,因为那些代码已经不是软件的语法了,而是直接面对CPU的硬件指令,是一串0和1的组合,只不过按16进制表示了出来,所以不能简单的以数学分析的方法去寻找其规律。事实上每一位比特对对应于cpu中的一个控制单元(简单的说),直接通过高低电平来控制cpu的工作。包括IP的增加,也涉及到指令长度的问题。所以大家在这里就不要纠结与这个问题了,如果确实感兴趣,建议去学习下《计算机组成原理》中关于CPU以及“指令设计”的章节。 | | |
|
|
|
|
[第33楼]
[ 回复时间:2013-05-20 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-05-20 15:54 |
ip是指令的存放地址,不同的指令汇编后占用的地址单元(即字节数不一样) | | |
|
|
|
|
[第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 这几个数是不是绑定在一起就不会变了?或者说要变的话,三个一起变?
它们之间,是组合,不是搅拌。所以能单独变化。任何一个变了,意思就不同了。 | | |
|
|
|
|
[第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码。 | | |