| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3591 人关注过本帖
标题:一个很菜的问题, 同是dword类型的变量为什么不能用mov指令传值??
只看楼主 加入收藏
xinfeng_08
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-22
收藏
 问题点数:0 回复次数:8 
一个很菜的问题, 同是dword类型的变量为什么不能用mov指令传值??
在学习Win32汇编时尝试用mov指令传递句柄编译报错了这是为什么??
     如我在数据段定义了一个 :
                             hInstance   dword     ?

    然后在代码段把hInstance用mov指令传递到WNDCLASSEX类型变量stWndClass的hInstance属性编译时报错:
                            mov    stWndClass.hInstance,  hInstance

stWndClass.hInstance和hInstance两个都是dword类型什么为不能用mov传递值呢? 改成下面的方式传递值就可以通过编译
                           push    hInstance
                           pop     stWndClass.hInstance
请各位指教一下.
搜索更多相关主题的帖子: 变量 dword mov 传值 指令 
2008-12-07 12:51
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
请看那个立即数问题的答案

说mov也就这样了 看intel的资料罢~~~
2008-12-07 18:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
1、传送指令MOV(Move Instruction)

传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:

MOV  Reg/Mem, Reg/Mem/Imm

其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。在本网络课件的网页中,都将采用上述缩写,此后不再说明。

指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。

下面列举几组正确的指令例子:

源操作数是寄存器
 
 MOV  CH, AL MOV  BP, SP MOV  ECX, EBX
MOV  DS, AX MOV  [BX], CH MOV  [BX+SI], AX
源操作数是存储单元
 
 MOV  AL, [100H] MOV  BX, ES:[DI] MOV  EDX, [BX]
MOV  BX, VARW MOV  AX, [BX+SI] MOV  CH, [BX+DI+100H]
其中:VARW是字类型内存变量(下同)。
源操作数是立即数
 
 MOV  AL, 89H MOV  BX, -100H MOV  EDX, 12345678H
MOV  VARW, 200H MOV  [BX], 2345H MOV  [BX+DI], 1234H

在汇编语言中,主要的数据传送方式如图5.1所示。虽然一条MOV指令能实现其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。



图5.1 MOV指令数据传送示意图

对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。

 1)、两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV  BL, AX等是不正确的;
2)、两个操作数不能同时为段寄存器,如:MOV  ES, DS等;
3)、代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV  CS, AX等不正确,但指令MOV  AX, CS等是正确的;
 
4)、立即数不能直接传给段寄存器,如:MOV  DS, 100H等;
5)、立即数不能作为目的操作数,如:MOV  100H, AX等;
6)、指令指针IP,不能作为MOV指令的操作数;
7)、两个操作数不能同时为存储单元,如:MOV  VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。

对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。表5.1列举一个可行的解决方案,尽供参考。读者可考虑用其它办法来完成同样的功能。

表5.1 MOV指令的变通方法

功能描述
 不正确的指令
 可选的解决方法
 
把DS的值传送给ES
 MOV  ES, DS
 MOV  AX, DS
MOV  ES, AX
 
把100H传给DS
 MOV  DS, 100H
 MOV  AX, 100H
MOV  DS, AX
 
把字变量VARB的值传送给字变量VARA
 MOV  VARA, VARB
 MOV  AX, VARB
MOV  VARA, AX
 

对于情况1:不同位数数据之间的传送问题,在80386及其以后的CPU中,增加一组新的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的部分按指令的规定进行填充。
2008-12-07 18:01
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
说白了 没这种用法

学什么汇编都得熟悉指令呀~~~
2008-12-07 18:03
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
7)、两个操作数不能同时为存储单元

当时抄第1个窗口代码时, 我也有些疑惑,为什么要用PUSH POP呢,改成MOV以后,不成功,又找了资料,才知道这个原因.    这些慢慢遇到 慢慢积累,遇到一次就会记住一串相关知识的.

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2008-12-07 18:31
xinfeng_08
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-22
收藏
得分:0 
受教了, 谢谢!
2008-12-07 20:30
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用你们都要疼我哦在2008-12-7 18:31的发言:

7)、两个操作数不能同时为存储单元

当时抄第1个窗口代码时, 我也有些疑惑,为什么要用PUSH POP呢,改成MOV以后,不成功,又找了资料,才知道这个原因.    这些慢慢遇到 慢慢积累,遇到一次就会记住一串相关知识的.[em0 ...


有些规定很难记 还是试一试好

没编译器都不敢写 呵呵
2008-12-07 20:38
西佳佳
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-11-28
收藏
得分:0 
这是一个从0开始形成的三角波,但如果从2开始形成一个三角波,怎么改呀。
(就是怎么将从0开始形成的三角波上移两个单位)

     MOV   DX,  0FFFEH
     MOV   AL, 82H
     OUT   DX, AL
S:  MOV   DX, 0FFF8H
    MOV   AL, 00H
Z:  OUT   DX,  AL
    INC   AL
    JNZ   Z
F:   MOV   AL,0FFH
    OUT   DX,AL
    DEC   AL
    JNZ    F
    JMP   S
2008-12-07 20:56
songshilian
Rank: 2
等 级:新手上路
威 望:3
帖 子:40
专家分:0
注 册:2008-11-23
收藏
得分:0 
仔细看看基础就知道了,很简单的,这是因为两个操作数都是存储单元,所以才报错的,这个在win32里面没有说明,需要看看8086/8088或者是IBMPC汇编这类书籍。
2008-12-07 21:36
快速回复:一个很菜的问题, 同是dword类型的变量为什么不能用mov指令传值??
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015720 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved