1
? 汇编程序功能
? 伪操作
? 汇编语言程序格式
? 汇编语言程序的上机过程
第四章 汇编语言程序格式
2
汇编程序 编辑程序
连接程序
program.asm program.obj
program.exe
1,汇编程序功能
汇编程序的主要功能,
? 检查源程序,给出出错信息
? 产生目标文件 (.obj)和列表文件 (.lst)
? 展开宏指令
3
2,伪操作(伪指令)
是汇编程序对源程序进行 汇编 时处理的操作, 完成
处理器选择, 存储模式定义, 数据定义, 存储器分配,
指示程序开始结束等功能 。
? 处理器选择伪操作
? 段定义伪操作
? 程序开始和结束伪操作
? 数据定义及存储器分配伪操作
? 表达式赋值伪操作
? 地址计数器与对准伪操作
? 基数控制伪操作
4
.8086 选择 8086 指令系统
.286 选择 80286 指令系统
.286P 选择保护模式下的 80286 指令系统
.386 选择 80386 指令系统
.386P 选择保护模式下的 80386 指令系统
.486 选择 80486 指令系统
.486P 选择保护模式下的 80486 指令系统
.586 选择 Pentium 指令系统
.586P 选择保护模式下的 Pentium 指令系统
处理器选择伪操作,
5
段定义伪操作,
完整的段定义伪操作
data segment ; 定义数据段

data ends
extra segment ; 定义附加段

extra ends
code segment ; 定义代码段
assume cs:code,ds:data,es:extra
start,
mov ax,data
mov ds,ax ; 段地址 ? 段寄存器

code ends
end start
PSP ?
DS
ES
SS?
CS?
EXE 程序的内存映象图







6
……
code segment
main proc far
assume ……
start,
push ds
mov ax,0
push ax
……
ret
main endp
code ends
end start
……
code segment
main proc far
assume ……
start,
……
……
mov ax,4c00h
int 21h
main endp
code ends
end start
7
data segment
……
data ends
stack segment
dw 100 dup (?)
tos label word
stack ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
start,
mov ax,stack
mov ss,ax
mov sp,offset tos
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
……
ret
main endp
code ends
end start
PSP ?
DS
ES
SS?
CS?
8
PSP ?
DS
ES
SS?
CS?
data segment
……
data ends
stack segment stack
dw 100 dup (?)
tos label word
stack ends
code segment
……
start,
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
……
ret
……
code ends
end start
9
段名 SEGMENT [ 定位类型 ] [ 组合类型 ] [ 使用类型 ] [ ?类别 ’ ]
……
…… ; 语句序列
段名 ENDS
(1) 定位类型 align_type
PARA BYTE WORD DWORD PAGE
(2) 组合类型 combine_type
PRIVATE PUBLIC COMMON STACK AT exp
(3) 使用类型 use_type
USE16 USE32
(4) 类别 ‘ class?
10
例,; proadd1.asm
extrn proadd, far
data segment common
ary dw 1,2,3,4,5,6,7,8,9,10
count dw 10
sum dw?
data ends
code1 segment
main proc far
assume cs:code1,ds:data
start,push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
call far ptr proadd
ret
main endp
code1 ends
end start
11; proadd2.asm
public proadd
data segment common
ary dw 1,2,3,4,5,6,7,8,9,10
count dw 10
sum dw?
data ends
code2 segment
proadd proc far
assume cs:code2,ds:data
mov ax,data
mov ds,ax
……
proadd endp
code2 ends
end
12
存储模式与简化段定义伪操作
.model small
.stack 100H
.data
……
.code
.startup
……
.exit 0
end
(1) MODEL 伪操作
, MODEL 存储模式 [,语言类型 ] [,操作系统类型 ] [,堆栈选项 ]
存储模式, tiny small medium compact large huge flat
(2) 简化的段定义伪操作
.code [name]
.data
.data?
.fardata [name]
.fardata? [name]
.const
.stack [size]
13
.model small
.data
……
.code
.startup
……
.exit 0
end
,model small
,data
……
,code
start,mov ax,@data
mov ds,ax
……
mov ax,4c00h
int 21h
end start,model small
,const
……
,data
……
,code
start,mov ax,DGROUP
mov ds,ax
……
mov ax,4c00h
int 21h
end start
14
段组定义伪操作
dseg1 segment word public ‘data’
……
dseg1 ends
dseg2 segment word public ‘data’
……
dseg2 ends
datagroup group dseg1,dseg2
cseg segment para public ‘code’
assume cs:cseg,ds:datagroup
start,
mov ax,datagroup
mov ds,ax
……
mov ax,4c00h
int 21h
cseg ends
end start
15
data1 segment word
const1 dw 100
data1 ends
data2 segment word
var1 dw?
data2 ends
datagroup group data1,data2
code segment
assume cs:code,ds:datagroup
start,
mov ax,datagroup
mov ds,ax
mov ax,const1
mov var1,ax
mov bx,offset var1
mov bx,offset data1
mov bx,offset data2
assume ds:data2
mov ax,data2
mov ds,ax
mov ax,var1
mov bx,offset var1
mov ax,4c00h
int 21h
code ends
end start; (bx) = 2; (bx) = 2; (bx) = 4; (bx) = 2
16
data1 segment
const1 dw 100
data1 ends
data2 segment
var1 dw?
data2 ends
datagroup group data1,data2
code segment
assume cs:code,ds:datagroup
start,
mov ax,datagroup
mov ds,ax
mov ax,const1
mov var1,ax
mov bx,offset var1
mov bx,offset data1
mov bx,offset data2
assume ds:data2
mov ax,data2
mov ds,ax
mov ax,var1
mov bx,offset var1
mov ax,4c00h
int 21h
code ends
end start; (bx) = 0; (bx) = 2; (bx) = 2; (bx) = 0
17
TITLE text
NAME module_name
END [ label ]
,STARTUP
,EXIT [ return_value ]
程序开始和结束伪操作,
18
数据定义及存储器分配伪操作,
[变量 ] 助记符 操作数 [,操作数,… ] [ ; 注释 ]
助记符,DB DW DD DF DQ DT
DATA_BYTE DB 10,4,10H,?
DATA_WORD DW 100,100H,-5,?
-
0AH
04H
10H
-
64H
00H
00H
01H
FBH
FFH
-
DATA_BYTE ?
DATA_WORD ?
19
ARRAY DB ‘HELLO’
DB ‘AB’
DW ‘AB’
48H
45H
4CH
4CH
4FH
41H
42H
42H
41H
ARRAY ?
PAR1 DW 100,200
PAR2 DW 300,400
ADDR_TABLE DW PAR1,PAR2
VAR DB 100 DUP (?)
DB 2 DUP (0,2 DUP(1,2),3)
20
OPER1 DB?,?
OPER2 DW?,?
……
MOV OPER1,0 ;字节指令
MOV OPER2,0 ;字指令
OPER1 DB 1,2
OPER2 DW 1234H,5678H
……
MOV AX,OPER1+1 ×
MOV AL,OPER2 × 类型不匹配
MOV AX,WORD PTR OPER1+1
MOV AL,BYTE PTR OPER2
(AX)=3402H (AL)=34H
21
BYTE_ARRAY LABEL BYTE
WORD_ARRAY DW 50 DUP (?)
tos LABEL WORD
LABEL 伪操作,name LABEL type
BYTE_ARRAY ?
WORD_ARRAY ?
tos ?
50字
0064H
22
表达式赋值伪操作,
表达式名 EQU 表达式
B EQU [BP+8]
ALPHA EQU 9
BETA EQU ALPHA+18
, =, 伪操作 ( 允许重复定义 )
……
EMP = 7
……
EMP = EMP + 1
……
23
地址计数器与对准伪操作,
地址计数器 $, 保存当前正在汇编的指令的地址
ORG $+8 ; 跳过 8 个字节的存储区
JNE $+6 ; 转向地址是 JNE 的首址 + 6
$ 用在伪操作的参数字段,
表示地址计数器的当前值
ARRAY DW 1,2,$+4,3,4,$+4
00H
01H
00H
02H
00H
7CH
00H
03H
00H
04H
00H
82H
ARRAY ?
007E
0078
0074
24
ORG 伪操作,
SEG1 SEGMENT
ORG 10
VAR1 DW 1234H
ORG 20
VAR2 DW 5678H
ORG $+8
VAR3 DW 1357H
SEG1 ENDS
ORG 100H
START,……
BUFFER LABEL BYTE
ORG $+8 BUFFER DB 8 DUP (?)
25
EVEN ;使下一地址从偶地址开始
A DB ‘morning’
EVEN
B DW 2 DUP (?)
ALIGN boundary
ALIGN 4
ALIGN 2 ; EVEN
26
基数控制伪操作,
,RADIX 表达式 ; 规定无标记数的基数
MOV BX,0FFH
MOV BX,178
.RADIX 16
MOV BX,0FF
MOV BX,178D
27
3,汇编语言程序格式
标号 指令 寄存器 说明程序或语句的功能
变量 伪指令 标号
宏指令 变量
常数
表达式
源程序的每条语句可表示为,
[名字 ] 操作 操作数 [; 注释 ]
标号 /变量, 段值、偏移量、类型三种属性
表达式,数字表达式 地址表达式
28
表达式操作符,
(1) 算术操作符, ?, ?, ?,?,mod
MOV DX,BLOCK+(6-1)*2
ARRAY DW 1,2,3,4,5,6,7
ARYEND DW?
MOV CX,(ARYEND-ARRAY)/2
ADD AX,BLOCK+2 ; 符号地址 ?常数 有意义; ? ? 时意义不明确
MOV AX,BX+1 ; ?
29
OPR1 EQU 25
OPR2 EQU 7
AND AX,OPR1 AND OPR2
(2) 逻辑和移位操作符, AND,OR,XOR,NOT,SHL,SHR; AND AX,1
IN AL,PORT_VAL
OUT PORT_VAL AND 0FEH,AL
MOV AX,0FFFFH SHL 2 ; MOV AX,0FFFCH
30
(3) 关系操作符, EQ,NE,LT,LE,GT,GE
计算结果为 逻辑值, 真 0FFFFH
假 0000H
X,……
……
Y,……
若 ?128 (真 ) 汇编结果,MOV FID,-1
若 ?128 (假 ) 汇编结果,MOV FID,0
MOV FID,(OFFSET Y - OFFSET X) LE 128
31
(4) 数值回送操作符, OFFSET,SEG,TYPE,LENGTH,SIZE
SIZE 变量
功能,LENGTH * TYPE
OFFSET / SEG 变量 / 标号
功能:回送变量或标号的偏址 / 段址
TYPE 变量 / 标号 / 常数
DB DW DD DF DQ DT NEAR FAR 常数
1 2 4 6 8 10 -1 -2 0
LENGTH 变量
功能:回送由 DUP 定义的 变量的单元数,其它情况回送 1
32
ARRAY DW 100 DUP (?)
TABLE DB ‘ABCD’
ADD SI,TYPE ARRAY ; ADD SI,2
ADD SI,TYPE TABLE ; ADD SI,1
MOV CX,LENGTH ARRAY ; MOV CX,100
MOV CX,LENGTH TABLE ; MOV CX,1
MOV CX,SIZE ARRAY ; MOV CX,200
MOV CX,SIZE TABLE ; MOV CX,1
33
(5) 属性操作符, PTR、段操作符,SHORT,THIS,HIGH,LOW,
HIGHWORD,LOWWORD
CONS EQU 1234H
MOV AH,HIGH CONS
MOV AL,LOW CONS
类型 PTR 表达式 MOV WORD PTR [BX],5
段操作符 MOV ES:[BX],AL
SHORT 标号 JMP SHORT NEXT
THIS 类型 TA EQU THIS BYTE
NEXT EQU THIS FAR
34
用 MASM 6.11 和 CodeView 汇编和调试汇编语言程序
在 MASM 6.11 中,Microsoft 公司提供了程序员工作平台
PWB( programmer’s work bench),这是一个集成化开发环境,
程序员可以方便地完成汇编语言源程序的编辑、汇编、连接调试
和执行等工作。
MASM 6 提供的调试工具是 CodeView,CodeView 是一个
源码级调试工具,能支持 16 位和 32 位指令的调试。其用户界面
是多窗口全屏幕的,用户可方便地使用菜单和鼠标来调试程序。
4,汇编语言程序的上机过程
35
上机步骤,
1 设置环境变量
在 MASM 611\BIN 的目录下,执行 new-vars.bat 即可建立环境参数和搜索路径,然后
执行 pwb.exe 即可进入 PWB 的主窗口。用其文件 File 菜单中的 Exit 命令可退出 PWB。
36
2 用 File 菜单下的有关命令建立 asm 文件
3 用 Project 和 Options 菜单下的某些命令建立汇编语言程序运行环境
建立工程文件,设置所建立的可执行文件类型的 Build Options,设置编译器
选项的 Language Options,设置连接器选项的 Link Options,设置调试器选项
的 CodeView Options 等。由于用户使用时大部分选项都可采用 PWB 提供的
默认值,因而不必作任何修改。但对于汇编语言程序,还有必要对 MASM
的选项作出某些选择。
4 用 Project 菜单下的有关命令对源文件进行汇编和连接
Compile File 编译(汇编)当前的源文件,生成目标文件
Build 连接目标文件,生成可执行文件
Build All 汇编当前源文件,连接工程中的所有目标文件,生成可执行
文件
5 用 Run 菜单下的有关命令执行程序
6 用 CodeView 调试程序
37
38
data segment
string1 db 'thamks you'
string2 db 'thanks you'
mass1 db 'match.',13,10,'$'
mass2 db 'no match!',13,10,'$'
data ends
code segment
main proc far
assume cs:code,ds:data,es:data
start,
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax
lea si,string1
lea di,string2
cld
mov cx,10
repz cmpsb
jz match
lea dx,mass2
jmp short disp
match,lea dx,mass1
disp,mov ah,09
int 21h
ret
main endp
code ends
end start
match.asm
39
40
41
42 match.lst (1)
43
match.lst (2)
44 match.lst (3)
45
data segment
string1 db 'thamks you'
mass1 db 'match.',13,10,'$'
mass2 db 'no match!',13,10,'$'
data ends
extra segment
string2 db 'thanks you'
extra ends
code segment
main proc far
assume cs:code,ds:data,es:extra
start,
……
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
……
code ends
end start
match1.asm
46
47
.model small
.data
string1 db 'thamks you‘
string2 db 'thanks you'
mass1 db 'match.',13,10,'$'
mass2 db 'no match!',13,10,'$'
.code
main proc far
start,
……
mov ax,@data
mov ds,ax
mov es,ax
……
main endp
end start
match2.asm
48
49
,model small
,code
org 100h
begin,jmp main;************************
num1 dw 1199H
num2 dw 1166H
sum dw?;************************
main proc near
mov ax,num1
add ax,num2
mov sum,ax
mov ax,4c00h
int 21h
main endp
end begin
例,
50
code segment 'code'
assume cs:code,ds:code,ss:code,es:code
org 100H
begin,jmp main
num1 dw 1199H
num2 dw 1166H
sum dw?
main proc near
mov ax,num1
add ax,num2
mov sum,ax
mov ax,4c00h
int 21h
main endp
code ends
end begin
例,
51
DOS 功能调用 INT 21H
用户在程序中调用 DOS 提供的一些子功能,
( 1) 一般设备的输入输出
( 2) 磁盘的输入输出及磁盘文件的管理
( 3) 其它
调用方法,
( 1) 设置调用参数
( 2) MOV AH,功能号
( 3) INT 21H
52
( 1) DOS 键盘功能调用
例:单字符输入 ( AH = 1 )
get-key, mov ah,1
int 21h
cmp al,‘Y’
je yes
cmp al,‘N’
je no
jne get_key
yes,
……
no,
……
53
例:输入字符串 ( AH = 0ah )
定义缓冲区,
( 1) maxlen db 32
actlen db?
string db 32 dup (?)
( 2) maxlen db 32,0,32 dup (?)
( 3) maxlen db 32,33 dup (?)
lea dx,maxlen
mov ah,0ah
int 21h
0b
20 maxlen?
actlen?
‘H’
‘O’
‘W’
‘A’
‘R’
‘E’
‘Y’
‘O’
‘U’
20
20
0d
string?
(dx)
54
( 2) DOS 显示功能调用
例:显示单个字符 ( AH = 2 )
mov ah,2
mov dl,‘A’
int 21h
例:显示字符串 ( AH = 9 )
string db ‘HELLO’,0dh,0ah,‘$’
……
mov dx,offset string
mov ah,9
int 21h
( 3) DOS 打印功能 ( AH = 5 )
55
作业,
p156 4.5 4.8 4.12 4.14 4.15