. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一道选择题 迷惑了3天  [待解决] 回复[ 49次 ]   点击[ 3134次 ]  
xue4485355
[帖 主]   [ 发表时间:2008-10-25 22:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-29 18:48
下列指令的书写正确的是:____ 
 1、 push al 
 2、 mov cs:[0],ds:[10] 
 3、 pop si 
 4、 mov ds:[0],2 

请问3和4谁正确 为什么?错的为什么错?
fairyhuang
[第1楼]   [ 回复时间:2008-10-26 11:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-14 21:07
debug里试一下就出来了
mouse
[第2楼]   [ 回复时间:2008-10-26 15:07 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
4 计算机无法确定操作的字节数
zcouyangpeng
[第3楼]   [ 回复时间:2008-10-26 20:02 ]   [引用]   [回复]   [ top ] 
荣誉值:35
信誉值:44
注册日期:2008-09-03 21:36
pop si 正确  8086中 POP PUSH操作单位为2B 
                      SI是16位寄存器  16b=2B
xue4485355
[第4楼]   [ 回复时间:2008-10-26 23:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-29 18:48
pop si 正确  8086中 POP PUSH操作单位为2B  
                      SI是16位寄存器  16b=2B

那么4错在哪儿????????????????
ttucbbc
[第5楼]   [ 回复时间:2008-10-27 11:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-09-13 11:13
4错的原因应该是硬性的规定, 这个过程就是不对的, 
正确的做法可以看书本P66 问题3.10
正确的做法应该是:mov ax,2h
                mov [0],ax
xue4485355
[第6楼]   [ 回复时间:2008-10-29 00:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-29 18:48
明白了 内存单元不可以直接被赋值 必须通过寄存器 谢谢
orsprite
[第7楼]   [ 回复时间:2008-10-31 20:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-31 17:48
mov cs:[0],ds:[10]  
这个指令是两个存储器操作数,应该错了 。
undersky
[第8楼]   [ 回复时间:2008-11-01 08:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-25 21:10
没有仔细注意过,学习了。
kukuu8
[第9楼]   [ 回复时间:2008-11-01 22:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-02-02 19:14
赋值给寄存器,调用寄存器!
xue4485355
[第10楼]   [ 回复时间:2008-11-06 12:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-29 18:48
我是楼主 我搞清楚了 
4、 mov ds:[0],2
因为计算机不知道 2是多少位的 是DB DW 还是DD 所以 语法错误
换句话说计算机不知道 2是 02 还是0002 还是00000002
419031061
[第11楼]   [ 回复时间:2008-11-13 22:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-04 11:45
答7楼:(1):除了串操作,是不允许在两个存储单元赋值
      (2):cs是代码段,向其赋值可能引起程序混乱.
struts8
[第12楼]   [ 回复时间:2008-12-10 21:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-06 21:24
10楼的,如果是这样的话,那问一下 mov ax,2.这条指令计算机知道2是几位的吗?
xugao918
[第13楼]   [ 回复时间:2008-12-16 15:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-16 15:33
mov cs:[0],ds:[10] 
这条错误吧,应该JmP才对吧
hanlsheng
[第14楼]   [ 回复时间:2008-12-19 12:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17
课本3.4开始就说了mov指令的几种形式,唯有 mov 内存单元,数据  这条指令是不存在的! 看了这个帖,才发现的。这也是4题错误的原因啊。  不能吧数据直接同过mov指令传给内存单元,这次记住了
jungool
[第15楼]   [ 回复时间:2009-01-03 22:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-22 13:39
学习了
maxm
[第16楼]   [ 回复时间:2009-01-21 11:29 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:4
注册日期:2009-01-15 22:41
数据先要到寄存器 再到内存单元
maxm
[第17楼]   [ 回复时间:2009-01-21 11:30 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:4
注册日期:2009-01-15 22:41
我这样说也不严密 14楼正确
qjb018
[第18楼]   [ 回复时间:2009-02-04 10:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-12 08:00
听过立即数不能直接送寄存器,可没听过不能直接送存储器的啊!?
qjb018
[第19楼]   [ 回复时间:2009-02-04 10:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-12 08:00
听过立即数不能直接送段寄存器,可没听过不能直接送存储器的啊!?
abob
[第20楼]   [ 回复时间:2009-02-07 18:38 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
听过立即数不能直接送段寄存器,可没听过不能直接送存储器的啊!?
------------------
回复:用debug去验证是不错的方法,书上也提到了这个方法。很多问题都可以自己先用计算机通过各种方法验证、研究一番。往往会有更多的收获和能力的增长。
dream2009
[第21楼]   [ 回复时间:2009-02-23 11:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-18 15:19
段寄存器:[]
这种格式不正确
chopin
[第22楼]   [ 回复时间:2009-02-24 18:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-24 18:22
10正确
chopin
[第23楼]   [ 回复时间:2009-02-24 18:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-24 18:22
10楼正确
xnian
[第24楼]   [ 回复时间:2009-03-02 20:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-02 19:45
14楼 正解 学习了
opel899
[第25楼]   [ 回复时间:2009-03-02 20:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-26 08:58
受益了!!
hou0912
[第26楼]   [ 回复时间:2009-04-02 11:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-08 00:10
内存单元不可以直接被赋值 必须通过寄存器中转
cghua
[第27楼]   [ 回复时间:2009-04-09 11:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-09 11:51
4、 mov ds:[0],2 
对的
mansion
[第28楼]   [ 回复时间:2009-04-13 15:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-24 17:55
第二个错误。mov al,ds:[0] 
           mov es:[0],al  
或al 该ax
zjxiaogaoren
[第29楼]   [ 回复时间:2009-04-23 10:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2009-04-20 20:16
1、 push al  原因是al是表示8位寄存器,而push指令需要是16位进栈,所以不正确
2、 mov cs:[0],ds:[10]  原因cs:[0]是一个内存单元,内存单元的mov操作必须明确是多少位的mov操作,因为ds:[10]也是一个内存单元,CPU无法知道是对8位还是16位的mov操作(masm后的错误信息: Improper operand type中文注释: 不当操作类型),说明内存单元与内存单元之间不能直接mov操作
3、 pop si  原因是si是表示16位寄存器,push指令需要是16位进栈,所以正确
4、 mov ds:[0],2  这里要注意的是不是对ds寄存器的操作,而是通过ds:[0]来对内存单元的操作,
    相当于mov [0],2操作(一般段地址是取了ds寄存器中的16位内容),原因是立即数2到底表示多少位呢,根本无法说清楚,而当指令在操作内存单元时,必须要清楚地知道是多少位(在8086中,是对8位呢,还是16位的操作呢),所以立即数无法传递给一个内存单元的(可以参看书本的3.4一节),对于内存单元只能是通过寄存器中转间接把立即数传递给一个内存单元,这个操作和通过寄存器中转间接把立即数传递给一个段寄存器是一样的,
主要矛盾在一个立即数表示的位数含义是模糊的,而内存单元需要明确地知道位数;对于段寄存器参见书本3.2中,不能将立即数直接传递给段寄存器是8086CPU的硬件设计规定;其他寄存器则不需要明确立即数的位数(因为它能够改变立即数的位数,如ax表示16位,那立即数即使不是16位也会自动改为16位,如果超过16位,则取后16位)
masm后的错误信息: Operand must have size中文注释: 需要的是操作数的长度,
yuhuofei
[第30楼]   [ 回复时间:2009-04-24 08:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:27
1、push al 错误。因为push要求操作数是16位,而al是8位,所以错误。
2、mov cs:[0],ds:[10]  错误。mov指令的两个操作数不能同时为存储单元,cs:[0]表示存储单元,ds:[10]也表示存储单元,所以错误。
3、pop si  正确。操作数是16位,而且不是cs寄存器,所以正确。
4、mov ds:[0],2  错误。目的操作数没有指明位数,也就是说没有说明,是放入ds:[0]的字单元还是字节单元,所以错误。
void
[第31楼]   [ 回复时间:2009-05-06 22:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-06 19:00
引用30数的回答:(4、mov ds:[0],2  错误。目的操作数没有指明位数,也就是说没有说明,是放入ds:[0]的字单元还是字节单元,所以错误。)
mov指令是双操作数指令,两个操作数中必须有一个是寄存器。而ds:[0]是一个内存单元,故不对。
wxenck
[第32楼]   [ 回复时间:2009-05-17 18:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2008-06-18 16:30
mov cs:[0],ds:[10]我理解的是段寄存器是不许直接赋值的,需要一个寄存器中转.形如 mov al,[0]
                                                                      mov cs,al
是这样的么,
xinyu_25
[第33楼]   [ 回复时间:2009-05-31 07:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-28 07:04
学习了,还是上机操作一下.
tsembrace
[第34楼]   [ 回复时间:2009-06-17 21:43 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
29楼zjxiaogaoren 的回答很让我受教,多谢!
但还有个问题:
“2、 mov cs:[0],ds:[10]  原因cs:[0]是一个内存单元,内存单元的mov操作必须明确是多少位的mov操作,因为ds:[10]也是一个内存单元,CPU无法知道是对8位还是16位的mov操作(masm后的错误信息: Improper operand type中文注释: 不当操作类型),说明内存单元与内存单元之间不能直接mov操作”
这段中 cs:[0]和ds[10]分别为单个内存存储单元,大小均为8位,即1个字节。为什么会说还得明确多少位呢?因为和通用寄存器AX,BX等明确为双字节一样,单内存单元也明确为单字节大小。
我也通过debug验证了,正确答案为pop SI。
我就想着,如果从“必须指定操作位数的角度无法去说明(原因见上述)的话;是不是这样理解会更好一些:不管是主板ROM/RAM还是显卡或扩展槽的ROM/RAM,CPU将其看为"统一内存"。而对于8086-8088-80386等而言,总线仅在cpu.主板、显卡,扩展槽之间串有总线,并通过总线使得各部件得以联络和操作;而在"统一内存"内部各单元间是不存在总线连接的,所以内存单元之间无法直接互动,想要联络,需要先通过外部总线出去,再进来找到想联络的另外那个内存单元。
不知道自己说清楚了没~呵呵。
lihongbo6668201
[第35楼]   [ 回复时间:2009-06-25 22:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-06-04 23:48
楼主错了额,不是2占内存的大小,它默认是一个字节的,应该是mov byte ptr ds[0],2
zhang898600
[第36楼]   [ 回复时间:2012-07-09 11:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-06-11 21:15
课本3.4开始就说了mov指令的几种形式,唯有 mov 内存单元,数据  这条指令是不存在的! 看了这个帖,才发现的。这也是4题错误的原因啊。  不能吧数据直接同过mov指令传给内存单元,这次记住了
========================================================
大哥们,mov 内存单元,数据 这条指令是存在的,不要误导新人了好不好,只是要指明对内存单元的操作类型,以后章节就会学到了,4题应该写成mov byte ptr ds:[0],2  或者 mov word ptr ds:[0],2 或者mov dword ptr ds:[0],2
asura-king
[第37楼]   [ 回复时间:2012-09-22 18:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-09-16 00:19
感谢啊!我差一点就忘了‘栈操作是以字为单位’的
zhjw8086
[第38楼]   [ 回复时间:2012-10-10 17:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-10-09 11:54
如果一条操作指令有两个操作数,其中一个一定要是寄存器///这是规定
227873
[第39楼]   [ 回复时间:2012-11-17 23:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-11-16 13:28
是不是一切原因都可以归结为所编写的指令不能有二义,必须是特别清楚的
chinatree
[第40楼]   [ 回复时间:2012-11-18 02:15 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
并不紧紧是二义哦~
mov word ptr ds:[bx+si+1234h],5678h
这种指令格式是完全支持的,到了386,甚至还支持另一种表达方法:
mov dword ptr es:[eax+ecx*8+12345678h],847654321h
keai4le
[第41楼]   [ 回复时间:2012-12-13 20:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-12-11 23:06
学习了
keai4le
[第42楼]   [ 回复时间:2012-12-15 19:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-12-11 23:06
回复:[第6楼]
------------------
内存单元是可以立即数赋值的
keai4le
[第43楼]   [ 回复时间:2012-12-15 19:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-12-11 23:06
回复:[第36楼]
------------------
加了byte ptr之后
为什么我用debug的a命令显示错误
keai4le
[第44楼]   [ 回复时间:2012-12-15 20:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-12-11 23:06
回复:[第36楼]
------------------
直接编译执行没有错误。
wzl
[第45楼]   [ 回复时间:2013-04-14 08:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-29 16:45
可以参见杨季文编著钱培德审,清华大学出版社、98年6月第1版《汇编语言》,第30页图2.13MOVE指令数据传送方向示意图,有关通用寄存器间、段寄存器、存储器、操作数间的数据传送,此图给出了清晰直观的解释。

   不会在回帖中插入图片,只好让大家自己去查找了。
form4.c
[第46楼]   [ 回复时间:2013-04-14 19:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-04-11 23:46
mov word ptr ds:[0],2
mov byte ptr ds:[0],2
stop1204
[第47楼]   [ 回复时间:2013-04-19 02:58 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
1   -       al(1字节)无法存字单元(2字节)
2跟4       [0]本身就是段地址DS:0, 你再加cs或着ds 就错了
chinason22
[第48楼]   [ 回复时间:2013-05-05 11:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-04 19:50
3正确,4应该指明类型
hky987654321
[第49楼]   [ 回复时间:2013-07-23 18:21 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
下列指令的书写正确的是:____  
 1、 push al  
 2、 mov cs:[0],ds:[10]  
 3、 pop si  
 4、 mov ds:[0],2  
    答:正确的是3、 pop si。  
    这是一道初学汇编时的考题。 由于还没用过SI,一看有点“濛”。
    答案2和4的语法是错的,mov指令没有这种语法;而出入栈操作的数据都是以字为单位,答案1中al寄存器存储的数据为字节,不符合出入栈需要,故也是错误。唯一只能选答案3了。
    再看SI。使用debug时,看到SI=0000,因此,SI是16位的寄存器,可以存储出栈的字。这样,绕过没学SI的“濛”,结果肯定是答案3。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved