Я читал и изучал ассемблерный код. Код нижеКак узнать текущий флаг переноса в коде сборки?
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.
Буду рад вашей помощи. Благодарю.
В 0x8048541, eax установлен в * содержимое * 0x804c038 (перед операндом нет $), то есть 0x8048d1d. Посмотрите туда поток команд. –
Не редактируйте свой вопрос, чтобы пометить его как разрешенный. Вместо этого отправьте ответ, и (по истечении таймера) отметьте его как принятый, чтобы этот вопрос больше не отображался как неразрешенный. – tripleee