补遗
紧接上次的分析,把上次漏掉的两段代码补上。
//edi==2 继续
bdc: 48 8d 35 dd ff ff ff lea -0x23(%rip),%rsi # bc0 <__cxa_finalize@plt+0x120>
be3: bf 02 00 00 00 mov $0x2,%edi
be8: e8 63 fe ff ff callq a50 <signal@plt>
bed: 48 8b 7b 08 mov 0x8(%rbx),%rdi
bf1: e8 ea 00 00 00 callq ce0 <__cxa_finalize@plt+0x240>
bf6: 48 89 c3 mov %rax,%rbx
bf9: 4c 8d 35 14 14 20 00 lea 0x201414(%rip),%r14 # 202014 <__cxa_finalize@plt+0x201574>
c00: 41 c7 06 01 00 00 00 movl $0x1,(%r14)
c07: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
c0e: 00 00
c10: 48 89 df mov %rbx,%rdi
c13: e8 78 02 00 00 callq e90 <__cxa_finalize@plt+0x3f0>
c18: 85 c0 test %eax,%eax
c1a: 75 08 jne c24 <__cxa_finalize@plt+0x184>
c1c: 41 83 3e 00 cmpl $0x0,(%r14)
c20: 75 ee jne c10 <__cxa_finalize@plt+0x170>
c22: eb 11 jmp c35 <__cxa_finalize@plt+0x195>
c24: 83 f8 02 cmp $0x2,%eax
c27: 75 0c jne c35 <__cxa_finalize@plt+0x195>
c29: 48 8d 3d 50 08 00 00 lea 0x850(%rip),%rdi # 1480 <__cxa_finalize@plt+0x9e0>
c30: e8 e3 fd ff ff callq a18 <puts@plt>
c35: 48 89 df mov %rbx,%rdi
c38: e8 a3 01 00 00 callq de0 <__cxa_finalize@plt+0x340>
c3d: 31 c0 xor %eax,%eax
c3f: 48 83 c4 08 add $0x8,%rsp
c43: 5b pop %rbx
c44: 41 5e pop %r14
c46: c3 retq
ce0处的代码如下:
ce0: 41 57 push %r15
ce2: 41 56 push %r14
ce4: 53 push %rbx
ce5: 48 8d 35 fc 0a 00 00 lea 0xafc(%rip),%rsi # 17e8 <__cxa_finalize@plt+0xd48>
cec: e8 9f fd ff ff callq a90 <fopen@plt>
cf1: 48 89 c3 mov %rax,%rbx
cf4: 48 85 db test %rbx,%rbx
cf7: 0f 84 cd 00 00 00 je dca <__cxa_finalize@plt+0x32a>
程序中出现的几个函数
- Signal ()函数
-
功能:设置某一信号的对应动作
-
第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号
-
第二个参数handler:描述了与信号关联的动作,sighandler_t类型的函数指针
- fopen(a1,”rb”)
-
fopen()文件顺利打开后,返回指向该流的文件指针,如果文件打开失败,则返回null
-
rb意味只读二进制 binary
- fseek
-
int fseek(FILE *stream, long offset, int fromwhere)
-
重定位流(数据流/文件)上的文件内部位置指针
fseek(v1, 0LL, 2)
以文件尾为基准函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
- 函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
返回值为long型
- void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset的作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
- size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
参数buffer用于接收数据的内存地址
size要读的每个数据项的字节数,单位是字节
count要读count个数据项,每个数据项
size个字节.stream输入流