探究机器码,深入研究C语言程序的机制
用C高级编程语言写的程序,都要经过编译链接成本机可执行的程序。这个可执行程序究竟是什么呢?在Linux上,我们可以用objdump命令很方便地查看一个可执行程序的机器码。我们从一个简单的示例开始,说一说怎么理解机器码。
一、一个简单的c代码,什么都不做: testc.c
1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 6 return 1; 7 }
这段代码异常简单,只是向系统返回一个值为1的量即可。
二、Makefile文件如下:
1 testc:testc.o 2 gcc -S testc.c -o testc.s 3 gcc testc.c -o testc 4 objdump -D testc > dumpTestc.txt 5 6 clean: 7 rm testc testc.s testc.o dumpTestc.txt
不要觉得这么简单的程序还需要Makefile文件,但是为了使用方便,还是使用更方便:
生成了:
可执行文件testc,
生成了目标文件testc.o,
生成了汇编文件testc.s
生成了机器码与汇编对应的文件dumpTestc.txt
还可以借助clean完成中间生成文件的清理工作
make
完成上边工作的一键处理化,最后,查看文件分别如下:
1 .file "testc.c" 2 .text 3 .globl main 4 .type main, @function 5 main: 6 .LFB0: 7 .cfi_startproc 8 pushq %rbp 9 .cfi_def_cfa_offset 16 10 .cfi_offset 6, -16 11 movq %rsp, %rbp 12 .cfi_def_cfa_register 6 13 movl %edi, -4(%rbp) 14 movq %rsi, -16(%rbp) 15 movl $1, %eax 16 popq %rbp 17 .cfi_def_cfa 7, 8 18 ret 19 .cfi_endproc 20 .LFE0: 21 .size main, .-main 22 .ident "GCC: (GNU) 9.2.0" 23 .section .note.GNU-stack,"",@progbits
再次查看机器码和汇编对应的代码:
1 testc: 文件格式 elf64-x86-64 2 3 4 Disassembly of section .interp: 5 6 00000000000002a8 <.interp>: 7 2a8: 2f (bad) 8 2a9: 6c insb (%dx),%es:(%rdi) 9 2aa: 69 62 36 34 2f 6c 64 imul $0x646c2f34,0x36(%rdx),%esp 10 2b1: 2d 6c 69 6e 75 sub $0x756e696c,%eax 11 2b6: 78 2d js 2e5 <_init-0xd1b> 12 2b8: 78 38 js 2f2 <_init-0xd0e> 13 2ba: 36 2d 36 34 2e 73 ss sub $0x732e3436,%eax 14 2c0: 6f outsl %ds:(%rsi),(%dx) 15 2c1: 2e 32 00 xor %cs:(%rax),%al 16 17 Disassembly of section .note.gnu.build-id: 18 19 00000000000002c4 <.note.gnu.build-id>: 20 2c4: 04 00 add $0x0,%al 21 2c6: 00 00 add %al,(%rax) 22 2c8: 14 00 adc $0x0,%al 23 2ca: 00 00 add %al,(%rax) 24 2cc: 03 00 add (%rax),%eax 25 2ce: 00 00 add %al,(%rax) 26 2d0: 47 rex.RXB 27 2d1: 4e 55 rex.WRX push %rbp 28 2d3: 00 34 8d 24 f6 a9 18 add %dh,0x18a9f624(,%rcx,4) 29 2da: 9b fwait 30 2db: 61 (bad) 31 2dc: 09 fe or %edi,%esi 32 2de: 36 3f ss (bad) 33 2e0: 8d (bad) 34 2e1: d1 71 dc shll -0x24(%rcx) 35 2e4: 9f lahf 36 2e5: 65 b4 80 gs mov $0x80,%ah 37 38 Disassembly of section .note.ABI-tag: 39 40 00000000000002e8 <.note.ABI-tag>: 41 2e8: 04 00 add $0x0,%al 42 2ea: 00 00 add %al,(%rax) 43 2ec: 10 00 adc %al,(%rax) 44 2ee: 00 00 add %al,(%rax) 45 2f0: 01 00 add %eax,(%rax) 46 2f2: 00 00 add %al,(%rax) 47 2f4: 47 rex.RXB 48 2f5: 4e 55 rex.WRX push %rbp 49 2f7: 00 00 add %al,(%rax) 50 2f9: 00 00 add %al,(%rax) 51 2fb: 00 03 add %al,(%rbx) 52 2fd: 00 00 add %al,(%rax) 53 2ff: 00 02 add %al,(%rdx) 54 301: 00 00 add %al,(%rax) 55 303: 00 00 add %al,(%rax) 56 305: 00 00 add %al,(%rax) 57 ... 58 59 Disassembly of section .gnu.hash: 60 61 0000000000000308 <.gnu.hash>: 62 308: 01 00 add %eax,(%rax) 63 30a: 00 00 add %al,(%rax) 64 30c: 01 00 add %eax,(%rax) 65 30e: 00 00 add %al,(%rax) 66 310: 01 00 add %eax,(%rax) 67 ... 68 69 Disassembly of section .dynsym: 70 71 0000000000000328 <.dynsym>: 72 ... 73 340: 38 00 cmp %al,(%rax) 74 342: 00 00 add %al,(%rax) 75 344: 20 00 and %al,(%rax) 76 ... 77 356: 00 00 add %al,(%rax) 78 358: 1a 00 sbb (%rax),%al 79 35a: 00 00 add %al,(%rax) 80 35c: 12 00 adc (%rax),%al 81 ... 82 36e: 00 00 add %al,(%rax) 83 370: 54 push %rsp 84 371: 00 00 add %al,(%rax) 85 373: 00 20 add %ah,(%rax) 86 ... 87 385: 00 00 add %al,(%rax) 88 387: 00 63 00 add %ah,0x0(%rbx) 89 38a: 00 00 add %al,(%rax) 90 38c: 20 00 and %al,(%rax) 91 ... 92 39e: 00 00 add %al,(%rax) 93 3a0: 0b 00 or (%rax),%eax 94 3a2: 00 00 add %al,(%rax) 95 3a4: 22 00 and (%rax),%al 96 ... 97 98 Disassembly of section .dynstr: 99 100 00000000000003b8 <.dynstr>: 101 3b8: 00 6c 69 62 add %ch,0x62(%rcx,%rbp,2) 102 3bc: 63 2e movslq (%rsi),%ebp 103 3be: 73 6f jae 42f <_init-0xbd1> 104 3c0: 2e 36 00 5f 5f cs add %bl,%ss:0x5f(%rdi) 105 3c5: 63 78 61 movslq 0x61(%rax),%edi 106 3c8: 5f pop %rdi 107 3c9: 66 69 6e 61 6c 69 imul $0x696c,0x61(%rsi),%bp 108 3cf: 7a 65 jp 436 <_init-0xbca> 109 3d1: 00 5f 5f add %bl,0x5f(%rdi) 110 3d4: 6c insb (%dx),%es:(%rdi) 111 3d5: 69 62 63 5f 73 74 61 imul $0x6174735f,0x63(%rdx),%esp 112 3dc: 72 74 jb 452 <_init-0xbae> 113 3de: 5f pop %rdi 114 3df: 6d insl (%dx),%es:(%rdi) 115 3e0: 61 (bad) 116 3e1: 69 6e 00 47 4c 49 42 imul $0x42494c47,0x0(%rsi),%ebp 117 3e8: 43 5f rex.XB pop %r15 118 3ea: 32 2e xor (%rsi),%ch 119 3ec: 32 2e xor (%rsi),%ch 120 3ee: 35 00 5f 49 54 xor $0x54495f00,%eax 121 3f3: 4d 5f rex.WRB pop %r15 122 3f5: 64 65 72 65 fs gs jb 45e <_init-0xba2> 123 3f9: 67 69 73 74 65 72 54 imul $0x4d547265,0x74(%ebx),%esi 124 400: 4d 125 401: 43 6c rex.XB insb (%dx),%es:(%rdi) 126 403: 6f outsl %ds:(%rsi),(%dx) 127 404: 6e outsb %ds:(%rsi),(%dx) 128 405: 65 54 gs push %rsp 129 407: 61 (bad) 130 408: 62 (bad) 131 409: 6c insb (%dx),%es:(%rdi) 132 40a: 65 00 5f 5f add %bl,%gs:0x5f(%rdi) 133 40e: 67 6d insl (%dx),%es:(%edi) 134 410: 6f outsl %ds:(%rsi),(%dx) 135 411: 6e outsb %ds:(%rsi),(%dx) 136 412: 5f pop %rdi 137 413: 73 74 jae 489 <_init-0xb77> 138 415: 61 (bad) 139 416: 72 74 jb 48c <_init-0xb74> 140 418: 5f pop %rdi 141 419: 5f pop %rdi 142 41a: 00 5f 49 add %bl,0x49(%rdi) 143 41d: 54 push %rsp 144 41e: 4d 5f rex.WRB pop %r15 145 420: 72 65 jb 487 <_init-0xb79> 146 422: 67 69 73 74 65 72 54 imul $0x4d547265,0x74(%ebx),%esi 147 429: 4d 148 42a: 43 6c rex.XB insb (%dx),%es:(%rdi) 149 42c: 6f outsl %ds:(%rsi),(%dx) 150 42d: 6e outsb %ds:(%rsi),(%dx) 151 42e: 65 54 gs push %rsp 152 430: 61 (bad) 153 431: 62 .byte 0x62 154 432: 6c insb (%dx),%es:(%rdi) 155 433: 65 gs 156 ... 157 158 Disassembly of section .gnu.version: 159 160 0000000000000436 <.gnu.version>: 161 436: 00 00 add %al,(%rax) 162 438: 00 00 add %al,(%rax) 163 43a: 02 00 add (%rax),%al 164 43c: 00 00 add %al,(%rax) 165 43e: 00 00 add %al,(%rax) 166 440: 02 00 add (%rax),%al 167 168 Disassembly of section .gnu.version_r: 169 170 0000000000000448 <.gnu.version_r>: 171 448: 01 00 add %eax,(%rax) 172 44a: 01 00 add %eax,(%rax) 173 44c: 01 00 add %eax,(%rax) 174 44e: 00 00 add %al,(%rax) 175 450: 10 00 adc %al,(%rax) 176 452: 00 00 add %al,(%rax) 177 454: 00 00 add %al,(%rax) 178 456: 00 00 add %al,(%rax) 179 458: 75 1a jne 474 <_init-0xb8c> 180 45a: 69 09 00 00 02 00 imul $0x20000,(%rcx),%ecx 181 460: 2c 00 sub $0x0,%al 182 462: 00 00 add %al,(%rax) 183 464: 00 00 add %al,(%rax) 184 ... 185 186 Disassembly of section .rela.dyn: 187 188 0000000000000468 <.rela.dyn>: 189 468: 28 3e sub %bh,(%rsi) 190 46a: 00 00 add %al,(%rax) 191 46c: 00 00 add %al,(%rax) 192 46e: 00 00 add %al,(%rax) 193 470: 08 00 or %al,(%rax) 194 472: 00 00 add %al,(%rax) 195 474: 00 00 add %al,(%rax) 196 476: 00 00 add %al,(%rax) 197 478: 10 11 adc %dl,(%rcx) 198 47a: 00 00 add %al,(%rax) 199 47c: 00 00 add %al,(%rax) 200 47e: 00 00 add %al,(%rax) 201 480: 30 3e xor %bh,(%rsi) 202 482: 00 00 add %al,(%rax) 203 484: 00 00 add %al,(%rax) 204 486: 00 00 add %al,(%rax) 205 488: 08 00 or %al,(%rax) 206 48a: 00 00 add %al,(%rax) 207 48c: 00 00 add %al,(%rax) 208 48e: 00 00 add %al,(%rax) 209 490: c0 10 00 rclb $0x0,(%rax) 210 493: 00 00 add %al,(%rax) 211 495: 00 00 add %al,(%rax) 212 497: 00 20 add %ah,(%rax) 213 499: 40 00 00 add %al,(%rax) 214 49c: 00 00 add %al,(%rax) 215 49e: 00 00 add %al,(%rax) 216 4a0: 08 00 or %al,(%rax) 217 4a2: 00 00 add %al,(%rax) 218 4a4: 00 00 add %al,(%rax) 219 4a6: 00 00 add %al,(%rax) 220 4a8: 20 40 00 and %al,0x0(%rax) 221 4ab: 00 00 add %al,(%rax) 222 4ad: 00 00 add %al,(%rax) 223 4af: 00 d8 add %bl,%al 224 4b1: 3f (bad) 225 4b2: 00 00 add %al,(%rax) 226 4b4: 00 00 add %al,(%rax) 227 4b6: 00 00 add %al,(%rax) 228 4b8: 06 (bad) 229 4b9: 00 00 add %al,(%rax) 230 4bb: 00 01 add %al,(%rcx) 231 ... 232 4c5: 00 00 add %al,(%rax) 233 4c7: 00 e0 add %ah,%al 234 4c9: 3f (bad) 235 4ca: 00 00 add %al,(%rax) 236 4cc: 00 00 add %al,(%rax) 237 4ce: 00 00 add %al,(%rax) 238 4d0: 06 (bad) 239 4d1: 00 00 add %al,(%rax) 240 4d3: 00 02 add %al,(%rdx) 241 ... 242 4dd: 00 00 add %al,(%rax) 243 4df: 00 e8 add %ch,%al 244 4e1: 3f (bad) 245 4e2: 00 00 add %al,(%rax) 246 4e4: 00 00 add %al,(%rax) 247 4e6: 00 00 add %al,(%rax) 248 4e8: 06 (bad) 249 4e9: 00 00 add %al,(%rax) 250 4eb: 00 03 add %al,(%rbx) 251 ... 252 4f5: 00 00 add %al,(%rax) 253 4f7: 00 f0 add %dh,%al 254 4f9: 3f (bad) 255 4fa: 00 00 add %al,(%rax) 256 4fc: 00 00 add %al,(%rax) 257 4fe: 00 00 add %al,(%rax) 258 500: 06 (bad) 259 501: 00 00 add %al,(%rax) 260 503: 00 04 00 add %al,(%rax,%rax,1) 261 ... 262 50e: 00 00 add %al,(%rax) 263 510: f8 clc 264 511: 3f (bad) 265 512: 00 00 add %al,(%rax) 266 514: 00 00 add %al,(%rax) 267 516: 00 00 add %al,(%rax) 268 518: 06 (bad) 269 519: 00 00 add %al,(%rax) 270 51b: 00 05 00 00 00 00 add %al,0x0(%rip) # 521 <_init-0xadf> 271 521: 00 00 add %al,(%rax) 272 523: 00 00 add %al,(%rax) 273 525: 00 00 add %al,(%rax) 274 ... 275 276 Disassembly of section .init: 277 278 0000000000001000 <_init>: 279 1000: f3 0f 1e fa endbr64 280 1004: 48 83 ec 08 sub $0x8,%rsp 281 1008: 48 8b 05 d9 2f 00 00 mov 0x2fd9(%rip),%rax # 3fe8 <__gmon_start__> 282 100f: 48 85 c0 test %rax,%rax 283 1012: 74 02 je 1016 <_init+0x16> 284 1014: ff d0 callq *%rax 285 1016: 48 83 c4 08 add $0x8,%rsp 286 101a: c3 retq 287 288 Disassembly of section .text: 289 290 0000000000001020 <_start>: 291 1020: f3 0f 1e fa endbr64 292 1024: 31 ed xor %ebp,%ebp 293 1026: 49 89 d1 mov %rdx,%r9 294 1029: 5e pop %rsi 295 102a: 48 89 e2 mov %rsp,%rdx 296 102d: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp 297 1031: 50 push %rax 298 1032: 54 push %rsp 299 1033: 4c 8d 05 66 01 00 00 lea 0x166(%rip),%r8 # 11a0 <__libc_csu_fini> 300 103a: 48 8d 0d ef 00 00 00 lea 0xef(%rip),%rcx # 1130 <__libc_csu_init> 301 1041: 48 8d 3d d1 00 00 00 lea 0xd1(%rip),%rdi # 1119 <main> 302 1048: ff 15 92 2f 00 00 callq *0x2f92(%rip) # 3fe0 <__libc_start_main@GLIBC_2.2.5> 303 104e: f4 hlt 304 104f: 90 nop 305 306 0000000000001050 <deregister_tm_clones>: 307 1050: 48 8d 3d d1 2f 00 00 lea 0x2fd1(%rip),%rdi # 4028 <__TMC_END__> 308 1057: 48 8d 05 ca 2f 00 00 lea 0x2fca(%rip),%rax # 4028 <__TMC_END__> 309 105e: 48 39 f8 cmp %rdi,%rax 310 1061: 74 15 je 1078 <deregister_tm_clones+0x28> 311 1063: 48 8b 05 6e 2f 00 00 mov 0x2f6e(%rip),%rax # 3fd8 <_ITM_deregisterTMCloneTable> 312 106a: 48 85 c0 test %rax,%rax 313 106d: 74 09 je 1078 <deregister_tm_clones+0x28> 314 106f: ff e0 jmpq *%rax 315 1071: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 316 1078: c3 retq 317 1079: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 318 319 0000000000001080 <register_tm_clones>: 320 1080: 48 8d 3d a1 2f 00 00 lea 0x2fa1(%rip),%rdi # 4028 <__TMC_END__> 321 1087: 48 8d 35 9a 2f 00 00 lea 0x2f9a(%rip),%rsi # 4028 <__TMC_END__> 322 108e: 48 29 fe sub %rdi,%rsi 323 1091: 48 89 f0 mov %rsi,%rax 324 1094: 48 c1 ee 3f shr $0x3f,%rsi 325 1098: 48 c1 f8 03 sar $0x3,%rax 326 109c: 48 01 c6 add %rax,%rsi 327 109f: 48 d1 fe sar %rsi 328 10a2: 74 14 je 10b8 <register_tm_clones+0x38> 329 10a4: 48 8b 05 45 2f 00 00 mov 0x2f45(%rip),%rax # 3ff0 <_ITM_registerTMCloneTable> 330 10ab: 48 85 c0 test %rax,%rax 331 10ae: 74 08 je 10b8 <register_tm_clones+0x38> 332 10b0: ff e0 jmpq *%rax 333 10b2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 334 10b8: c3 retq 335 10b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 336 337 00000000000010c0 <__do_global_dtors_aux>: 338 10c0: f3 0f 1e fa endbr64 339 10c4: 80 3d 5d 2f 00 00 00 cmpb $0x0,0x2f5d(%rip) # 4028 <__TMC_END__> 340 10cb: 75 33 jne 1100 <__do_global_dtors_aux+0x40> 341 10cd: 55 push %rbp 342 10ce: 48 83 3d 22 2f 00 00 cmpq $0x0,0x2f22(%rip) # 3ff8 <__cxa_finalize@GLIBC_2.2.5> 343 10d5: 00 344 10d6: 48 89 e5 mov %rsp,%rbp 345 10d9: 74 0d je 10e8 <__do_global_dtors_aux+0x28> 346 10db: 48 8b 3d 3e 2f 00 00 mov 0x2f3e(%rip),%rdi # 4020 <__dso_handle> 347 10e2: ff 15 10 2f 00 00 callq *0x2f10(%rip) # 3ff8 <__cxa_finalize@GLIBC_2.2.5> 348 10e8: e8 63 ff ff ff callq 1050 <deregister_tm_clones> 349 10ed: c6 05 34 2f 00 00 01 movb $0x1,0x2f34(%rip) # 4028 <__TMC_END__> 350 10f4: 5d pop %rbp 351 10f5: c3 retq 352 10f6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 353 10fd: 00 00 00 354 1100: c3 retq 355 1101: 66 66 2e 0f 1f 84 00 data16 nopw %cs:0x0(%rax,%rax,1) 356 1108: 00 00 00 00 357 110c: 0f 1f 40 00 nopl 0x0(%rax) 358 359 0000000000001110 <frame_dummy>: 360 1110: f3 0f 1e fa endbr64 361 1114: e9 67 ff ff ff jmpq 1080 <register_tm_clones> 362 363 0000000000001119 <main>: 364 1119: 55 push %rbp 365 111a: 48 89 e5 mov %rsp,%rbp 366 111d: 89 7d fc mov %edi,-0x4(%rbp) 367 1120: 48 89 75 f0 mov %rsi,-0x10(%rbp) 368 1124: b8 01 00 00 00 mov $0x1,%eax 369 1129: 5d pop %rbp 370 112a: c3 retq 371 112b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 372 373 0000000000001130 <__libc_csu_init>: 374 1130: f3 0f 1e fa endbr64 375 1134: 41 57 push %r15 376 1136: 4c 8d 3d eb 2c 00 00 lea 0x2ceb(%rip),%r15 # 3e28 <__frame_dummy_init_array_entry> 377 113d: 41 56 push %r14 378 113f: 49 89 d6 mov %rdx,%r14 379 1142: 41 55 push %r13 380 1144: 49 89 f5 mov %rsi,%r13 381 1147: 41 54 push %r12 382 1149: 41 89 fc mov %edi,%r12d 383 114c: 55 push %rbp 384 114d: 48 8d 2d dc 2c 00 00 lea 0x2cdc(%rip),%rbp # 3e30 <__init_array_end> 385 1154: 53 push %rbx 386 1155: 4c 29 fd sub %r15,%rbp 387 1158: 48 83 ec 08 sub $0x8,%rsp 388 115c: e8 9f fe ff ff callq 1000 <_init> 389 1161: 48 c1 fd 03 sar $0x3,%rbp 390 1165: 74 1f je 1186 <__libc_csu_init+0x56> 391 1167: 31 db xor %ebx,%ebx 392 1169: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 393 1170: 4c 89 f2 mov %r14,%rdx 394 1173: 4c 89 ee mov %r13,%rsi 395 1176: 44 89 e7 mov %r12d,%edi 396 1179: 41 ff 14 df callq *(%r15,%rbx,8) 397 117d: 48 83 c3 01 add $0x1,%rbx 398 1181: 48 39 dd cmp %rbx,%rbp 399 1184: 75 ea jne 1170 <__libc_csu_init+0x40> 400 1186: 48 83 c4 08 add $0x8,%rsp 401 118a: 5b pop %rbx 402 118b: 5d pop %rbp 403 118c: 41 5c pop %r12 404 118e: 41 5d pop %r13 405 1190: 41 5e pop %r14 406 1192: 41 5f pop %r15 407 1194: c3 retq 408 1195: 66 66 2e 0f 1f 84 00 data16 nopw %cs:0x0(%rax,%rax,1) 409 119c: 00 00 00 00 410 411 00000000000011a0 <__libc_csu_fini>: 412 11a0: f3 0f 1e fa endbr64 413 11a4: c3 retq 414 415 Disassembly of section .fini: 416 417 00000000000011a8 <_fini>: 418 11a8: f3 0f 1e fa endbr64 419 11ac: 48 83 ec 08 sub $0x8,%rsp 420 11b0: 48 83 c4 08 add $0x8,%rsp 421 11b4: c3 retq 422 423 Disassembly of section .rodata: 424 425 0000000000002000 <_IO_stdin_used>: 426 2000: 01 00 add %eax,(%rax) 427 2002: 02 00 add (%rax),%al 428 429 Disassembly of section .eh_frame_hdr: 430 431 0000000000002004 <__GNU_EH_FRAME_HDR>: 432 2004: 01 1b add %ebx,(%rbx) 433 2006: 03 3b add (%rbx),%edi 434 2008: 28 00 sub %al,(%rax) 435 200a: 00 00 add %al,(%rax) 436 200c: 04 00 add $0x0,%al 437 200e: 00 00 add %al,(%rax) 438 2010: 1c f0 sbb $0xf0,%al 439 2012: ff (bad) 440 2013: ff 44 00 00 incl 0x0(%rax,%rax,1) 441 2017: 00 15 f1 ff ff 5c add %dl,0x5cfffff1(%rip) # 5d00200e <_end+0x5cffdfde> 442 201d: 00 00 add %al,(%rax) 443 201f: 00 2c f1 add %ch,(%rcx,%rsi,8) 444 2022: ff (bad) 445 2023: ff (bad) 446 2024: 7c 00 jl 2026 <__GNU_EH_FRAME_HDR+0x22> 447 2026: 00 00 add %al,(%rax) 448 2028: 9c pushfq 449 2029: f1 icebp 450 202a: ff (bad) 451 202b: ff c4 inc %esp 452 202d: 00 00 add %al,(%rax) 453 ... 454 455 Disassembly of section .eh_frame: 456 457 0000000000002030 <__FRAME_END__-0xac>: 458 2030: 14 00 adc $0x0,%al 459 2032: 00 00 add %al,(%rax) 460 2034: 00 00 add %al,(%rax) 461 2036: 00 00 add %al,(%rax) 462 2038: 01 7a 52 add %edi,0x52(%rdx) 463 203b: 00 01 add %al,(%rcx) 464 203d: 78 10 js 204f <__GNU_EH_FRAME_HDR+0x4b> 465 203f: 01 1b add %ebx,(%rbx) 466 2041: 0c 07 or $0x7,%al 467 2043: 08 90 01 00 00 14 or %dl,0x14000001(%rax) 468 2049: 00 00 add %al,(%rax) 469 204b: 00 1c 00 add %bl,(%rax,%rax,1) 470 204e: 00 00 add %al,(%rax) 471 2050: d0 ef shr %bh 472 2052: ff (bad) 473 2053: ff 2f ljmp *(%rdi) 474 2055: 00 00 add %al,(%rax) 475 2057: 00 00 add %al,(%rax) 476 2059: 44 07 rex.R (bad) 477 205b: 10 00 adc %al,(%rax) 478 205d: 00 00 add %al,(%rax) 479 205f: 00 1c 00 add %bl,(%rax,%rax,1) 480 2062: 00 00 add %al,(%rax) 481 2064: 34 00 xor $0x0,%al 482 2066: 00 00 add %al,(%rax) 483 2068: b1 f0 mov $0xf0,%cl 484 206a: ff (bad) 485 206b: ff 12 callq *(%rdx) 486 206d: 00 00 add %al,(%rax) 487 206f: 00 00 add %al,(%rax) 488 2071: 41 0e rex.B (bad) 489 2073: 10 86 02 43 0d 06 adc %al,0x60d4302(%rsi) 490 2079: 4d 0c 07 rex.WRB or $0x7,%al 491 207c: 08 00 or %al,(%rax) 492 207e: 00 00 add %al,(%rax) 493 2080: 44 00 00 add %r8b,(%rax) 494 2083: 00 54 00 00 add %dl,0x0(%rax,%rax,1) 495 2087: 00 a8 f0 ff ff 65 add %ch,0x65fffff0(%rax) 496 208d: 00 00 add %al,(%rax) 497 208f: 00 00 add %al,(%rax) 498 2091: 46 0e rex.RX (bad) 499 2093: 10 8f 02 49 0e 18 adc %cl,0x180e4902(%rdi) 500 2099: 8e 03 mov (%rbx),%es 501 209b: 45 0e rex.RB (bad) 502 209d: 20 8d 04 45 0e 28 and %cl,0x280e4504(%rbp) 503 20a3: 8c 05 44 0e 30 86 mov %es,-0x79cff1bc(%rip) # ffffffff86302eed <_end+0xffffffff862feebd> 504 20a9: 06 (bad) 505 20aa: 48 0e rex.W (bad) 506 20ac: 38 83 07 47 0e 40 cmp %al,0x400e4707(%rbx) 507 20b2: 6e outsb %ds:(%rsi),(%dx) 508 20b3: 0e (bad) 509 20b4: 38 41 0e cmp %al,0xe(%rcx) 510 20b7: 30 41 0e xor %al,0xe(%rcx) 511 20ba: 28 42 0e sub %al,0xe(%rdx) 512 20bd: 20 42 0e and %al,0xe(%rdx) 513 20c0: 18 42 0e sbb %al,0xe(%rdx) 514 20c3: 10 42 0e adc %al,0xe(%rdx) 515 20c6: 08 00 or %al,(%rax) 516 20c8: 10 00 adc %al,(%rax) 517 20ca: 00 00 add %al,(%rax) 518 20cc: 9c pushfq 519 20cd: 00 00 add %al,(%rax) 520 20cf: 00 d0 add %dl,%al 521 20d1: f0 ff lock (bad) 522 20d3: ff 05 00 00 00 00 incl 0x0(%rip) # 20d9 <__GNU_EH_FRAME_HDR+0xd5> 523 20d9: 00 00 add %al,(%rax) 524 ... 525 526 00000000000020dc <__FRAME_END__>: 527 20dc: 00 00 add %al,(%rax) 528 ... 529 530 Disassembly of section .init_array: 531 532 0000000000003e28 <__frame_dummy_init_array_entry>: 533 3e28: 10 11 adc %dl,(%rcx) 534 3e2a: 00 00 add %al,(%rax) 535 3e2c: 00 00 add %al,(%rax) 536 ... 537 538 Disassembly of section .fini_array: 539 540 0000000000003e30 <__do_global_dtors_aux_fini_array_entry>: 541 3e30: c0 10 00 rclb $0x0,(%rax) 542 3e33: 00 00 add %al,(%rax) 543 3e35: 00 00 add %al,(%rax) 544 ... 545 546 Disassembly of section .dynamic: 547 548 0000000000003e38 <_DYNAMIC>: 549 3e38: 01 00 add %eax,(%rax) 550 3e3a: 00 00 add %al,(%rax) 551 3e3c: 00 00 add %al,(%rax) 552 3e3e: 00 00 add %al,(%rax) 553 3e40: 01 00 add %eax,(%rax) 554 3e42: 00 00 add %al,(%rax) 555 3e44: 00 00 add %al,(%rax) 556 3e46: 00 00 add %al,(%rax) 557 3e48: 0c 00 or $0x0,%al 558 3e4a: 00 00 add %al,(%rax) 559 3e4c: 00 00 add %al,(%rax) 560 3e4e: 00 00 add %al,(%rax) 561 3e50: 00 10 add %dl,(%rax) 562 3e52: 00 00 add %al,(%rax) 563 3e54: 00 00 add %al,(%rax) 564 3e56: 00 00 add %al,(%rax) 565 3e58: 0d 00 00 00 00 or $0x0,%eax 566 3e5d: 00 00 add %al,(%rax) 567 3e5f: 00 a8 11 00 00 00 add %ch,0x11(%rax) 568 3e65: 00 00 add %al,(%rax) 569 3e67: 00 19 add %bl,(%rcx) 570 3e69: 00 00 add %al,(%rax) 571 3e6b: 00 00 add %al,(%rax) 572 3e6d: 00 00 add %al,(%rax) 573 3e6f: 00 28 add %ch,(%rax) 574 3e71: 3e 00 00 add %al,%ds:(%rax) 575 3e74: 00 00 add %al,(%rax) 576 3e76: 00 00 add %al,(%rax) 577 3e78: 1b 00 sbb (%rax),%eax 578 3e7a: 00 00 add %al,(%rax) 579 3e7c: 00 00 add %al,(%rax) 580 3e7e: 00 00 add %al,(%rax) 581 3e80: 08 00 or %al,(%rax) 582 3e82: 00 00 add %al,(%rax) 583 3e84: 00 00 add %al,(%rax) 584 3e86: 00 00 add %al,(%rax) 585 3e88: 1a 00 sbb (%rax),%al 586 3e8a: 00 00 add %al,(%rax) 587 3e8c: 00 00 add %al,(%rax) 588 3e8e: 00 00 add %al,(%rax) 589 3e90: 30 3e xor %bh,(%rsi) 590 3e92: 00 00 add %al,(%rax) 591 3e94: 00 00 add %al,(%rax) 592 3e96: 00 00 add %al,(%rax) 593 3e98: 1c 00 sbb $0x0,%al 594 3e9a: 00 00 add %al,(%rax) 595 3e9c: 00 00 add %al,(%rax) 596 3e9e: 00 00 add %al,(%rax) 597 3ea0: 08 00 or %al,(%rax) 598 3ea2: 00 00 add %al,(%rax) 599 3ea4: 00 00 add %al,(%rax) 600 3ea6: 00 00 add %al,(%rax) 601 3ea8: f5 cmc 602 3ea9: fe (bad) 603 3eaa: ff 6f 00 ljmp *0x0(%rdi) 604 3ead: 00 00 add %al,(%rax) 605 3eaf: 00 08 add %cl,(%rax) 606 3eb1: 03 00 add (%rax),%eax 607 3eb3: 00 00 add %al,(%rax) 608 3eb5: 00 00 add %al,(%rax) 609 3eb7: 00 05 00 00 00 00 add %al,0x0(%rip) # 3ebd <_DYNAMIC+0x85> 610 3ebd: 00 00 add %al,(%rax) 611 3ebf: 00 b8 03 00 00 00 add %bh,0x3(%rax) 612 3ec5: 00 00 add %al,(%rax) 613 3ec7: 00 06 add %al,(%rsi) 614 3ec9: 00 00 add %al,(%rax) 615 3ecb: 00 00 add %al,(%rax) 616 3ecd: 00 00 add %al,(%rax) 617 3ecf: 00 28 add %ch,(%rax) 618 3ed1: 03 00 add (%rax),%eax 619 3ed3: 00 00 add %al,(%rax) 620 3ed5: 00 00 add %al,(%rax) 621 3ed7: 00 0a add %cl,(%rdx) 622 3ed9: 00 00 add %al,(%rax) 623 3edb: 00 00 add %al,(%rax) 624 3edd: 00 00 add %al,(%rax) 625 3edf: 00 7d 00 add %bh,0x0(%rbp) 626 3ee2: 00 00 add %al,(%rax) 627 3ee4: 00 00 add %al,(%rax) 628 3ee6: 00 00 add %al,(%rax) 629 3ee8: 0b 00 or (%rax),%eax 630 3eea: 00 00 add %al,(%rax) 631 3eec: 00 00 add %al,(%rax) 632 3eee: 00 00 add %al,(%rax) 633 3ef0: 18 00 sbb %al,(%rax) 634 3ef2: 00 00 add %al,(%rax) 635 3ef4: 00 00 add %al,(%rax) 636 3ef6: 00 00 add %al,(%rax) 637 3ef8: 15 00 00 00 00 adc $0x0,%eax 638 ... 639 3f05: 00 00 add %al,(%rax) 640 3f07: 00 07 add %al,(%rdi) 641 3f09: 00 00 add %al,(%rax) 642 3f0b: 00 00 add %al,(%rax) 643 3f0d: 00 00 add %al,(%rax) 644 3f0f: 00 68 04 add %ch,0x4(%rax) 645 3f12: 00 00 add %al,(%rax) 646 3f14: 00 00 add %al,(%rax) 647 3f16: 00 00 add %al,(%rax) 648 3f18: 08 00 or %al,(%rax) 649 3f1a: 00 00 add %al,(%rax) 650 3f1c: 00 00 add %al,(%rax) 651 3f1e: 00 00 add %al,(%rax) 652 3f20: c0 00 00 rolb $0x0,(%rax) 653 3f23: 00 00 add %al,(%rax) 654 3f25: 00 00 add %al,(%rax) 655 3f27: 00 09 add %cl,(%rcx) 656 3f29: 00 00 add %al,(%rax) 657 3f2b: 00 00 add %al,(%rax) 658 3f2d: 00 00 add %al,(%rax) 659 3f2f: 00 18 add %bl,(%rax) 660 3f31: 00 00 add %al,(%rax) 661 3f33: 00 00 add %al,(%rax) 662 3f35: 00 00 add %al,(%rax) 663 3f37: 00 fb add %bh,%bl 664 3f39: ff (bad) 665 3f3a: ff 6f 00 ljmp *0x0(%rdi) 666 3f3d: 00 00 add %al,(%rax) 667 3f3f: 00 00 add %al,(%rax) 668 3f41: 00 00 add %al,(%rax) 669 3f43: 08 00 or %al,(%rax) 670 3f45: 00 00 add %al,(%rax) 671 3f47: 00 fe add %bh,%dh 672 3f49: ff (bad) 673 3f4a: ff 6f 00 ljmp *0x0(%rdi) 674 3f4d: 00 00 add %al,(%rax) 675 3f4f: 00 48 04 add %cl,0x4(%rax) 676 3f52: 00 00 add %al,(%rax) 677 3f54: 00 00 add %al,(%rax) 678 3f56: 00 00 add %al,(%rax) 679 3f58: ff (bad) 680 3f59: ff (bad) 681 3f5a: ff 6f 00 ljmp *0x0(%rdi) 682 3f5d: 00 00 add %al,(%rax) 683 3f5f: 00 01 add %al,(%rcx) 684 3f61: 00 00 add %al,(%rax) 685 3f63: 00 00 add %al,(%rax) 686 3f65: 00 00 add %al,(%rax) 687 3f67: 00 f0 add %dh,%al 688 3f69: ff (bad) 689 3f6a: ff 6f 00 ljmp *0x0(%rdi) 690 3f6d: 00 00 add %al,(%rax) 691 3f6f: 00 36 add %dh,(%rsi) 692 3f71: 04 00 add $0x0,%al 693 3f73: 00 00 add %al,(%rax) 694 3f75: 00 00 add %al,(%rax) 695 3f77: 00 f9 add %bh,%cl 696 3f79: ff (bad) 697 3f7a: ff 6f 00 ljmp *0x0(%rdi) 698 3f7d: 00 00 add %al,(%rax) 699 3f7f: 00 03 add %al,(%rbx) 700 ... 701 702 Disassembly of section .got: 703 704 0000000000003fd8 <.got>: 705 ... 706 707 Disassembly of section .got.plt: 708 709 0000000000004000 <_GLOBAL_OFFSET_TABLE_>: 710 4000: 38 3e cmp %bh,(%rsi) 711 ... 712 713 Disassembly of section .data: 714 715 0000000000004018 <__data_start>: 716 ... 717 718 0000000000004020 <__dso_handle>: 719 4020: 20 40 00 and %al,0x0(%rax) 720 4023: 00 00 add %al,(%rax) 721 4025: 00 00 add %al,(%rax) 722 ... 723 724 Disassembly of section .bss: 725 726 0000000000004028 <__bss_start>: 727 ... 728 729 Disassembly of section .comment: 730 731 0000000000000000 <.comment>: 732 0: 47 rex.RXB 733 1: 43 rex.XB 734 2: 43 3a 20 rex.XB cmp (%r8),%spl 735 5: 28 47 4e sub %al,0x4e(%rdi) 736 8: 55 push %rbp 737 9: 29 20 sub %esp,(%rax) 738 b: 39 2e cmp %ebp,(%rsi) 739 d: 32 2e xor (%rsi),%ch 740 f: 30 00 xor %al,(%rax)
代码看着近750行,但是实际有用的行数并不多。
1 0000000000001119 <main>: 2 1119: 55 push %rbp 3 111a: 48 89 e5 mov %rsp,%rbp 4 111d: 89 7d fc mov %edi,-0x4(%rbp) 5 1120: 48 89 75 f0 mov %rsi,-0x10(%rbp) 6 1124: b8 01 00 00 00 mov $0x1,%eax 7 1129: 5d pop %rbp 8 112a: c3 retq 9 112b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
只有大约这10行才是实现了返回值为1的情况,其他都是类似的。
其实还要说下字节序的问题,大端模式还是小端模式。
参考文档:https://www.cnblogs.com/guocai/archive/2012/10/18/2730048.html
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。