【问题标题】:Can someone help me understand those assembly lines? [closed]有人可以帮我理解那些装配线吗? [关闭]
【发布时间】:2014-11-05 23:19:01
【问题描述】:

有人可以帮我理解这个用汇编编写的 for 循环吗?

   0x08048d27 <+37>:    mov    $0x1, %ebx       //set ebx = 1
   0x08048d2c <+42>:    lea    -0x20(%ebp),%esi     //set esi to the address of the first element of the array
   0x08048d2f <+45>:    mov    -0x4(%esi,%ebx,4),%eax   //eax = esi + ebx * 4
   0x08048d33 <+49>:    sub    %ebx,%eax        //phase
   0x08048d35 <+51>:    cmp    %eax,(%esi,%ebx,4)

   0x08048d38 <+54>:    je     0x8048d3f <phase_2+61>

   0x08048d3a <+56>:    call   0x8049108 <explode_bomb>

   0x08048d3f <+61>:    add    $0x1,%ebx
   0x08048d42 <+64>:    cmp    $0x6,%ebx
   0x08048d45 <+67>:    jne    0x8048d2f <phase_2+45>
   0x08048d47 <+69>:    add    $0x30,%esp
   0x08048d4a <+72>:    pop    %ebx
   0x08048d4b <+73>:    pop    %esi
   0x08048d4c <+74>:    pop    %ebp

我对“mov -0x4(%esi,%ebx,4),%eax”和“cmp %eax,(%esi,%ebx,4)”特别感到困惑,这些是什么意思?

谢谢!

【问题讨论】:

  • 您是否查找过有关汇编语法的参考资料?
  • 我不熟悉这个版本的程序集,但我至少可以告诉你 0x30 != 30。'0x' 前缀表示该数字是十六进制(以 16 为基数)数字,您熟悉十进制(以 10 为基数)的数字。 0x30 = 16*3 = 48
  • 哦,炸弹实验室,玩得开心....
  • @Unn 谢谢!令人困惑的是,我知道这种外观要求 x、4x-4 等... 6 个数字,但我无法弄清楚第一个数字...

标签: assembly


【解决方案1】:
mov    -0x4(%esi,%ebx,4),%eax

eax 的值设置为[esi + ebx*4 - 4] 的值

cmp    %eax,(%esi,%ebx,4)

eax[esi + ebx*4] 的内容进行比较

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2022-07-07
    • 2021-01-04
    相关资源
    最近更新 更多