"mov eax, a"和"mov dword ptr[a], eax"的问题。.

weiwuyuan 2012-02-24 11:52:04
inb a = 10;
int b = 0;


__asm
{
mov eax, a ; eax = 10
mov dword ptr[b], eax ; b = 10
}


既然第1句的a是作为一个值被使用的,那问为什么第2句不是"mov dword ptr[10], eax"??
...全文
1003 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2012-02-24
  • 打赏
  • 举报
回复 1
mov a,eax和mov dword ptr[a],eax一样的
都是往a的地址那里放,如果a是short那么就和word ptr一样
weiwuyuan 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zara 的回复:]
不对吧?楼主这两个汇编指令是哪里来的?这两指令的形式虽然不一样,但对变量的意义是一样的,指令里的都是地址,操作的都是其内容。不同的形式,应该是不同的反汇编软件的风格的不同而已。同一个软件,一般是不会有这样的。
[/Quote]

你是说第1个操作数一般是地址,第2个操作数一般是内容??
那我如何将变量a的地址保存到寄存器中(不用指针变量)?
zara 2012-02-24
  • 打赏
  • 举报
回复
不对吧?楼主这两个汇编指令是哪里来的?这两指令的形式虽然不一样,但对变量的意义是一样的,指令里的都是地址,操作的都是其内容。不同的形式,应该是不同的反汇编软件的风格的不同而已。同一个软件,一般是不会有这样的。
weiwuyuan 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lactoferrin 的回复:]
第二个可以改成mov b,eax
第一个可以改成mov eax,dword ptr[a]都一样
但mov dword ptr[10],eax就不行
[/Quote]

我是想知道,为什么同样都是一个C变量,在两种语句下,一个是代表值,一个是代表变量地址呢???
Lactoferrin 2012-02-24
  • 打赏
  • 举报
回复
第二个可以改成mov b,eax
第一个可以改成mov eax,dword ptr[a]都一样
但mov dword ptr[10],eax就不行
zara 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 weiwuyuan 的回复:]我是想让人告诉我,变量名在不同的位置上,既可能被当做地址,也可能被当做内容。[/Quote]
你还是被绕里面,而且没看到原始状态的反汇编指令,否则就不会有这样的疑问了。

mov eax, a --> mov eax, dword ptr [ebp-??]
mov a, eax --> mov dword ptr [ebp-??], eax
a 在上面两指令里,何为地址,何为内容?

mov eax, offset a --> mov eax, ????????h ; 对全局或静态类变量
lea eax, a --> lea eax, [ebp-??] ; 对局部变量
这两指令又当如何

还是不明白的话,这问题就先放下吧。
Lactoferrin 2012-02-24
  • 打赏
  • 举报
回复
是既可以被当做地址,也可以被当做内容
weiwuyuan 2012-02-24
  • 打赏
  • 举报
回复
楼上两位误解了我的意思,
我的指令的确都是从反汇编(Alt+8)里贴出来的,

我是想让人告诉我,变量名在不同的位置上,既可能被当做地址,也可能被当做内容。
masmaster 2012-02-24
  • 打赏
  • 举报
回复
把int a=10,b=a;反汇编一下便知
zara 2012-02-24
  • 打赏
  • 举报
回复
感觉你的理解走岔路了。
第1句:mov eax, a 这里是通过 a 的地址来获取 a 的内容。
第2句:mov a, eax 这里是通过向 a 的地址写入新的值来设置 a 的内容。
或者,你看下机器码或最底的反汇编指令吧,别看这类带源调试信息内容的,反而容易误解。
Lactoferrin 2012-02-24
  • 打赏
  • 举报
回复
mov a,eax也可以看作内容,即把a的内容变成eax的内容
weiwuyuan 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zara 的回复:]
引用 4 楼 weiwuyuan 的回复:你是说第1个操作数一般是地址,第2个操作数一般是内容??
不是这个意思。这两指令,在机器码里的都是它们的地址,要存取的是这个地址里的内容,而不是地址本身。


引用 4 楼 weiwuyuan 的回复:那我如何将变量a的地址保存到寄存器中(不用指针变量)?
这个一般是看变量的类型,全局性的或静态类的,mov eax, offset a 即获得 a……
[/Quote]

如果都是地址的话,
那么 mov eax, a 应该理解为把变量a的地址给eax
然后mov a, eax,才好理解为把eax的值放到a所在的地址里面

而实际却是mov eax, a是把a的值给eax

在说下我问题的核心在于
第1句:mov eax, a 这里把a当作的是内容
第2句:mov a, eax 这里为什么不是把a当做内容,而是当作地址????
zara 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 weiwuyuan 的回复:]你是说第1个操作数一般是地址,第2个操作数一般是内容??[/Quote]
不是这个意思。这两指令,在机器码里的都是它们的地址,要存取的是这个地址里的内容,而不是地址本身。

[Quote=引用 4 楼 weiwuyuan 的回复:]那我如何将变量a的地址保存到寄存器中(不用指针变量)?[/Quote]
这个一般是看变量的类型,全局性的或静态类的,mov eax, offset a 即获得 a 变量的地址;如果是普的局部变量,则需要使用 lea 指令如 lea eax, b 。

21,494

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧