DEV Community

钟智强
钟智强

Posted on

从 COBOL 到汇编:用个税计算器带你扒光 60 年老古董语言

你可能觉得 COBOL 是上世纪的产物,但事实是,今天全球 70% 的金融交易依然运行在 COBOL 上。本文将通过实现一个中国个人所得税计算器,展示 COBOL 的写法,并附上对应的汇编对照,让你看清楚这门“像英语”的语言如何落地到最底层的指令。


为了让大家更直观地理解 COBOL,我在这篇文章里不仅会系统讲解 COBOL 的四大 Division、数据类型、语句和内置函数,还会拿出相应的 汇编 (Assembly) 代码来做 对比。

你将会看到:

  • COBOL 的 MOVE / COMPUTE / DISPLAY,在底层汇编里就是 MOV、ADD、CMP 这些指令。
  • 数据定义里的 PIC 9(4) V99,在汇编里就对应一块固定大小的内存空间。
  • COBOL 的 EVALUATE 语句,其实就类似于汇编中的条件跳转和比较。

换句话说,这篇文章不是单纯地教 COBOL,而是用汇编来对照,帮你更深刻地理解这门经典语言背后的底层逻辑。

一、COBOL 程序的基本结构

COBOL 的层级逻辑十分严格,基本单位如下:

Division → Section → Paragraph → Sentence → Statement
Enter fullscreen mode Exit fullscreen mode

类比到现代编程语言:

  • Division ≈ 模块
  • Section ≈ 子模块
  • Paragraph ≈ 函数
  • Statement ≈ 语句

COBOL 的语义化极强,看起来像文档,但编译结果完全是底层机器码。


二、数据声明:Picture Clause

COBOL 使用 PIC(Picture Clause)描述数据的格式。例如:

01 COUNTER PIC S9(4) COMP-4.
Enter fullscreen mode Exit fullscreen mode

对应汇编:

mov eax, 1234
mov [COUNTER], eax
Enter fullscreen mode Exit fullscreen mode

在金融系统中,COMP-3(packed decimal)用得尤其多,因为它能保证十进制精度。


三、完整案例:中国个税计算器

下面分步骤给出 COBOL 程序和汇编对照。


1. IDENTIFICATION DIVISION

IDENTIFICATION DIVISION.
PROGRAM-ID. CHINESE-TAX-SYSTEM.
AUTHOR. LING-ER.
DATE-WRITTEN. 2025-07-14.
Enter fullscreen mode Exit fullscreen mode

汇编:

; 元信息,不编译为指令
; 程序名: CHINESE-TAX-SYSTEM
Enter fullscreen mode Exit fullscreen mode

2. ENVIRONMENT DIVISION

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370.
OBJECT-COMPUTER. IBM-370.
Enter fullscreen mode Exit fullscreen mode

汇编:

; 编译目标平台声明
Enter fullscreen mode Exit fullscreen mode

3. DATA DIVISION

01 INPUT-FIELDS.
   05 GROSS-INCOME     PIC 9(7)V99.
   05 SOCIAL-INSURANCE PIC 9(5)V99.
   05 HOUSING-FUND     PIC 9(5)V99.
   05 OTHER-DEDUCTIONS PIC 9(5)V99.
Enter fullscreen mode Exit fullscreen mode

汇编:

SECTION .data
GROSS_INCOME     dd 0
SOCIAL_INSURANCE dd 0
HOUSING_FUND     dd 0
OTHER_DEDUCTIONS dd 0
Enter fullscreen mode Exit fullscreen mode

4. PROCEDURE DIVISION

MAIN-LOGIC.
    DISPLAY "中国个人所得税计算器".
    PERFORM GET-USER-INPUT.
    PERFORM CALCULATE-TAX.
    PERFORM DISPLAY-RESULTS.
    STOP RUN.
Enter fullscreen mode Exit fullscreen mode

汇编:

call print_banner
call get_user_input
call calculate_tax
call display_results
mov eax, 1
int 0x80
Enter fullscreen mode Exit fullscreen mode

计算税额:

COMPUTE TOTAL-DEDUCTIONS = SOCIAL-INSURANCE + HOUSING-FUND
                         + OTHER-DEDUCTIONS + STANDARD-DEDUCTION.
COMPUTE TAXABLE-INCOME = GROSS-INCOME - TOTAL-DEDUCTIONS.
Enter fullscreen mode Exit fullscreen mode

汇编:

mov eax, [SOCIAL_INSURANCE]
add eax, [HOUSING_FUND]
add eax, [OTHER_DEDUCTIONS]
add eax, [STANDARD_DEDUCTION]
mov [TOTAL_DEDUCTIONS], eax

mov eax, [GROSS_INCOME]
sub eax, [TOTAL_DEDUCTIONS]
mov [TAXABLE_INCOME], eax
Enter fullscreen mode Exit fullscreen mode

5. 条件分支 (EVALUATE)

EVALUATE TRUE
   WHEN TAXABLE-INCOME <= BRACKET-1
        COMPUTE TAX-AMOUNT = TAXABLE-INCOME * RATE-1
   WHEN OTHER
        COMPUTE TAX-AMOUNT = ...
END-EVALUATE.
Enter fullscreen mode Exit fullscreen mode

汇编:

mov eax, [TAXABLE_INCOME]
cmp eax, [BRACKET_1]
jg  next_case

; case 1
mov ebx, [RATE_1]
imul eax, ebx
mov [TAX_AMOUNT], eax
jmp end_eval

next_case:
; case 2 ...
end_eval:
Enter fullscreen mode Exit fullscreen mode

四、总结

  • COBOL 的 MOVE 对应汇编的 mov
  • COMPUTE 对应 add/sub/imul
  • EVALUATE 对应 cmp + jmp
  • 金融系统选择 COBOL 的原因:语义清晰,编译稳定,执行结果高度可预测

五、作者评论

为什么 2025 年了我们还要关心 COBOL?因为大量金融与政府系统依旧运行在它之上。对于业务逻辑清晰、对精度要求极高的应用,COBOL 仍然是值得信赖的选择。

本文代码仅供学习和研究,请勿将其用于破坏或非法用途。


Top comments (0)