0%

第四章 第一个程序

一个源程序从写出到执行的过程

  1. 编写汇编源程序(.txt)
  2. 对源程序编译(.obj)
  3. 对目标文件连接(.exe)
  4. 执行可执行文件程序

源程序

汇编源程序:用汇编语言写出的程序代码
汇编指令:告诉计算机如何处理数据的命令。

伪指令

不要求CPU执行具体操作,汇编时不产生机器码,仅仅给汇编程序提供相应的汇编信息(程序中段的信息、堆栈的大小、调用的数据库)

段定义伪指令SEGMENT和ENDS

一个完整的源程序可由3个段组成:堆栈段、数据段、代码段。其中堆栈段和数据段可以没有,但代码段是必须的。

SEGMENT:定义一个段开始(一个段必须有一个名称来标识)
ENDS:说明一个段的结束,和SEGMENT成对使用。

格式:

1
2
3
4
5
段名  SEGMENT
-
-
-
段名 ENDS

汇编结束伪指令END

格式: END [标号]
功能:表示源程序到此结束。
说明:一个源程序必须有且只能有一个END语句,一般放在源程序的最后一行。

ASSUME 段分配伪指令

格式: ASSUME 段寄存器:段名 [,段寄存器:段名,…]
功能:用于说明源程序中定义的段或组由哪个寄存器去寻址,即建立寄存器与段间的对应关系。

源程序中的“程序”

标号:代表某一存储单元地址的名字

字母:AZ,数字:09,特殊字符:?. @_ $

注意:数字不能作名称的第一个字符。圆点只能用作第一个字符,标号最长为31个字符。

汇编语言源程序的结构

一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,每个段都以SEGMENT开始,以ENDS结束,代码段包含程序要执行的指令;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所需的数据。

例题

计算2^3^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; 定义数据段,用于存放结果
DATA SEGMENT
result DW 0 ; 用字型(16位)存储结果(2^3=8)
DATA ENDS

; 定义代码段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA ; 关联段寄存器

start:
mov ax, DATA ; 初始化数据段寄存器DS
mov ds, ax

mov al, 2 ; AL = 2(初始值)
mul al ; AX = AL * AL = 2*2=4(第一次乘法)
mul al ; AX = AX * AL = 4*2=8(第二次乘法,得到2^3)

mov result, ax ; 将结果存入result变量

; 程序结束(返回DOS)
mov ah, 4ch
int 21h

CODE ENDS
END start ; 程序入口为start

语法错误和逻辑错误

语法错误:程序在编译时被编译器发现的错误
逻辑错误:源程序编译后运行时发生的错误

对目标文件进行连接

连接的作用:

  • 当源程序较大时,编译器会将源程序文件分成多个部分来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接在一起,生成一个可执行文件。
  • 程序中调用了某个库文件中的内容时,需要将这个库文件和该程序生成的目标文件连接在一起。
  • 一个源程序编译后,得到了存有机器码的目标文件,目标文件中有的内容不能直接生成可执行文件,必须通过连接程序将这些内容处理为最终可执行的信息。