请问为什么给通用寄存器赋值都有错?

fangxu1999 2007-06-20 03:33:38
我用的是MASM611,代码很简单,可是就是不对,请问各位为什么啊,谢谢了
.386
.model flat
.stack
.data
.code
start: mov eax,12345678h ;;为什么该赋值语句执行完毕后eax中内容为0000566A?
end start

...全文
175 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangxu1999 2007-06-20
  • 打赏
  • 举报
回复
我刚刚没有仔细看,刚刚开始的那个就是32位代码段
.386
.model small
32位段
_TEXT . . . . . . . . . . . . . 32 Bit

.model small
.386
是16位段
_TEXT . . . . . . . . . . . . . 16 Bit
书上还是对的。

生成的代码:
32位段直接使用32位操作数
mov eax,12345678h
B8 12345678
而16位段使用了操作数长度前缀
mov eax,12345678h
66| B8 12345678

可是在执行过程中,16位段IP取址并执行正常,一下子把这条指令66B812345678取完了。
32位段中EIP把B812345678分成了两段来取:B87856和3412,
前者对应于MOV AX,5678,后者对应于XOR AL,12
出错问题在于取指不对,请问怎么办啊.
fangxu1999 2007-06-20
  • 打赏
  • 举报
回复
谢谢啦,书上将.model和.386的次序讲错了。
不过在VC++中不能简单地改变这两条伪指令的次序啊,
改成如下之后:
.model flat,c
.386
public product
.code
......
报错了:
error A2085: instruction or register not accepted in current CPU mode
error A2013: .MODEL must precede this directive
请问该怎么办啊?
大熊猫侯佩 2007-06-20
  • 打赏
  • 举报
回复
就是啊!看看你的代码段是16位的吧?
fangxu1999 2007-06-20
  • 打赏
  • 举报
回复
果然是有问题的,MASM把这条语句汇编成了:
MOV AX,5678
XOR AL,12
两条。
可是如何才能按照愿意进行赋值呢?EAX不是32位的寄存器吗?
zhgwbzhd 2007-06-20
  • 打赏
  • 举报
回复
不应该吧。
大熊猫侯佩 2007-06-20
  • 打赏
  • 举报
回复
跟踪运行时的指令,看看你把什么值赋进去了。

21,459

社区成员

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

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