gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:38 35 4
gpt4 key购买 nike

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

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代表dest = dest - (src+carry flag)。所以我们可以将 0x804c048 指令替换为 %eax = $eax - ($0x1d08048d + carry flag)。

那么....那个时候,设置什么值作为carry flag值呢?在0x804c048行之前我没有找到任何进位标志设置指令。进位标志最初设置为0吗?

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

很高兴能为您提供帮助。谢谢。

最佳答案

哦........ @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 数据处的 hexcode。 “0x1d (address at 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>

没有更多问题。谢谢。

关于linux - 如何知道汇编代码中的当前进位标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29484772/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com