. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第二章的测试题,看看到底哪道题错了  [待解决] 回复[ 19次 ]   点击[ 1051次 ]  
jovon
[帖 主]   [ 发表时间:2010-08-20 21:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-10 22:43
一 下面关于8086CPU的工作原理描述错误的是(3)
1汇编程序员可以通过对各种寄存器中内容的修改实现对CPU的控制
2CPU在访问内存时,采用“段地址*16+偏移地址”的形式给出要访问的内存单元的物理地址
3任意时刻,CS:IP指向的内容即是此刻CPU正在执行的指令
4传送指令能够更改所有通用寄存器的内容
二下列地址信息与0020H:03EFH确定的内存地址不同的是(2)
1  5EFH
2  203H:00EFH
3  005EH:000FH
4  0002H:05CFH
三下列说法正确的是(3)
1 8086CPU采用“段地址*16+偏移地址=物理地址”的寻址模式,所以内存是由一个一个的段组成,每一个段有一个段地址
2物理地址为ffff0H的内存单元的偏移地址可能为ffffH
3一个段的大小可以是8Byte
4在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行
四下列说法正确的是(4)
1一条指令被执行后,IP的值进行改变
2当CPU执行完当前指令返回debug后CPU就闲下来不再进行工作
3 e命令可以将所有内存单元中的数据进行改变
4 CPU将CS:IP所指向的内存单元中的数据当作指令来执行
五Debug中可以改变内存单元内容的指令(4)
1 d 2 u 3 t 4 a
bright
[第1楼]   [ 回复时间:2010-08-24 09:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-21 09:41
第三题,至于为什么就自己想吧- -!
pengqiongku
[第2楼]   [ 回复时间:2010-09-02 20:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-28 00:23
首先说下第一个  4传送指令能够更改所有通用寄存器的内容 
传送指令包括mov 试问mov 能改变cs ip 寄存器中的内容吗?
再说下第三个,   3一个段的大小可以是8Byte 
段的划分来自于CPU 8086是16位结构的.
2物理地址为ffff0H的内存单元的偏移地址可能为ffffH 
根据段地址=物理地址/16-偏移地址/16算出段地址的最大,最小值. 再算出偏移地址的最大.最小值.可知此个错误.
tolearn
[第3楼]   [ 回复时间:2010-10-09 20:31 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-10-03 18:57
首先说下第一个  4传送指令能够更改所有通用寄存器的内容 
传送指令包括mov 试问mov 能改变cs ip 寄存器中的内容吗?
再说下第三个,   3一个段的大小可以是8Byte 
段的划分来自于CPU 8086是16位结构的.
2物理地址为ffff0H的内存单元的偏移地址可能为ffffH 
根据段地址=物理地址/16-偏移地址/16算出段地址的最大,最小值. 再算出偏移地址的最大.最小值.可知此个错误.
------------------
回复:传送指令mov能更改所有通用寄存器的内容。因为通用寄存器就是AX、BX、CX、DX,而CS为代码段寄存器,IP为指令指针寄存器。
saintblood
[第4楼]   [ 回复时间:2010-10-10 14:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-02 11:22
一 下面关于8086CPU的工作原理描述错误的是(3)
1汇编程序员可以通过对各种寄存器中内容的修改实现对CPU的控制
2CPU在访问内存时,采用“段地址*16+偏移地址”的形式给出要访问的内存单元的物理地址
3任意时刻,CS:IP指向的内容即是此刻CPU正在执行的指令
4传送指令能够更改所有通用寄存器的内容
二下列地址信息与0020H:03EFH确定的内存地址不同的是(2)
1  5EFH
2  203H:00EFH
3  005EH:000FH
4  0002H:05CFH
三下列说法正确的是(3)
1 8086CPU采用“段地址*16+偏移地址=物理地址”的寻址模式,所以内存是由一个一个的段组成,每一个段有一个段地址
2物理地址为ffff0H的内存单元的偏移地址可能为ffffH
3一个段的大小可以是8Byte
4在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行
四下列说法正确的是(4)
1一条指令被执行后,IP的值进行改变
2当CPU执行完当前指令返回debug后CPU就闲下来不再进行工作
3 e命令可以将所有内存单元中的数据进行改变
4 CPU将CS:IP所指向的内存单元中的数据当作指令来执行
五Debug中可以改变内存单元内容的指令(4)
1 d 2 u 3 t 4 a
------------------
回复:一.3 >> CS:IP指向的是CPU要执行的下一条指令。当前执行的指令存放在指令缓冲器中
三.3 >> 005EH:000FH 就是个很好的例子。
三.4 >> CS可以被传说指令MOV修改
四.1 >> IP值在读入指令后被修改。IP值改变后才会进行指令执行。可见书中图2.17
coderone
[第5楼]   [ 回复时间:2010-10-28 17:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-13 10:24
指令被读取后IP的值就改变了,不是执行后吧?
guoqingshun123
[第6楼]   [ 回复时间:2010-11-19 21:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-11-18 22:02
回复:[第5楼]
------------------
执行的时候IP值还没变.书本2.10的图示可以看看
rebelsky
[第7楼]   [ 回复时间:2010-12-03 09:01 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2010-09-13 09:09
CS  IP是通用寄存器吗?
trapdoor
[第8楼]   [ 回复时间:2010-12-06 13:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-06 12:31
第一道题目的答案就是3,因为通用寄存器只包括AX,BX,CX,DX,而CS、IP之类的寄存器不是通用寄存器。
3之所以错误是由于:数据放入指令缓冲器中时,IP随之发生了变化,但是发生变化之后执行控制器才执行刚刚传送进来的数据,而非现在CS:IP所指向的数据。
wang_ss
[第9楼]   [ 回复时间:2010-12-16 14:13 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23
对于第(三)题,通过排除法我认为“在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行 
”是正确的,这句话正确是不是因为无jmp时,执行命令后IP会自动修改,而CS不会自动修改?希望高人解惑
goodxiaowan
[第10楼]   [ 回复时间:2010-12-17 11:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-23 12:24
首先说下第一个  4传送指令能够更改所有通用寄存器的内容 
传送指令包括mov 试问mov 能改变cs ip 寄存器中的内容吗?
再说下第三个,   3一个段的大小可以是8Byte 
段的划分来自于CPU 8086是16位结构的.
2物理地址为ffff0H的内存单元的偏移地址可能为ffffH 
根据段地址=物理地址/16-偏移地址/16算出段地址的最大,最小值. 再算出偏移地址的最大.最小值.可知此个错误.
------------------
回复:通用寄存器不是只有AX,bx,cx,dx,sp,bp,si,di吗?
wang_ss
[第11楼]   [ 回复时间:2010-12-17 13:25 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23
今天针对我在9楼的问题实验了一下,
进入DEBUG后操作如下:
1。修改CS:IP 为1000H:FFFAH
命令如下
r cs  ->   1000
r ip  ->   fffa

2.从CS:IP所指位置开始执行,使IP自加
命令及执行后CS:IP值如下
t -> CS=1000 IP=FFFC

t -> CS=1000 IP=FFFE

t -> CS=1000 IP=0000

t -> CS=1000 IP=0002

可见执行命令后IP值会自加而CS值不会,故“在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行”是正确的。
kind-sophia
[第12楼]   [ 回复时间:2010-12-22 10:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-06 08:46
在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行  如果指令中没有跳转指令,段地址就不会改变,而偏移地址就会随着指令的执行进行自动修改,虽然内存没有段的概念,但是cpu在执行的过程中,是遵循"段地址*16+偏移地址"来确定物理地址的,当偏移地址达到最大值时(这时候该段的大小不一定是64k)段地址仍旧不变,而偏移地址会继续自动修改,这时候偏移地址就会出现所谓的"溢出"现象,而不会继续往下执行超出最大偏移地址的那部分内存单元.
kind-sophia
[第13楼]   [ 回复时间:2010-12-22 10:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-06 08:46
回复:[贴 主]
------------------
最后一个题,我测试的时候也遇到过,我选择的答案跟你一样,也是a  但是也不知道对不对?
tianzhhy
[第14楼]   [ 回复时间:2011-07-01 14:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-06-22 09:22
在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行  如果指令中没有跳转指令,段地址就不会改变,而偏移地址就会随着指令的执行进行自动修改,虽然内存没有段的概念,但是cpu在执行的过程中,是遵循"段地址*16+偏移地址"来确定物理地址的,当偏移地址达到最大值时(这时候该段的大小不一定是64k)段地址仍旧不变,而偏移地址会继续自动修改,这时候偏移地址就会出现所谓的"溢出"现象,而不会继续往下执行超出最大偏移地址的那部分内存单元.
------------------
回复:
可以通过mov指令修改cs的值,如:mov bx,2000H ; mov cs,bx,这样没有jmp指令也可以执行超过64K的代码。
xiehao315
[第15楼]   [ 回复时间:2011-07-01 18:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-08-24 08:57
我想说,其实楼主全对了.
我主要要澄清一下第三题,首先说说64K代码段的问题,在段地址不改变的情况下,64K确实是段的最大范围了.现在
"因为无jmp时,执行命令后IP会自动修改,而CS不会自动修改"
缺少jmp指令,只能说不能直接修改cs的值,但我们可以间接修改嘛,上面的仁兄已经回答了.
"可以通过mov指令修改cs的值,如:
mov bx,2000H 
mov cs,bx
这样没有jmp指令也可以执行超过64K的代码。"
我要补充的是,上面那个";"可不能要,在汇编程序中,";"后面的内容会被编译器忽略哦,那是注释标记哟!
现在我主要想说说这个"一个段的大小可以是8Byte"
先说一点,书上可只说了一个段最大也就64K,并未说段的最小值.
请注意一下,2.12代码段中的例子
比如,将:
mov ax,0000 (B8 00 00)
add ax,0123 (05 23 01)
mov bx,ax   (8B D8)
jmp bx      (FF E3)
这段长度为10个字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节.
既然10个字节也可以成段,那8个字节当然也可以哦.注意是8Byte,不过话说回来,就是8bit,一个字节也成呀.比如10000H,段地址1000H,偏移地址为0H.不过,这样只有一个内存单元的段就没啥意义了.这就好比,只有一个元素的数组,与单个的变量无异,那这样的数组不是多此一举嘛!
记住,段主要范指了一连续的内存地址单元,只要是连续的,就可以成段.其实,这与高级语言里面的数组很相似.

如果有不足之前,尚请斧正.
redsheila
[第16楼]   [ 回复时间:2011-07-05 21:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-19 12:04
在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行  如果指令中没有跳转指令,段地址就不会改变,而偏移地址就会随着指令的执行进行自动修改,虽然内存没有段的概念,但是cpu在执行的过程中,是遵循"段地址*16+偏移地址"来确定物理地址的,当偏移地址达到最大值时(这时候该段的大小不一定是64k)段地址仍旧不变,而偏移地址会继续自动修改,这时候偏移地址就会出现所谓的"溢出"现象,而不会继续往下执行超出最大偏移地址的那部分内存单元.
------------------
回复:
可以通过mov指令修改cs的值,如:mov bx,2000H ; mov cs,bx,这样没有jmp指令也可以执行超过64K的代码。
------------------
回复:有道理,但似乎我之前做检测题的时候是把它当成正确的,可惜过关后就不能看到检测题的内容。谁知道怎样才能看到?
redsheila
[第17楼]   [ 回复时间:2011-07-06 20:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-19 12:04
我要搬石头砸自己脚啦!
mov不能用于设置CS和IP的值,所以“在一段没有任何跳转指令的程序中,超过64K的部分将不会被执行”这句话是对的。
haker007
[第18楼]   [ 回复时间:2011-08-28 22:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-10 12:45
下列说法正确的是(?) 
1 8086CPU采用“段地址*16+偏移地址=物理地址”的寻址模式,所以内存是由一个一个的段组成,每一个段有一个段地址 
2物理地址为ffff0H的内存单元的偏移地址可能为ffffH 
3一个段的大小可以是8Byte 
4在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行

自己做5题错了3题,当然时过境迁,每次看到的题目都不一定一样。 我就来到了这里。
通过前面大家的讨论,并且经过debug 
的确是 mov cs,bx  这样类型的指令无法执行。这样足以说明:"4在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行"   正确了吗?
如果4是正确,那3一个段的大小可以是8Byte  错在哪里呢?
s0512
[第19楼]   [ 回复时间:2011-10-05 14:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-05 13:38
1]  4
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved