h2995527 发表于 2011-3-27 14:46:06

【重金悬赏】关于mov eax offset x

本帖最后由 h2995527 于 2011-3-27 15:00 编辑

.data
x byte?
yword ?
mov eaxoffset x是合法的?而
moveaxx 不合法为什么?能不能帮忙解释一下?
我觉的:mov eax,x 中的x为标号,
      被编译器编译成一个 地址。
      编译成成mov eax,[地址]。
      但事实上,mov eax,x是不合法的。因为 数据类型不符!
      为什么 数据类型不符啊。
      请详细解释一下 mov eax,x中的X 的具体含义?

2,
or eax,eax。
or 指令。取 or 2个非2进制的数。是什么意思?
的具体含义是什么,主要用途是什么?
举例说明谢谢了。
这2个问题想了 最少有 20个小时了 。有悬赏分的!~~
要详细答案!!,不要打的字比我少!:'(

小甲鱼 发表于 2011-3-27 14:46:07

1. x是定义byte型数据,与eax宽度不同,不能发生关系{:5_109:}

2. or eax, eax不是没事找事做哈,虽然结果还是等于本身,但他的目的主要是用于改变标志位寄存器。
    or 指令影响标志位PF、SF、ZF 、CF、OF
    在同一个通用寄存器自身相“或”时, 操作数虽不变, 但使CF置零。本指令主要用于置某些位为零。

h2995527 发表于 2011-3-28 09:46:28

本帖最后由 h2995527 于 2011-3-28 11:34 编辑

回复 2# 小甲鱼

经过我20多个小时的琢磨

我会了
在数据段定义 X db ? {意思 在数据段定义一个未初始化变量的字节空间。一般定义局部变量,如果生成EXE文件的话。不占用内存空间。但运行EXE文件,使用此变量时。占用空间。结束后,释放内存空间}
mov eax,offset x
offset在编译器指令,是编译器运行时直接被 编译作 x的地址
例如: x地址为 21000b
指令:mov eax,offset x编译后 debug查看就是 mov eax, 21000b
则 mov eax ,x
把这条指令 反汇编后,
会发现 变成了 mov eax,byte ptr
指令:mov eax, word ptr ,进行反汇编后是:mov eax, word ptr ,
【以上都是在 数据段定义 X db ?】
【以下都是在数据段定义 X dw ?】
指令:mov eax,X在进行反汇编后是: mov eax, word ptr

第二个:
or eax,eax指令与 or al,01001000是不同的》
or eax,eax指令是32位指令。此指令。不做实际运算。只影响标志位CF。一般用作查看 是否为真指令 。CF为1即为真,为0即为假。后面一般跟跳转指令。
[它不改变eax的值,但会修改标志位,所以后面常跟jz、js、jp等判断eax是否为0]
or al,01001000指令是16位指令。此指令参与运算 al=al or 01001000B。 一般用作某位 置 1!!

以上我我自己总结!!:lol

e马先森 发表于 2017-2-16 13:06:18

小甲鱼老师说的很对{:10_254:}
页: [1]
查看完整版本: 【重金悬赏】关于mov eax offset x