汇编语言程序实例

一、单个字符的键盘输入与显示输出

先认识一个简单的汇编语言程序。

例1 键盘输入一个字符并显示其后继字符。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
code segment ; 1

assume cs:code ; 2

start: mov ah,1 ; 3

int 21h ; 4

mov dl,al ; 5

add dl,1 ; 6

mov ah,2 ; 7

int 21h ; 8

mov ah,4ch ; 9

int 21h ; 10

code ends ; 11

end start ; 12

程序解析:

该程序只有 12 行,只有 1 个代码段,每一行就是一条汇编语言语句,现详细解释如下。

代码段的定义由第 1 行 CODE SEGMENT 和第 11 行 CODE ENDS 这一对说明语句说明。CODE 是段名,SEGMENT 和 ENDS 是关键字。

第 2 行:说明语句,指定 CODE 段与 CS 寄存器关联。

第 3 行:START:是一个标号,MOV AH,1 指令表示把 1 送 AH 寄存器,这是因为 DOS 系统功能的 1 号功能是键盘输入,所以要把功能号 1 送 AH。

第 4 行:INT 21H 指令即调用 DOS 系统功能,其 1 号功能被执行,程序等待键盘输入,从键盘输入一个字符后,程序才继续执行。注意,这个从键盘输入的字符到哪里去了呢?它被放到寄存器 AL 中,是该字符的 ASCII 码。如果是字符“A”,则 AL 中就为 41H。

第 5 行:把 AL 送 DL 寄存器。

第 6 行:DL 内容加 1。为后面的 2 号功能调用准备输出的字符。

第 7~8 行:调用 DOS 系统功能的 2 号功能,显示 DL 中的字符。

第 9~10 行:调用 DOS 系统功能的 4CH 号功能,4CH 号功能是程序结束并返回到操作系统。

第 12 行:说明语句,告诉汇编程序,汇编到此结束,程序的启动地址为标号为 START 的那条指令(第 3 行)。

请注意代码段中的指令,只有 3 种类型,包括 MOV 传送指令、ADD 加法指令和中断调用指令 INT 21H。

例如 MOV DL,AL 指令,MOV 是指令的操作码,DL 在左边,是目的操作数地址,AL 在右边,为源操作数(地址)。INT 21H 指令的意思是执行 DOS 系统功能调用。

程序运行时,只有代码段中的指令才会被 CPU 逐条执行,说明语句只是提供数据和程序运行的条件。

二、显示字符串

很多高级语言的学习也是从一个显示“HELLO,WORLD !”程序开始。

例 2 显示“HELLO,WORLD !”程序。

 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
26
27
Data segment           ; 1

string db 'hello,world!$'    ; 2 在数据段定义数据

data ends             ; 3

code segment           ; 4

assume cs:code,ds:data      ; 5

start: mov ax,data       ; 6

mov ds,ax        ; 7

mov dx,offset string  ; 8

mov ah,9         ; 9

int 21h         ; 10 利用功能调用显示信息

mov ah,4ch        ; 11

int 21h         ; 12

code ends             ; 13

end start            ; 14 汇编结束,程序起始点 start

程序解析:

程序只有 14 行,分为 2 个段。

第 1~3 行:设立了一个数据段,段名为 DATA,由 DATA SEGMENT 和 DATA ENDS 这两句说明,语句须成对出现。并在其中定义了一个字符串 STRING。

第 2 行:说明语句,STRING 是字符串的名称,DB 是定义字节说明,字符串内容 'HELLO,WORLD ! $' 须用单引号括起。其中 $ 是串的结束标志。分号后面的内容是注释,可不写。

第 4~13 行:设立了一个代码段,段名为 CODE。由 CODE SEGMENT 和 CODE ENDS 这两句成对说明。

第 5 行:说明语句,指定 CODE 段与 CS 寄存器关联,DATA 段与 DS 寄存器关联。

第 6 行:START:是一个标号,MOV AX,DATA 表示把 DATA 段的值传送给 AX 寄存器。

第 7 行:再把 AX 寄存器的值传给 DS 寄存器。

第 8 行:把字符串 STRING 的起始偏移地址传给 DX 寄存器。OFFSET STRING 是求 STRING 的偏移地址,如果没有 OFFSET 说明,那就是取 STRING 的值了。

第 9 行:AH 寄存器得到 9,为下一步调用 DOS 系统功能的 9 号功能作准备。

第 10 行:INT 21H 指令即调用 DOS 系统功能,9 号功能是屏幕显示字符串。

第 11~12 行:调用 DOS 系统功能,4CH 号功能是程序结束并返回到操作系统。

第 14 行:说明语句,告诉汇编程序,汇编到此结束,程序的启动地址为标号为 START 的那条指令(第 6 行)。

该程序运行的结果是在显示屏上显示 “hello,world!”。

请参阅

(完)

comments powered by Disqus