有些程序设计语言和编译器教材会以pascal语言的程序为例,这里写一个快速掌握简单应用的介绍。
1,安装 free pascal 编译器
ubuntu 22.04 直接通过 apt 源安装,此时的版本号为 3.2.2
1.1 安装
sudo apt install fp-compiler
1.2 简单测试
fpc -V
1.3 获得帮助信息
fpc -h
2,编译 pascal 源程序
源码文件 addInteger.pas 的内容如下:
program add_integer;
vara, b, c: integer;
beginwrite('integer a = ');readln(a);write('integer b = ');readln(b);c := a + b;writeln('c = a + b = ', c);
end.fpc addInteger.pas
./addInteger
编译:
fpc addInteger.pas
运行:
./addInteger
效果:
3,安装 free pascal 文档
sudo apt install fp-docs
会被安装在 /usr/share/doc/fp-docs/3.2.2/
4,官方 IDE
free pascal 官方同时设计了类似window中edit的 基于控制台的 IDE,安装如下:
sudo apt install fp-ide
打开ide:
$ fp
效果如图:
$ fp ./addInteger.pas
可以接受鼠标操作和快捷键
退出: Alt + x
5,编译输出汇编语言文件
使用选项 -a
$ fpc addInteger.pas -a
6,一个简单的源文件的汇编
源码 addTest.pas :
program add_integer;
vara, b, c: integer;
begina := 3;b := 4;c := a + b;writeln('c = a + b = ', c);
end.
fpc -a addTest.pas
汇编结果:
cat addTest.s
.file "addTest.pas"
# Begin asmlist al_procedures.section .text.n_main.balign 16,0x90
.globl PASCALMAIN.type PASCALMAIN,@function
PASCALMAIN:
.globl main.type main,@function
main:
.Lc1:pushq %rbp
.Lc3:
.Lc4:movq %rsp,%rbp
.Lc5:leaq -16(%rsp),%rspmovq %rbx,-8(%rbp)call fpc_initializeunitsmovw $3,U_$P$ADD_INTEGER_$$_Amovw $4,U_$P$ADD_INTEGER_$$_Bmovswl U_$P$ADD_INTEGER_$$_A,%edxmovswl U_$P$ADD_INTEGER_$$_B,%eaxleal (%edx,%eax),%eaxmovw %ax,U_$P$ADD_INTEGER_$$_Ccall fpc_get_outputmovq %rax,%rbxmovq $_$ADD_INTEGER$_Ld1,%rdxmovq %rbx,%rsimovl $0,%edicall fpc_write_text_shortstrcall fpc_iocheckmovswq U_$P$ADD_INTEGER_$$_C,%rdxmovq %rbx,%rsimovl $0,%edicall fpc_write_text_sintcall fpc_iocheckmovq %rbx,%rdicall fpc_writeln_endcall fpc_iocheckcall fpc_do_exitmovq -8(%rbp),%rbxmovq %rbp,%rsppopq %rbpret
.Lc2:
.Le0:.size main, .Le0 - main.section .text
# End asmlist al_procedures
# Begin asmlist al_globals.section .bss.balign 2.type U_$P$ADD_INTEGER_$$_A,@object.size U_$P$ADD_INTEGER_$$_A,2
U_$P$ADD_INTEGER_$$_A:.zero 2.section .bss.balign 2.type U_$P$ADD_INTEGER_$$_B,@object.size U_$P$ADD_INTEGER_$$_B,2
U_$P$ADD_INTEGER_$$_B:.zero 2.section .bss.balign 2.type U_$P$ADD_INTEGER_$$_C,@object.size U_$P$ADD_INTEGER_$$_C,2
U_$P$ADD_INTEGER_$$_C:.zero 2.section .data.n_INITFINAL.balign 8
.globl INITFINAL.type INITFINAL,@object
INITFINAL:.quad 1,0.quad INIT$_$SYSTEM.quad 0
.Le1:.size INITFINAL, .Le1 - INITFINAL.section .data.n_FPC_THREADVARTABLES.balign 8
.globl FPC_THREADVARTABLES.type FPC_THREADVARTABLES,@object
FPC_THREADVARTABLES:.long 1.quad THREADVARLIST_$SYSTEM$indirect
.Le2:.size FPC_THREADVARTABLES, .Le2 - FPC_THREADVARTABLES.section .data.n_FPC_RESOURCESTRINGTABLES.balign 8
.globl FPC_RESOURCESTRINGTABLES.type FPC_RESOURCESTRINGTABLES,@object
FPC_RESOURCESTRINGTABLES:.quad 0
.Le3:.size FPC_RESOURCESTRINGTABLES, .Le3 - FPC_RESOURCESTRINGTABLES.section .data.n_FPC_WIDEINITTABLES.balign 8
.globl FPC_WIDEINITTABLES.type FPC_WIDEINITTABLES,@object
FPC_WIDEINITTABLES:.quad 0
.Le4:.size FPC_WIDEINITTABLES, .Le4 - FPC_WIDEINITTABLES.section .data.n_FPC_RESSTRINITTABLES.balign 8
.globl FPC_RESSTRINITTABLES.type FPC_RESSTRINITTABLES,@object
FPC_RESSTRINITTABLES:.quad 0
.Le5:.size FPC_RESSTRINITTABLES, .Le5 - FPC_RESSTRINITTABLES.section .fpc.n_version.balign 16.type __fpc_ident,@object
__fpc_ident:.ascii "FPC 3.2.2+dfsg-9ubuntu1 [2022/04/11] for x86_64 - L".ascii "inux"
.Le6:.size __fpc_ident, .Le6 - __fpc_ident.section .data.n___stklen.balign 8
.globl __stklen.type __stklen,@object
__stklen:.quad 8388608
.Le7:.size __stklen, .Le7 - __stklen.section .data.n___heapsize.balign 8
.globl __heapsize.type __heapsize,@object
__heapsize:.quad 0
.Le8:.size __heapsize, .Le8 - __heapsize.section .data.n___fpc_valgrind.balign 8
.globl __fpc_valgrind.type __fpc_valgrind,@object
__fpc_valgrind:.byte 0
.Le9:.size __fpc_valgrind, .Le9 - __fpc_valgrind.section .data.n_FPC_RESLOCATION.balign 8
.globl FPC_RESLOCATION.type FPC_RESLOCATION,@object
FPC_RESLOCATION:.quad 0
.Le10:.size FPC_RESLOCATION, .Le10 - FPC_RESLOCATION
# End asmlist al_globals
# Begin asmlist al_typedconsts.section .rodata.n__$ADD_INTEGER$_Ld1.balign 8
.globl _$ADD_INTEGER$_Ld1
_$ADD_INTEGER$_Ld1:.ascii "\014c = a + b = \000"
.Le11:.size _$ADD_INTEGER$_Ld1, .Le11 - _$ADD_INTEGER$_Ld1
# End asmlist al_typedconsts
# Begin asmlist al_dwarf_frame.section .debug_frame
.Lc6:.long .Lc8-.Lc7
.Lc7:.long -1.byte 1.byte 0.uleb128 1.sleb128 -4.byte 16.byte 12.uleb128 7.uleb128 8.byte 5.uleb128 16.uleb128 2.balign 4,0
.Lc8:.long .Lc10-.Lc9
.Lc9:.quad .Lc6.quad .Lc1.quad .Lc2-.Lc1.byte 4.long .Lc3-.Lc1.byte 14.uleb128 16.byte 4.long .Lc4-.Lc3.byte 5.uleb128 6.uleb128 4.byte 4.long .Lc5-.Lc4.byte 13.uleb128 6.balign 4,0
.Lc10:
# End asmlist al_dwarf_frame
.section .note.GNU-stack,"",%progbits