有些程序设计语言和编译器教材会以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;
var
a, b, c: integer;
begin
write('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;
var
a, b, c: integer;
begin
a := 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),%rsp
movq %rbx,-8(%rbp)
call fpc_initializeunits
movw $3,U_$P$ADD_INTEGER_$$_A
movw $4,U_$P$ADD_INTEGER_$$_B
movswl U_$P$ADD_INTEGER_$$_A,%edx
movswl U_$P$ADD_INTEGER_$$_B,%eax
leal (%edx,%eax),%eax
movw %ax,U_$P$ADD_INTEGER_$$_C
call fpc_get_output
movq %rax,%rbx
movq $_$ADD_INTEGER$_Ld1,%rdx
movq %rbx,%rsi
movl $0,%edi
call fpc_write_text_shortstr
call fpc_iocheck
movswq U_$P$ADD_INTEGER_$$_C,%rdx
movq %rbx,%rsi
movl $0,%edi
call fpc_write_text_sint
call fpc_iocheck
movq %rbx,%rdi
call fpc_writeln_end
call fpc_iocheck
call fpc_do_exit
movq -8(%rbp),%rbx
movq %rbp,%rsp
popq %rbp
ret
.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