我一直在阅读和研究汇编代码。代码如下
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部分没有返回指令。
我很乐意帮助你。感谢。
答案 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>
没有其他问题了。感谢。