main分析(2)

Hello world,hello blog!

Posted by 吴柚 on May 13, 2019

补遗

紧接上次的分析,把上次漏掉的两段代码补上。

//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>

程序中出现的几个函数

  1. Signal ()函数
  • 功能:设置某一信号的对应动作

  • 第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号

  • 第二个参数handler:描述了与信号关联的动作,sighandler_t类型的函数指针

  1. fopen(a1,”rb”)
  • fopen()文件顺利打开后,返回指向该流的文件指针,如果文件打开失败,则返回null

  • rb意味只读二进制 binary

  1. 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指向的位置。

  1. 函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。

返回值为long型

  1. void *memset(void *s, int ch, size_t n);

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

memset的作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

  1. size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

参数buffer用于接收数据的内存地址

size要读的每个数据项的字节数,单位是字节

count要读count个数据项,每个数据项

size个字节.stream输入流