- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在阅读和研究汇编代码。代码如下
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/
有什么方法可以获取 Python 中移位操作移出的位,例如 x86 汇编中的进位标志? 我搜索了 python 手册和互联网,但似乎找不到任何有用的东西。 我需要它来检查整数是奇数 (CF=1) 还是
众所周知,CF表示无符号进位,OF表示有符号溢出。那么,汇编程序如何区分无符号和有符号数据,因为它只是一个位序列? (通过类型信息的附加内存存储,或通过位置信息或其他?)这两个标志可以互换使用吗? 最
我有一个 df ,如下所示: | id | qty | item | +-----+------+------+ | 001 | 700 | CB04 | | 002 | 500 | NaN
我是一名优秀的程序员,十分优秀!