关于汇编语言的一个赋值问题,求大神指教!

zhaocanxing 2013-10-31 06:05:15
mov eax,10h
mov ds,ax
这段代码是linux内核system_call.s里面拿出来的。
我弄不明白,为什么第一句给eax赋值,然后下面却用ax去给别的寄存器赋值呢?
为什么第一句不直接用ax呢?
...全文
320 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-11-16
  • 打赏
  • 举报
回复
32Bits 使用16Bits寄存器,加前缀 0x66
引用 7 楼 lm_whales 的回复:
32 Bits 里使用 16 Bits 寄存器,要加前缀,表示使用16Bits寄存器, mov ax,10h 比 mov eax,10h 指令长度多一个字节,取指令可能要,多用一个时钟周期。 同样 16 Bits 里使用 32 Bits 寄存器,要加前缀,表示使用16Bits寄存器, 32Bits的 mov eax,10h 和 16 Bits 的 mov ax,10h 除了立即数长度不同外,指令完全一样。 这个指令系统这样设计,导致这个问题。 为了区分32Bits,和16Bits,寄存器, 当指令的Bits和寄存器,不一致的时候,就要加前缀,以示区别。
lm_whales 2013-11-16
  • 打赏
  • 举报
回复
32 Bits 里使用 16 Bits 寄存器,要加前缀,表示使用16Bits寄存器, mov ax,10h 比 mov eax,10h 指令长度多一个字节,取指令可能要,多用一个时钟周期。 同样 16 Bits 里使用 32 Bits 寄存器,要加前缀,表示使用16Bits寄存器, 32Bits的 mov eax,10h 和 16 Bits 的 mov ax,10h 指令完全一样。 这个指令系统这样设计,导致这个问题。 为了区分32Bits,和16Bits,寄存器, 当指令的Bits和寄存器,不一致的时候,就要加前缀,以示区别。
lm_whales 2013-11-16
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
之所以要 mov eax,10h mov ds,ax 而不是 mov ax,10h mov ds,ax 是因为在32位模式下,后者会导致所谓的Partial Register Stall,指令执行时间延长。虽然这一两个时钟周期的延迟微不足道,但是linux内核的维护者应该是精益求精的优化论者。:)
++
dlpzgr 2013-11-01
  • 打赏
  • 举报
回复
这个后面那句可能就用ax的就成了吧,这个要看上下文
zara 2013-11-01
  • 打赏
  • 举报
回复
http://www.agner.org/optimize 的 2. 里有这么一段:
Instructions with multiple prefixes can slow down decoding. The maximum number of prefixes that an instruction can have without slowing down decoding is 1 on 32-bit Intel processors, 2 on Intel P4E processors, 3 on AMD processors, and unlimited on Core2. Avoid address size prefixes. Avoid operand size prefixes on instructions with an immediate operand. For example, it is preferred to replace MOV AX,2 by MOV EAX,2.
axx1611 2013-11-01
  • 打赏
  • 举报
回复
光看这两句的话用ax是可以的,但如果后面还有用到eax的话就不一定了
  • 打赏
  • 举报
回复
之所以要 mov eax,10h mov ds,ax 而不是 mov ax,10h mov ds,ax 是因为在32位模式下,后者会导致所谓的Partial Register Stall,指令执行时间延长。虽然这一两个时钟周期的延迟微不足道,但是linux内核的维护者应该是精益求精的优化论者。:)
zara 2013-10-31
  • 打赏
  • 举报
回复
这好像也太钻牛角尖了吧。有可能是随手而为,毕竟 32 位保护模式下 eax 的通行的;也有可能在后面有用上。

21,459

社区成员

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

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