如何知道汇编代码中的当前进位标志?

时间:2015-04-07 02:32:57

标签: linux

我一直在阅读和研究汇编代码。代码如下

Disassembly of section .text:

08048510 <main>:
 8048510:       8d 4c 24 04             lea    0x4(%esp),%ecx
 8048514:       83 e4 f0                and    $0xfffffff0,%esp
 8048517:       ff 71 fc                pushl  -0x4(%ecx)
 804851a:       55                      push   %ebp
 804851b:       89 e5                   mov    %esp,%ebp
 804851d:       51                      push   %ecx
 804851e:       83 ec 08                sub    $0x8,%esp
 8048521:       68 e0 93 04 08          push   $0x80493e0
 8048526:       68 c0 93 04 08          push   $0x80493c0
 804852b:       68 c9 93 04 08          push   $0x80493c9
 8048530:       e8 7a 07 00 00          call   8048caf <eos_printf>
 8048535:       c7 04 24 d6 93 04 08    movl   $0x80493d6,(%esp)
 804853c:       e8 6e 07 00 00          call   8048caf <eos_printf>
 8048541:       a1 38 c0 04 08          mov    0x804c038,%eax
 8048546:       bc 00 00 00 00          mov    $0x0,%esp
 804854b:       ff e0                   jmp    *%eax
 804854d:       8b 4d fc                mov    -0x4(%ebp),%ecx
 8048550:       31 c0                   xor    %eax,%eax
 8048552:       c7 05 34 c0 04 08 00    movl   $0x0,0x804c034
 8048559:       00 00 00
 804855c:       c9                      leave
 804855d:       8d 61 fc                lea    -0x4(%ecx),%esp
 8048560:       c3                      ret

Disassembly of section .data:

0804c030 <_irq_mask>:
 804c030:       ff                      (bad)
 804c031:       ff                      (bad)
 804c032:       ff                      (bad)
 804c033:       ff 01                   incl   (%ecx)

0804c034 <_eflags>:
 804c034:       01 00                   add    %eax,(%eax)
        ...

0804c038 <_vector>:
 804c038:       1d 8d 04 08 1d          sbb    $0x1d08048d,%eax
 804c03d:       8d 04 08                lea    (%eax,%ecx,1),%eax
 804c040:       1d 8d 04 08 37          sbb    $0x3708048d,%eax
 804c045:       8d 04 08                lea    (%eax,%ecx,1),%eax

在0x8048541处,EAX寄存器设置为0x804c038

在0x804854b处,进程跳转到EAX寄存器指向的地址

在0x804c048处,指令是&lt; sbb $ 0x1d08048d,%eax&gt;

根据说明书,sbb代表dest = dest - (src +进位标志)。所以我们可以将0x804c048指令替换为%eax = $ eax - ($ 0x1d08048d +进位标志)。

然后....那时候,设置什么值来携带标志值? 我没有在0x804c048行之前找到任何进位标志设置指令。进位标志最初是否设置为0?

第二个问题是,在0x804854b,进程跳转到*%eax值。之后,进程如何返回main函数? _vector部分没有返回指令。

我很乐意帮助你。感谢。

1 个答案:

答案 0 :(得分:0)

哦........ @MarkPlotnick你是我的上帝......我完全被困在&lt; sbb $ 0x1d08048d,%eax&gt;。

在汇编源代码中,_vector数组和_os_reset_handler函数定义如下。

.data
.global _vector
_vector:
    .long _os_reset_handler
    .long _os_reset_handler
    .long _os_reset_handler
    .long _os_irq_handler

.text
.global _os_reset_handler
_os_reset_handler:
    _CLI
    lea _os_init_stack_end, %esp
    call _os_initialization
    jmp _os_reset_handler

-----------------------
_CLI is defined in another c header file as macro

#define _CLI \
    movl $0, _eflags;

我一直想知道为什么_vector数组不包含_os_reset_handler地址。我再次读取反汇编的代码,发现objdump错误地在_vector数据处的十六进制代码。 &#34; 0x1d(0x804c03c处的地址)&#34;没有去新线,所以它解释为无关的汇编代码。 (我非常不高兴。我没有做任何其他工作来解决这个问题10个小时......)

反正。在地址0x8048d1d处,有_os_reset_handler函数。

08048d1d <_os_reset_handler>:
 8048d1d:       c7 05 34 c0 04 08 00    movl   $0x0,0x804c034
 8048d24:       00 00 00
 8048d27:       8d 25 48 d0 04 08       lea    0x804d048,%esp
 8048d2d:       e8 07 01 00 00          call   8048e39 <_os_initialization>
 8048d32:       e9 e6 ff ff ff          jmp    8048d1d <_os_reset_handler>

没有其他问题了。感谢。