| 
 | 
 
 
发表于 2019-10-9 22:45:06
|
显示全部楼层
 
 
 
- #include <stdio.h>
 
  
- int main(void)
 
 - {
 
 -         float a = 10.0f;
 
 -         printf("%f", a);
 
 -         return 0;
 
 - }
 
 
  复制代码 
-         .file        "test.c"
 
 -         .text
 
 -         .section        .rodata
 
 - .LC1:
 
 -         .string        "%f"
 
 -         .text
 
 -         .globl        main
 
 -         .type        main, @function
 
 - main:
 
 - .LFB0:
 
 -         .cfi_startproc
 
 -         leal        4(%esp), %ecx
 
 -         .cfi_def_cfa 1, 0
 
 -         andl        $-16, %esp
 
 -         pushl        -4(%ecx)
 
 -         pushl        %ebp
 
 -         .cfi_escape 0x10,0x5,0x2,0x75,0
 
 -         movl        %esp, %ebp
 
 -         pushl        %ebx
 
 -         pushl        %ecx
 
 -         .cfi_escape 0xf,0x3,0x75,0x78,0x6
 
 -         .cfi_escape 0x10,0x3,0x2,0x75,0x7c
 
 -         subl        $16, %esp
 
 -         call        __x86.get_pc_thunk.ax
 
 -         addl        $_GLOBAL_OFFSET_TABLE_, %eax
 
 -         flds        .LC0@GOTOFF(%eax)
 
 -         fstps        -12(%ebp)
 
 -         flds        -12(%ebp)
 
 -         subl        $4, %esp
 
 -         leal        -8(%esp), %esp
 
 -         fstpl        (%esp)
 
 -         leal        .LC1@GOTOFF(%eax), %edx
 
 -         pushl        %edx
 
 -         movl        %eax, %ebx
 
 -         call        printf@PLT
 
 -         addl        $16, %esp
 
 -         movl        $0, %eax
 
 -         leal        -8(%ebp), %esp
 
 -         popl        %ecx
 
 -         .cfi_restore 1
 
 -         .cfi_def_cfa 1, 0
 
 -         popl        %ebx
 
 -         .cfi_restore 3
 
 -         popl        %ebp
 
 -         .cfi_restore 5
 
 -         leal        -4(%ecx), %esp
 
 -         .cfi_def_cfa 4, 4
 
 -         ret
 
 -         .cfi_endproc
 
 - .LFE0:
 
 -         .size        main, .-main
 
 -         .section        .rodata
 
 -         .align 4
 
 - .LC0:
 
 -         .long        1092616192
 
 -         .section        .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
 
 -         .globl        __x86.get_pc_thunk.ax
 
 -         .hidden        __x86.get_pc_thunk.ax
 
 -         .type        __x86.get_pc_thunk.ax, @function
 
 - __x86.get_pc_thunk.ax:
 
 - .LFB1:
 
 -         .cfi_startproc
 
 -         movl        (%esp), %eax
 
 -         ret
 
 -         .cfi_endproc
 
 - .LFE1:
 
 -         .ident        "GCC: (GNU) 9.2.0"
 
 -         .section        .note.GNU-stack,"",@progbits
 
 
  复制代码 
 
参考这个程序,可以看到printf使用的是%f占位符,指明是float,但是实际传给printf的却是double 
 
这几条指令重点理解 
-         flds        .LC0@GOTOFF(%eax)
 
 -         fstps        -12(%ebp)
 
 -         flds        -12(%ebp)
 
 -         subl        $4, %esp
 
 -         leal        -8(%esp), %esp
 
 -         fstpl        (%esp)
 
 -         leal        .LC1@GOTOFF(%eax), %edx
 
 -         pushl        %edx
 
 -         movl        %eax, %ebx
 
 -         call        printf@PLT
 
 -         addl        $16, %esp
 
 
  复制代码 
 
知道了问题出在哪里就好办了 
把代码改成下面这样就可以了 
- # functest3.s - An example of using C style functions
 
  
-         .code32
 
 -         .section .data
 
 - output:
 
 -         .asciz "This area is %f\n"
 
  
-         .section .text
 
 -         .globl _start
 
 - _start:
 
 -         nop
 
 -         finit
 
 -         pushl        $10
 
 -         call        area
 
 -         addl        $4, %esp
 
 -         pushl        %eax
 
 -         flds        (%esp)
 
 -         leal        -8(%esp), %esp
 
 -         fstpl        (%esp)
 
 -         pushl        $output
 
 -         call        printf
 
 -         addl        $16, %esp
 
 -         movl        $120, %ebx
 
 -         movl        $1, %eax
 
 -         int        $0x80
 
  
-         .type area, @function
 
 - area:
 
 -         pushl        %ebp
 
 -         movl        %esp, %ebp
 
 -         subl        $4, %esp
 
 -         fldpi
 
 -         filds        8(%ebp)
 
 -         fmul        %st(0), %st(0)
 
 -         fmulp        %st(0), %st(1)
 
 -         fstps        -4(%ebp)
 
 -         movl        -4(%ebp), %eax
 
 -         movl        %ebp, %esp
 
 -         popl        %ebp
 
 -         ret
 
 
  复制代码 
- $ gcc -m32 -g -Wall -nostartfiles -o main main.s
 
 - $ ./main
 
 - This area is 314.159271
 
 - $ 
 
  复制代码 |   
 
 
 
 |