2015-04-07 2 views
1

Я читал и изучал ассемблерный код. Код нижеКак узнать текущий флаг переноса в коде сборки?

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, инструкция является < SBB $ 0x1d08048d, % eax>

руководство по эксплуатации, sbb подставка для dest = dest - (флаг src + carry). Поэтому мы можем заменить команду 0x804c048 на% eax = $ eax - (флаг $ 0x1d08048d + флаг переноса).

Тогда .... в то время, какое значение установлено для переноса значения флага? Я не нашел инструкции по установке флага переноса, предшествующей линии 0x804c048. Является ли флаг переноса первоначально установлен равным 0?

И второй вопрос: при 0x804854b переходите к значению *% eax. После этого, как процесс возвращается к основной функции? в разделе _vector нет инструкции return.

Буду рад вашей помощи. Благодарю.

+1

В 0x8048541, eax установлен в * содержимое * 0x804c038 (перед операндом нет $), то есть 0x8048d1d. Посмотрите туда поток команд. –

+1

Не редактируйте свой вопрос, чтобы пометить его как разрешенный. Вместо этого отправьте ответ, и (по истечении таймера) отметьте его как принятый, чтобы этот вопрос больше не отображался как неразрешенный. – tripleee

ответ

0

Oh ........ @MarkPlotnick Ты для меня Бог ... Я был полностью пойман в ловушку в < sbb $ 0x1d08048d,% eax>.

В исходном коде сборки массив _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. «0x1d (адрес 0x804c03c)» не переходил на новую строку, поэтому он интерпретировался на нерелевантный код сборки. (Я очень недоволен. Я не делал никакой другой работы, чтобы поймать эту проблему в течение 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> 

вопросов и ответов больше вопросов. Благодарю.

Смежные вопросы