|
主题 : : 第二章的测试题,看看到底哪道题错了 [待解决] |
回复[ 19次 ]
点击[ 1051次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-08-24 09:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-08-21 09:41 |
|
|
|
|
|
[第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算出段地址的最大,最小值. 再算出偏移地址的最大.最小值.可知此个错误. | | |
|
|
|
|
[第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为指令指针寄存器。 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-10-28 17:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-13 10:24 |
|
|
|
|
|
[第6楼]
[ 回复时间:2010-11-19 21:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2010-11-18 22:02 |
回复:[第5楼]
------------------
执行的时候IP值还没变.书本2.10的图示可以看看 | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-12-03 09:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2010-09-13 09:09 |
|
|
|
|
|
[第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所指向的数据。 | | |
|
|
|
|
[第9楼]
[ 回复时间:2010-12-16 14:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
对于第(三)题,通过排除法我认为“在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行
”是正确的,这句话正确是不是因为无jmp时,执行命令后IP会自动修改,而CS不会自动修改?希望高人解惑 | | |
|
|
|
|
[第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吗? | | |
|
|
|
|
[第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的部分将不会被执行”是正确的。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2010-12-22 10:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-06 08:46 |
在一段没有任何跳转指令的程序中,超出64K的部分将不会被执行 如果指令中没有跳转指令,段地址就不会改变,而偏移地址就会随着指令的执行进行自动修改,虽然内存没有段的概念,但是cpu在执行的过程中,是遵循"段地址*16+偏移地址"来确定物理地址的,当偏移地址达到最大值时(这时候该段的大小不一定是64k)段地址仍旧不变,而偏移地址会继续自动修改,这时候偏移地址就会出现所谓的"溢出"现象,而不会继续往下执行超出最大偏移地址的那部分内存单元. | | |
|
|
|
|
[第13楼]
[ 回复时间:2010-12-22 10:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-06 08:46 |
回复:[贴 主]
------------------
最后一个题,我测试的时候也遇到过,我选择的答案跟你一样,也是a 但是也不知道对不对? | | |
|
|
|
|
[第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的代码。 | | |
|
|
|
|
[第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.不过,这样只有一个内存单元的段就没啥意义了.这就好比,只有一个元素的数组,与单个的变量无异,那这样的数组不是多此一举嘛!
记住,段主要范指了一连续的内存地址单元,只要是连续的,就可以成段.其实,这与高级语言里面的数组很相似.
如果有不足之前,尚请斧正. | | |
|
|
|
|
[第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的代码。
------------------
回复:有道理,但似乎我之前做检测题的时候是把它当成正确的,可惜过关后就不能看到检测题的内容。谁知道怎样才能看到? | | |
|
|
|
|
[第17楼]
[ 回复时间:2011-07-06 20:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-19 12:04 |
我要搬石头砸自己脚啦!
mov不能用于设置CS和IP的值,所以“在一段没有任何跳转指令的程序中,超过64K的部分将不会被执行”这句话是对的。 | | |
|
|
|
|
[第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 错在哪里呢? | | |
|
|
|
|
[第19楼]
[ 回复时间:2011-10-05 14:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-05 13:38 |
|