繁体   English   中英

装配中的分段错误

[英]Segmentation Fault in Assembly

我有以下汇编代码:

00000000 <Q2>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 20                sub    $0x20,%esp
   6:   c7 45 fc 1f 00 00 00    movl   $0x1f,-0x4(%ebp)
   d:   c7 45 f8 06 f4 ff ff    movl   $0xfffff406,-0x8(%ebp)
  14:   8b 45 fc                mov    -0x4(%ebp),%eax
  17:   8b 55 08                mov    0x8(%ebp),%edx
  1a:   8d 04 02                lea    (%edx,%eax,1),%eax
  1d:   89 45 f4                mov    %eax,-0xc(%ebp)
  20:   8b 45 08                mov    0x8(%ebp),%eax
  23:   0f af 45 f4             imul   -0xc(%ebp),%eax
  27:   89 45 f0                mov    %eax,-0x10(%ebp)
  2a:   8b 45 f8                mov    -0x8(%ebp),%eax
  2d:   8b 55 f0                mov    -0x10(%ebp),%edx
  30:   8d 04 02                lea    (%edx,%eax,1),%eax
  33:   89 45 ec                mov    %eax,-0x14(%ebp)
  36:   83 7d ec 00             cmpl   $0x0,-0x14(%ebp)
  3a:   74 0a                   je     46 <Q2+0x46>
  3c:   b8 00 00 00 00          mov    $0x0,%eax
  41:   8b 00                   mov    (%eax),%eax
  43:   89 45 f4                mov    %eax,-0xc(%ebp)
  46:   8b 45 f8                mov    -0x8(%ebp),%eax
  49:   89 c2                   mov    %eax,%edx
  4b:   c1 fa 1f                sar    $0x1f,%edx
  4e:   f7 7d 08                idivl  0x8(%ebp)
  51:   c9                      leave  
  52:   c3                      ret  

我认为分段错误位于第4e行,在将其右移十进制0x1f (31)后,它将被%edx除以。 我认为答案很可能导致除以0除非数字大于或等于2^31

我被告知,是否发生分段错误取决于函数的1个参数的值。 通过进一步检查汇编代码,我得出的结论是,故障不取决于参数。 我似乎找不到我所忽略的东西。 有人可以帮忙吗?

问题在于这些行:

3c:   b8 00 00 00 00          mov    $0x0,%eax
41:   8b 00                   mov    (%eax),%eax

您要将0移到%eax ,然后尝试访问(%eax)处的内存。 在许多操作系统(例如linux)上,尝试读取地址0x0将导致分段错误。

如果我正确地阅读了代码,则除非param * (param + 31) == 3066发生,否则可能会发生,如果param为-73或42。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM