64位下mov $0x80000000,%eax会不会影响%rax的高32位?

发布于 2022-09-15 03:09:54 字数 26 浏览 7 评论 7

我觉得不会影响,但是调试发现会,全部清零,什么道理?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

半山落雨半山空 2022-09-20 14:30:56

AMD 第一卷上有

In general, byte and word operands are stored in the low 8 or 16
bits of GPRs without modifying their high 56 or 48 bits,
respectively. Doubleword operands, however, are normally
stored in the low 32 bits of GPRs and zero-extended to 64 bits.

一杯敬自由 2022-09-20 14:29:20

mov eax, 0x80000000 --> b8 00 00 00 80

mov ebx, 0x80000000 --> c7 c3 00 00 00 80

-------------------------------------------------------------------

两种编码方式都做了"零扩展"

以前还真没认识到这个问题,要记录下来。

乙白 2022-09-20 14:21:50

汗~

还真有这回事,连 AMD / Intel 的官方文档都没讲清楚

下面是我在 bochs 调试的情况:

  1. Next at t=177905194
  2. rax: 0xffff8000:00400000 rcx: 0x00000000:00000000
  3. rdx: 0x00000000:00000000 rbx: 0xfffff000:fffff000
  4. rsp: 0xfffff000:fffffff0 rbp: 0x00000000:0000b028
  5. rsi: 0x00000000:ffff9000 rdi: 0x00000000:000b9900
  6. r8 : 0x00000000:00000000 r9 : 0x00000000:00000000
  7. r10: 0x0000ee00:00000000 r11: 0xffff9000:00051008
  8. r12: 0x00000000:00000000 r13: 0x00000000:00000000
  9. r14: 0x00000000:00000000 r15: 0x00000000:00000000
  10. rip: 0xffff8000:004000c8
  11. eflags 0x00000246: id vip vif ac vm rf nt IOPL=0 of df IF tf sf ZF af PF cf
  12. (0) [0x1f4000c8] 0058:ffff8000004000c8 (unk. ctxt): mov eax, 0x80000000 ; b800000080
  13. <bochs:6> s
  14. Next at t=177905195
  15. rax: 0x00000000:80000000 rcx: 0x00000000:00000000
  16. rdx: 0x00000000:00000000 rbx: 0xfffff000:fffff000
  17. rsp: 0xfffff000:fffffff0 rbp: 0x00000000:0000b028
  18. rsi: 0x00000000:ffff9000 rdi: 0x00000000:000b9900
  19. r8 : 0x00000000:00000000 r9 : 0x00000000:00000000
  20. r10: 0x0000ee00:00000000 r11: 0xffff9000:00051008
  21. r12: 0x00000000:00000000 r13: 0x00000000:00000000
  22. r14: 0x00000000:00000000 r15: 0x00000000:00000000
  23. rip: 0xffff8000:004000cd
  24. eflags 0x00000246: id vip vif ac vm rf nt IOPL=0 of df IF tf sf ZF af PF cf
  25. (0) [0x1f4000cd] 0058:ffff8000004000cd (unk. ctxt): mov ebx, 0x80000000 ; c7c300000080
  26. <bochs:7> s
  27. Next at t=177905196
  28. rax: 0x00000000:80000000 rcx: 0x00000000:00000000
  29. rdx: 0x00000000:00000000 rbx: 0x00000000:80000000
  30. rsp: 0xfffff000:fffffff0 rbp: 0x00000000:0000b028
  31. rsi: 0x00000000:ffff9000 rdi: 0x00000000:000b9900
  32. r8 : 0x00000000:00000000 r9 : 0x00000000:00000000
  33. r10: 0x0000ee00:00000000 r11: 0xffff9000:00051008
  34. r12: 0x00000000:00000000 r13: 0x00000000:00000000
  35. r14: 0x00000000:00000000 r15: 0x00000000:00000000
  36. rip: 0xffff8000:004000d3
  37. eflags 0x00000246: id vip vif ac vm rf nt IOPL=0 of df IF tf sf ZF af PF cf

复制代码

我分别用两种指令编码方式来测试  mov reg32, imm32 ,结果都是将高32位清 0 了,它们都作了 “零扩展”动作

AMD /Intel 的文档都没说出这个问题。

淑女气质 2022-09-20 13:07:43

在指令mov $0x80000000,%eax之前,我设置了%rax的值,是-1,执行该指令后,再查看%rax的值,是0x80000000.说明高32位被冲掉了

苍白女子 2022-09-20 11:57:08

不懂用 gdb

问题在哪?

一场春暖 2022-09-20 03:03:42

那么下面的调试结果如何解释?

  1. (gdb)
  2. 0x000000000042f2de      4671            exp->X_add_number
  3. 1: x/i $rip
  4. 0x42f2de <i386_immediate+536>:  mov    $0x80000000,%eax
  5. (gdb) p $rax
  6. $1 = 0
  7. (gdb) set $rax=-1
  8. (gdb) p /x $rax
  9. $3 = 0xffffffffffffffff
  10. (gdb) si
  11. 0x000000000042f2e3      4671            exp->X_add_number
  12. 1: x/i $rip
  13. 0x42f2e3 <i386_immediate+541>:  xor    0x10(%rdx),%rax
  14. (gdb) p /x $rax
  15. $4 = 0x80000000
  16. (gdb)  

复制代码

刘备忘录 2022-09-19 23:34:55

是不会影响的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文