为什么AS有时会接受大位移而有时却不接受?

用户名

我知道MOD + R / M字段中的位移最大是一个有符号的32位整数。但是,当我传递的值对于32位有符号的而言太大(但对于无符号的32位来说足够小)时,我看到了一些不一致的行为。

例子:

.intel_syntax noprefix
mov [eax + eax + 0xdeadbeef], al
mov [r10d + r10d + 0xdeadbeef], al
mov [rax + rax + 0xdeadbeef], al
mov [r10 + r10 + 0xdeadbeef], al

当我汇编(和解散)时,得到以下结果:

0:  67 88 84 00 ef be ad    mov    BYTE PTR [eax+eax*1-0x21524111],al
7:  de
8:  67 43 88 84 12 ef be    mov    BYTE PTR [r10d+r10d*1-0x21524111],al
f:  ad de
11: 88 04 00                mov    BYTE PTR [rax+rax*1],al
14: 43 88 04 12             mov    BYTE PTR [r10+r10*1],al

如可以看到的,对于32位寄存器(eaxr10d)32位位移字面(和解释为有符号的32位整数)和64位寄存器(raxr10),它被丢弃。

虽然我认为两者都是合理的输入输出,但我没有立即看到这种不一致处理的原因。这是否记录在某处?

小丑

似乎是intel语法模块中的错误。如果使用at&t语法,则会导致错误消息:

mov %al, 0xdeadbeef(%rax, %rax)

结果是:

Error: 0xdeadbeef out range of signed 32bit displacement

更新:该错误似乎是因为在调用baseindex之后设置了该标志,该标志i386_finalize_displacement仅在设置了错误的情况下才会检测到。一个简单的解决方法是将标记集移到更早的位置。我没有发现任何明显的问题,至少可以解决此问题:

--- tc-i386-intel.c.orig        2012-01-16 04:06:06.000000000 +0100
+++ tc-i386-intel.c     2014-06-14 16:13:31.238740524 +0200
@@ -835,6 +835,9 @@
       memcpy (expP, &exp, sizeof(exp));
       resolve_expression (expP);

+      if (intel_state.base || intel_state.index)
+       i.types[this_operand].bitfield.baseindex = 1;
+
       if (expP->X_op != O_constant
          || expP->X_add_number
          || (!intel_state.base
@@ -882,9 +885,6 @@
            return 0;
        }

-      if (intel_state.base || intel_state.index)
-       i.types[this_operand].bitfield.baseindex = 1;
-
       if (intel_state.seg)
        {
          for (;;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么AS有时会接受大位移而有时却不接受?

来自分类Dev

为什么Ruby Procs有时会返回而有时却是错误?

来自分类Dev

为什么`.asInstanceOf`有时会抛出,有时却不会抛出?

来自分类Dev

为什么我的while循环有时会卡住,而有时却不会出现在“秘密圣诞老人”程序中?

来自分类Dev

为什么Ajax有时会对序列化的数据进行urlencode,而有时却不会呢?

来自分类Dev

为什么ng-model有时会预先填充而有时却没有?

来自分类Dev

为什么我有时会出错而有时却没有呢?

来自分类Dev

为什么同一条SQL有时会报告错误,而有时却运行良好?

来自分类Dev

在Ubuntu上,为什么有时有时会“ sudo apt-get”而有时却会“ sudo aptitude”?

来自分类Dev

为什么BeautifulSoup有时会使用find_all查找所有元素,而有时却找不到?

来自分类Dev

为什么此URLClassLoader有时起作用而有时却不起作用?

来自分类Dev

为什么`find`有时会找到我的文件,有时却找不到

来自分类Dev

为什么有时在编辑文件后有时会创建重复文件?

来自分类Dev

为什么来自子进程的管道有时会中断,有时不会?

来自分类Dev

为什么我有时会得到嵌入的属性有时不会?

来自分类Dev

为什么Clang有时会返回nullptr,有时会返回我想要的?

来自分类Dev

为什么 x-terminal-emulator 有时会在启动时退出,有时不会?

来自分类Dev

为什么Google Calendar API V3不接受所有时区ID?

来自分类Dev

为什么Vim有时会创建.swp文件?

来自分类Dev

为什么结帐有时会暂存文件?

来自分类Dev

为什么整数属性有时会返回0?

来自分类Dev

为什么导航属性有时会返回null?

来自分类Dev

为什么有时会出现细分错误?

来自分类Dev

为什么后台进程有时会自发停止?

来自分类Dev

为什么registerForRemoteNotificationTypes有时会失败?

来自分类Dev

为什么有时会显示隐藏的表单失火?

来自分类Dev

为什么“少”有时会忘记其历史

来自分类Dev

为什么有时会跳过input.next()?

来自分类Dev

人们为什么有时会声明数组大小?

Related 相关文章

  1. 1

    为什么AS有时会接受大位移而有时却不接受?

  2. 2

    为什么Ruby Procs有时会返回而有时却是错误?

  3. 3

    为什么`.asInstanceOf`有时会抛出,有时却不会抛出?

  4. 4

    为什么我的while循环有时会卡住,而有时却不会出现在“秘密圣诞老人”程序中?

  5. 5

    为什么Ajax有时会对序列化的数据进行urlencode,而有时却不会呢?

  6. 6

    为什么ng-model有时会预先填充而有时却没有?

  7. 7

    为什么我有时会出错而有时却没有呢?

  8. 8

    为什么同一条SQL有时会报告错误,而有时却运行良好?

  9. 9

    在Ubuntu上,为什么有时有时会“ sudo apt-get”而有时却会“ sudo aptitude”?

  10. 10

    为什么BeautifulSoup有时会使用find_all查找所有元素,而有时却找不到?

  11. 11

    为什么此URLClassLoader有时起作用而有时却不起作用?

  12. 12

    为什么`find`有时会找到我的文件,有时却找不到

  13. 13

    为什么有时在编辑文件后有时会创建重复文件?

  14. 14

    为什么来自子进程的管道有时会中断,有时不会?

  15. 15

    为什么我有时会得到嵌入的属性有时不会?

  16. 16

    为什么Clang有时会返回nullptr,有时会返回我想要的?

  17. 17

    为什么 x-terminal-emulator 有时会在启动时退出,有时不会?

  18. 18

    为什么Google Calendar API V3不接受所有时区ID?

  19. 19

    为什么Vim有时会创建.swp文件?

  20. 20

    为什么结帐有时会暂存文件?

  21. 21

    为什么整数属性有时会返回0?

  22. 22

    为什么导航属性有时会返回null?

  23. 23

    为什么有时会出现细分错误?

  24. 24

    为什么后台进程有时会自发停止?

  25. 25

    为什么registerForRemoteNotificationTypes有时会失败?

  26. 26

    为什么有时会显示隐藏的表单失火?

  27. 27

    为什么“少”有时会忘记其历史

  28. 28

    为什么有时会跳过input.next()?

  29. 29

    人们为什么有时会声明数组大小?

热门标签

归档