一、汇编语言程序格式及开发过程
汇编语言——用指令的助记符、符号地址、标号等符号书写程序的语言。
源程序—— 用汇编语言编写的程序。
汇编——把源程序翻译成机器语言程序的过程。
汇编程序——完成汇编任务的程序。
1、汇编语言语句
三种基本语句:
指令语句(指令性语句) : 在汇编时产生一个目标代码。
伪指令语句(指示性语句): 无目标代码,为汇编程序服务。
宏指令语句
二、汇编语言格式
1)简化格式
简化格式(.EXE)
例:计算M-N+P
.MODEL SMALL
.STACK 256
.DATA
M DB 30H
N DB 20H
P DB 40H
.CODE
.STARTUP
MOV AL,M
SUB AL,N
ADD AL,P
.EXIT 0
END
2)完整格式1 (.EXE)
例:显示10行HELLO
DATA SEGMENT
MESG DB ‘HELLO!’,0AH,0DH,’$’
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEG: MOV AX,STACK
MOV SS,AX
MOV SP,100
MOV AX,DATA
MOV DS,AX
MOV CX,10
LAST: MOV AH,9
MOV DX,OFFSET MESG
INT 21H
LOOP LAST
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
3)完整格式2 (.EXE)
例:计算100+99+98+…+2+1
data segment
sum dw ?
data ends
code segment
main proc far
assume cs:code,ds:data
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
xor ax,ax
mov cx,100
again: add ax,cx
loop again
mov sum,ax
ret
main endp
code ends
end main
三、汇编语言的基本语法和伪指令
1.汇编语言的基本语法
1)标号与变量
标号:是一条指令语句的符号地址。可作为转移类指令的操作数,即转移地址。
变量:存放在某些存储单元中的值
标号和变量具有三种属性
① 段属性
标号和变量对应存储单元的段地址
② 偏移属性
标号和变量对应存储单元的偏移地址
③ 类型属性
标号的类型可以是NEAR和FAR,分别表示段内或段间
变量的类型可以是BYTE、WORD和DWORD等
变量、标号的命名
一般最多由31个字母、数字及规定的特殊符号(.、 _、 、?、@)组成,不能以数字开头.只能位于名字首 、?不能单独作为名字
不区别标识符中的字母大小写
不能使用汇编语言的保留字
保留字
保留字(Reserved Word)是汇编程序已经利用的标识符,主要有:
指令助记符——例如:MOV、ADD
伪指令助记符——例如:DB、EQU
运算符——例如:OFFSET、PTR
寄存器名——例如:AX、CS
预定义符号——例如:@data
2)常数
常数表示一个固定的数值
数值常数
字符串常数 用引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值。
符号常数 利用一个标识符表达的一个数值。
例:DWriteChar equ 2
OFFSET
格式:OFFSET 变量或标号
功能:取其后变量或标号的偏移地址。
例如:MOV BX,OFFSET BUF
SEG
格式:SEG 变量或标号
功能:取其后变量或标号所在段的段首址。
例如: MOV AX,SEG ABC
MOV DS,AX
2)等值伪指令EQU
功能:给符号名定义一个值,或别的符号名。
格式:符号名 EQU 表达式
例:
PORT1 EQU 100
PORT2 EQU PORT1 + 10
COUNT EQU CX
AD EQU ADD
特点:不能重复定义。不分配存储单元。
四、基本结构程序设计举例
例1:实现一位16进制数转换为ASCII码显示。 (查表法)
.model small
.stack 256
.data
ASCII db 30h,31h,32h,33h,34h,35h
db 36h,37h,38h,39h
db 41h,42h,43h,44h,45h,46h
Hex db 0bh
.code
.startup
mov bx,offset ASCII
mov al,hex
and al,0fh
xlat
mov dl,al
mov ah,2
int 21h
.exit 0
end
例2:编写计算下面函数值的程序。
1 X>0
Y= 0 X=0
-1 X
DATA SEGMENT
X DB -10
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
CMP X,0
JGE A1
MOV Y,-1
JMP EXIT
A1: JG A2
MOV Y,0
JMP EXIT
A2: MOV Y,1
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
例3:编程统计BUF字单元中1的个数。
DATA SEGMENT
BUF DW 0011110010101011B
COUNT DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV AX,BUF
MOV CL,0
LOPA: AND AX,AX
JZ EXIT
SHL AX,1
JNC LOPA
INC CL
JMP LOPA
EXIT: MOV COUNT,CL
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4:编程实现将BUF字单元的二进制数以十六 进制形式显示在屏幕上。
DATA SEGMENT
BUF DW 2468H
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV BX,BUF
MOV CH,4
RT: MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRT
ADD AL,07H
PRT: MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ RT
RET
MAIN ENDP
CODE ENDS
END MAIN
例5:在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。
数 10 8 16 90 32
第一遍 10 16 90 32 8
第二遍 16 90 32 10 8
第三遍 90 32 16 10 8
DATA SEGMENT
BUF DW 3,-4,6,7,9,2,0
DW -8,-9,-10,20
N EQU ($-BUF)/2
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1:MOV DX,CX
MOV BX,0
LOOP2:MOV AX,BUF[BX]
CMP AX,BUF[BX+2]
JGE L
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX
L: ADD BX,2
DEC CX
JNE LOOP2
MOV CX,DX
LOOP LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START