汇编文件大写.S后缀和小写.s后缀的区别

汇编文件大写.S后缀和小写.s后缀的区别

首先两者都是汇编源程序,
大写的.S文件只是多了一个预处理功能,所以写关于硬件的汇编使用大写.S 。
小写的.s文件,在后期阶段不会再进行预处理操作了,所以我们不能在其内写上预处理语句。

比如在u-boot源码的u-boot/u-boot-v2020.10/arch/riscv/cpu目录下对应的start.S文件大量使用预处理指令,如下所示:
在这里插入图片描述
其次我们可以在GCC编译器下使用gcc命令测试一下。gcc与g++分别是GNU的c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:

1、预处理,生成 .i 的文件[预处理器cpp]
2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]
4、连接目标代码, 生成可执行程序 [链接器ld]

编译器的核心任务是把C程序翻译成机器的汇编语言(assembly language)。汇编语言是人类可以阅读的编程语言,也是相当接近实际机器码的语言。由此导致每种 CPU 架构都有不同的汇编语言。
实际上,GCC 是一个适合多种 CPU 架构的编译器,不会把C程序语句直接翻译成目标机器的汇编语言,而是在输入语言和输出汇编语言之间,利用一个中间语言,称为 RegisterTransfer Language(简称 RTL,寄存器传输语言)。借助于这个抽象层,在任何背景下,编译器可以选择最经济的方式对给定的操作编码。而且,在交互文件中针对目标机器的抽象描述,为编译器重新定向到新架构提供了一个结构化的方式。但是,从 GCC 用户角度来看,我们可以忽略这个中间步骤。

通常情况下,GCC 把汇编语言输出存储到临时文件中,并且在汇编器执行完后立刻删除它们。但是可以使用-S选项让编译程序在生成汇编语言输出之后立刻停止

如果没有指定输出文件名,那么采用-S选项的 GCC 编译过程会为每个被编译的输入文件生成以.s作为后缀的汇编语言文件。如下例所示:

TieTouXiaoGe@tst-vps:~/demo$ gcc -S demo.c 
TieTouXiaoGe@tst-vps:~/demo$ ls
demo.c  demo.s
TieTouXiaoGe@tst-vps:~/demo$ cat demo.s
        .file   "demo.c"
        .text
        .section        .rodata
.LC0:
        .string "successful..."
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movl    $0, -4(%rbp)
        jmp     .L2
.L3:
        leaq    .LC0(%rip), %rdi
        call    puts@PLT
        addl    $1, -4(%rbp)
.L2:
        cmpl    $2, -4(%rbp)
        jle     .L3
        nop
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
        .section        .note.GNU-stack,"",@progbits
TieTouXiaoGe@tst-vps:~/demo$

可以在往后拓展一下,执行汇编链接步骤再执行可执行程序看看结果:

TieTouXiaoGe@tst-vps:~/demo$ as demo.s -o demo.o
TieTouXiaoGe@tst-vps:~/demo$ ls
demo.c  demo.o  demo.s
TieTouXiaoGe@tst-vps:~/demo$ gcc demo.o -o demo
TieTouXiaoGe@tst-vps:~/demo$ ls
demo  demo.c  demo.o  demo.s
TieTouXiaoGe@tst-vps:~/demo$ ./demo 
successful...
successful...
successful...
TieTouXiaoGe@tst-vps:~/demo$ 

谢谢。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁头小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值