Chapter4
教学重点
本章重点掌握:
?程序的格式, 开发方法
?参数的表达, 变量的定义
?变量和标号的属性
指令和伪指令
?指令 —— 使 CPU产生动作, 并在程序
执行时才处理的语句, 就是第 2章学习
的处理器指令
?伪指令 ( Directive) —— 不产生 CPU
动作, 在程序执行前由汇编程序处理
的说明性语句, 例如, 数据说明, 变
量定义等等
?伪指令与具体的处理器类型无关, 但
与汇编程序的版本有关
本课程采用微软宏汇编程序 MASM 4.0
汇编语言程序的开发
?本节从汇编语言程序的 语句格式
出发, 给出第一个示范性的汇编
语言 源程序, 并演示汇编语言程
序的过程:
编辑 汇编 连接 调试
?即汇编语言程序的开发方法
语句格式
指令语句
这种语句又称为执行语句,因为每一条指令语句
在汇编时都要产生一个可执行的机器目标代码,其格
式如下:
标号, 指令助记符 操作数 ;
注释,
1,Label Fields
这是一个任选字段, 以,,”结束, 代表该条指令的地
址 ( 符号地址 ), 可供转移指令或调用子程序指令直接
使用 。
2,Mnemonic Fields
这是指令语句的核心字段, 它说明指令的具体功
能和操作 。
3,Operand Fields
这个字段根据指令的具体功能提供相应的操作数 。
4,Comment Fields
这是一个任选字段, 仅起对指令的解释作用, 提
高程序的可读性和可维护性等, 这部分内容不产生目
标代码 。
语句格式
伪指令语句
这种指令在汇编时不产生目标代码,因此,它不
是执行指令,它的作用就是在汇编时告诉汇编程序对
其后面的操作如何产生目标代码,其格式如下:
符号名 伪指令助记符 操作数 ;
注释,
1,Symbol Name Fields
符号名字段是一个任选字段, 它是一个常量或存储器
地址, 可以作为指令语句或伪指令语句的操作数 。
2,Mnemonic Fields
这是伪指令语句的核心字段, 它说明伪指令语句
的具体功能和作用 。
3,Operand Fields
这个字段根据伪指令确定其具体内容 。
4,Comment Fields
和指令语句一样 。
MOV CX,0 ;传送指令, 具有 2个操作数
DELAY:NOP;空操作指令, 没有操作数, 带有标号
LOOP DELAY;循环指令, 标号 DELAY说明转移位置
BUFFERDB 1,2,3,4,5,6,7;数据定义伪指令, 在主存中开辟 7个连续的
字节单元, 初值依次为 1~ 7,BUFFER表示首地址
标号, 名字与标识符
?标号 是反映指令语句位置 ( 逻辑地址 ) 的标识
符, 后跟一个冒号分隔
?名字 是反映伪指令位置 ( 逻辑地址 ) 和属性的
标识符, 后跟空格或制表符分隔, 没有一个冒

?标识符 ( Identifier) 一般最多由 31个字母, 数
字及规定的特殊符号 ( 如 _,$,?,@) 组成,
不能以数字开头 。 默认情况下, 汇编程序不区
别标识符中的字母大小写
?一个程序中, 每个标识符的定义是唯一的, 还
不能是汇编语言采用的保留字
保留字
?保留字 ( Reserved Word) 是汇编程
序已经利用的标识符, 主要有:
o 硬指令助记符 —— 例如,MOV,ADD
o 伪指令助记符 —— 例如,DB,EQU
o 操作符 —— 例如,OFFSET,PTR
o 寄存器名 —— 例如,AX,CS
o 预定义符号 —— 例如,@data
汇编语言大小写不敏感
助记符
?指令语句助记符 可以是任何一条处理器
指令, 也可以是一条宏指令
?伪指令助记符 将在后面学习
?前面引入的定义字节数据和字符串的
DB就是伪指令
操作数与参数
?处理器指令的 操作数 可以是立即
数, 寄存器和存储单元
? 伪指令的 参数 可以
是常数, 变量名, 表
达式等, 可以有多个,
参数之间用逗号分隔
注释
?语句中由分号, ;”开始的部分为注
释内容, 用以增加源程序的可读性
?必要时, 一个语句行也可以由分号
开始作为阶段性注释
?汇编程序在翻译源程序时将跳过该
部分, 不对它们做任何处理
分隔符
?语句的 4个组成部分要用分隔符分开
?标号后用冒号, 注释前用分号
?操作数之间和参数之间使用逗号分隔
?其他部分通常采用空格或制表符
?多个空格和制表符的作用与一个相同
?MASM支持续行符, \”
参数, 变量和标号
?本节详细讨论汇编语言程序语句
的主要部分:
参数 变量名 标号
?并引出相关的伪指令和操作符
?本节重点掌握:
?常数的表达
?变量定义伪指令 DB/DW/DD
?地址操作符和类型操作符
数值型参数
?在源程序语句格式的 4个组成部分中, 参数
是指令的操作对象 ( 在指令语句中称为操作
数 ), 参数之间用逗号分隔
?参数根据指令不同可以没有, 可以有 1个, 2
个或多个
?汇编语言程序中, 指令参数有数值型, 它的
主要形式是 常数 和 数值表达式 ;
?指令语句的操作数有立即数;立即数就要用
数值型参数表达
常数
?常数 ( 常量 ) 表示一个固定的数值
?它又分成多种形式:
( 1) 十进制常数
( 2) 十六进制常数
( 3) 二进制常数
( 4) 八进制常数
( 5) 字符串常数
( 6) 符号常数
常数的作用
?作指令中的立即数
如,MOV AX,234
?作寻址 ( 基址寻址, 变址寻址和基
址变址寻址 ) 中的位移量
如,MOV AX,100H[BX][SI]
?在伪指令中作操作数
如,ADDR DB 20,30,’ ABC’
变量
变量 实质上就是某一个或几个存储单元 。
变量的预置
db,dw和 dd三个伪指令
变量的三种属性:
① 段值 ( 指明存在于哪个段中 )
?变量 ( 名字 ) 对应存储单元的段地址
② 偏移值 ( 指明段内的位置 )
?变量 ( 名字 ) 对应存储单元的偏移地址
③ 类型 ( 指明每个变量占用的字节数 )
?变量名的类型可以是 BYTE( 1字节 ),
WORD( 2字节 ) 和 DWORD( 4字节 ) 等
变量定义伪指令助记符
?变量定义伪指令根据申请的主存空间
单位分类
?DB—— 定义字节伪指令
?DW—— 定义字伪指令
?DD—— 定义双字伪指令
?DF—— 定义 3字伪指令
?DQ—— 定义 4字伪指令
?DT—— 定义 10字节伪指令
?还有定位伪指令
变量定义伪指令
?变量定义 ( Define) 伪指令为变
量申请固定长度的存储空间, 并
可同时将相应的存储单元初始化
变量名 伪指令助记符 初值表
变量名 初值表
变量定义伪指令最常使用
db
dw
dd
变量名
?变量名为用户自定义标识符, 表示初
值表首元素的逻辑地址 ;用这个符号
表示地址, 常称为符号地址
?变量名可以没有 。 这种情况, 汇编程
序将直接为初值表分配空间, 无符号
地址
?设置变量名是为了方便存取它指示的
存储单元
初值表
?初值表是用逗号分隔的参数
?主要由数值常量 ( 常数和字符或字
符串 ), 表达式或?, DUP组成
? —— 表示初值不确定, 即未赋初值;
DUP—— 表示重复初值
DUP的格式为:
重复次数 DUP( 重复参数 )
DUP格式的使用
格式:重复次数 DUP( 重复参数 )
如,DAT DB 64H DUP( 0)
STRING DB 3 DUP( ’ abcde’)
dat1 db 3 dup( 3 dup( 2),7)
dat db 0,0,0,0,0,……,0
string db ‘abcde’,‘abcde’,‘abcde’
dat1 db 2,2,2,7,2,2,2,7,2,2,2,7
100个
定义字节单元伪指令 DB
DB伪指令用于分配一个或多个字节单元,
并可以将它们初始化为指定值
初 值 表 中 每 个 数 据 一 定 是 字 节 量
( Byte), 存放一个 8位数据:
可以是 0~255的无符号数
或是- 128~+ 127带符号数
也可以是字符串常数
data segment ;数据段
X db 'a',-5
db 2 dup(100),?
Y db 'ABC'
data ends
定义字单元伪指令 DW
DW伪指令用于分配一个或多个字单
元, 并可以将它们初始化为指定值
初 值 表 中 每 个 数 据 一 定 是 字 量
( Word), 一个字单元可用于存放任
何 16位数据:
一个段地址
一个偏移地址
两个字符
0~ 65535之间的无符号数
- 32768~+ 32767之间的带符号数
data segment ;数据段
count dw 8000h,?,'AB'
maxintequ 64h
numberdw maxint
array dw maxint dup(0)
data ends
字变量和字常量的定义:
WNUM EQU 5678H ;定义 WNUM为常量
COUNTDW 20H;定义 COUNT变量, 假设在数据段的偏移地址为 10H
字变量和字常量的应用:
MOV AX,[BX+SI+WNUM] ; MOV AX,[BX+SI+5678H]
MOV AX,COUNT ; MOV AX,[0010H]
MOV AX,[SI+COUNT] ; MOV AX,COUNT[SI]; MOV AX,[SI+10H]
LEA BX,COUNT ; LEA BX,[0010H]
MOV BX,OFFSET COUNT ; MOV BX,0010H
定义双字单元伪指令 DD
DD伪指令 用于分配一个或多个双字单元,
并可以将它们初始化为指定值
初值表中每个数据是一个 32位的双字量
( Double Word),
可以是有符号或无符号的 32位整数
也可以用来表达 16位段地址 ( 高位字 ) 和
16位的偏移地址 ( 低位字 ) 的远指针
vardd DD 0,?,12345678h
farpoint DD 00400078h
其他数据单元定义伪指令
? 定义 3字伪指令 DF——用于为一个或多个 6
字节变量分配空间及初始化
6字节常用在 32位 CPU中表示一个 48位远指针
( 16位段选择器,32位偏移地址 )
? 定义 4字伪指令 DQ——用于为一个或多个 8
字节变量分配空间及初始化
8字节变量可以表达一个 64位整数
? 定义 10字节伪指令 DT—— 用于为一个或
多个 10字节变量分配空间及初始化
10字节变量可以表达扩展精度浮点数
例,数据定义综合应用- 1/2
Data segment
bvar DB 16
wvar DW 4*3
dvar DD 4294967295 ;= 232- 1
qvar DQ?
DB 1,2,3,4,5
tvar DT 2345 ;定义了 BCD码 2345H
abc DB 'a','b','c'
msg DB 'Hello',13,10,'$'
bbuf DB 12 DUP('month')
dbuf DD 25 DUP(?)
CALLDOS EQU <int 21h>
Data ends
例,数据定义综合应用- 2/2
Code segment
assume cs:code,ds:data
Start:movax,data
mov ds,ax
mov bl,bvar
mov ax,word ptr dvar[0]
mov dx,word ptr dvar[2] ; 取 双 字 到
DX.AX
mov dx,offset msg
mov ah,09h
CALLDOS
Code ends
end start
例,数据复制和显示- 1/2
data segment
source db 33h,34h,35h,36h ;定义 4个字符数据
target db 80 dup(?) ;分配数据空间 4× 20=80
data ends
code segment
assume cs:code,ds:data
Start,mov ax,data
mov ds,ax
mov es,ax ;data也作为附加段
cld
mov si,offset source
mov di,offset target
mov cx,80
例,数据复制和显示- 2/2
rep movsb ;串传送
mov si,0 ;显示
mov bx,offset target
again,mov dl,[bx+si]
mov ah,2
int 21h
inc si
cmp si,80
jb again
code ends
end start
变量的使用
?变量在指令语句中, 作操作数或偏移
量, 如:
mov al,data+2
mov ax,data1[bx][si]
?在伪指令中, 作地址指针, 如:
addr1 dw data1;addr1字单元中
存 data1变量的偏移量
addr2 dd data1; addr2双字单元
中存 data1变量的段基址和偏移量
标号
?标号就是指令的符号地址
?标号的三种属性:
① 段值 ( 指明存在于哪个段中 )
?标号对应存储段的段地址
② 偏移值 ( 指明段内的位置 )
?标号在存储段内的偏移地址
③ 类型 ( 指明标号的类型属性 )
?标号的类型可以是 NEAR( 近 ) 和
FAR( 远 ) 两种
LABEL伪指令
?格式,名称 label 类型
?功能:为指定的名称 ( 变量或标号 ) 定义类型 。
?用途:
( 1) label与指令语句连用, 为标号定义类型
属性, 如:
sub_far label far
sub:mov ax,bx
……
这样, sub_far和 sub两个标号就具有相
同的逻辑地址, 但具有不同的类型属性, 前者
为 far属性, 后者为 near属性 。
LABEL伪指令
( 2) label与伪指令 ( 变量定义 ) 语句连用,
为变量定义类型属性, 如:
dat_byte label byte
dat_word dw 20h dup(?)
这样, dat_byte和 dat_word两个变量
就具有相同的逻辑地址, 但具有不同的类型
属性, 前者为字节类型, 后者为字类型 。 在
访问这一段存储器时, 可以通过 dat_byte作
为字节访问, 也可以通过 dat_word作为字访
问, 增加了使用的灵活性 。
等值语句
?格式,符号 equ 表达式
?功能:将表达式的值或表达式赋给它左边
的符号 。
?用途:
( 1) 常数或数值表达式, 如:
count equ 10
num equ 13+5-10
( 2) 地址表达式, 如:
addr equ ds:[bp+4]
( 3)变量、标号或指令助记符,如:
creg equ cx
cbd equ daa
L1 equ substart
w0 equ word ptr da_byte
注意:
( 1) 等值语句的符号没有段、偏移量和类
型等属性,它不占用存储单元,也不产生目标
代码,仅在汇编时作替代符号的作用。
( 2) 在一个源程序中,同一符号不能重复
定义。
等号语句
?格式,符号 = 表达式
?功能:将表达式的值或表达式赋给它左边的符
号 。
?用途:
这条语句和等值语句的用途相同, 不同的
是等号语句可以在同一个程序段中重新定义符
号 。
如,num1=15
……
num1=20
表达式
?表达式就是通过运算符将常量, 变
量, 标号等连接而成的式子
?有数值表达式和地址表达式两种
?汇编程序在汇编过程中计算表达式,
最终得到一个数值或地址
?程序运行之前, 就已经计算出了表
达式;所以, 程序运行速度没有变
慢, 但增强程序的可读性
运算符
?算术运算符
+ - * / MOD
?逻辑运算符
AND OR XOR NOT
?移位运算符
SHL SHR
?关系运算符
EQ NE GT LT GE LE
?高低分离符
HIGH LOW HIGHWORD LOWWORD
地址型参数
?汇编语言程序中, 指令参数还有地址
型, 它的主要形式是标号和名字 ( 变
量名, 段名, 过程名等 )
?指令语句的操作数有存储单元;存储
单元就应该用地址型参数 ( 存储器操
作数 ) 表达
定位伪指令
定位伪指令控制数据的偏移地址
? ORG 参数
ORG伪指令是将当前偏移地址指针指向参
数表达的偏移地址:
ORG 100h ;从 100h处安排数据或程序
ORG $+10;使偏移地址加 10,即跳过 10个字节空间
MASM中, 符号, $”表示当前偏移地址值
? EVEN ;从偶地址开始
? ALIGN n ;从 n的整数倍地址开始
地址操作符
? 取得名字或标号的段地址和偏移地
址两个属性
[ ] 将括起的表达式作为存储器地址
$ 当前偏移地址
,采用指定的段地址寄存器
OFFSET 名字 /标号
返回名字或标号的偏移地址
SEG 名字 /标号
返回名字或标号的段地址
org $+10
array db 45,45h
……
mov ax,seg array
mov ds,ax
mov bx,offset array;等价于 lea bx,array
mov cl,array+4;等效于 mov cl,array[4]
mov ax,es:[2000h]
加 4个字节单元
类型操作符
? 类型操作符对名字或标号的类型属
性进行有关设置
类型名 PTR 名字 /标号
THIS 类型名
SHORT 标号
TYPE 名字 /标号
SIZE 变量名
LENGTH 变量名
PTR操作符
类型名 PTR 名字 /标号
? PTR操作符使名字或标号具有指定的类型
? 类型名可以是
BYTE/WORD/DWORD/FWORD/QWORD/TBYTE
或者是 NEAR/FAR,还可以是由 STRUCT,RECORD、
UNION以及 TYPEDEF定义的类型
mov al,byte ptr w_var ;w_var是一个字变量
jmp far ptr n_label ;n_label是一个标号
? 使用 PTR操作符, 可以临时改变名字或标号的类型
THIS操作符THIS 类型名
? 利用 THIS说明的操作数具有汇编时的当前逻辑地址,
但具有指定的类型
b_var equ THIS byte;按字节访问变量 b_var,但与 w_var的地址相同
w_var dw 10 dup(0) ;按字访问变量 w_var
f_jump equ THIS far;用 f_jump为段间转移 ( f_jump label far)
n_jump,mov ax,w_var;用 n_jump为段内近转移, 但两者指向同一条指令
? LABEL伪指令的功能等同于, EQU THIS”
SHORT操作符
SHORT 标名
? 指定标号作为 -128~ +127字节范围内
的短转移
jmp short n_jump
?当然, 如果标号实际上超出了这个范
围, 则出错 。
对高版本 MASM已无意义
TYPE,SIZE,LENGTH操作符
TYPE 名字 /标名
? 返回表明名字或标号类型的一个字量数值
?对字节, 字和双字变量依次返回 1,2和 4;
?对短, 近和远转移依次返回 ff01h,ff02h和 ff05h
mov ax,TYPE w_var ;汇编结果为 mov ax,2
mov ax,TYPE n_jump;汇编结果为 mov ax,0ff02h( near标号 )
? 操作符 SIZE返回整个变量占用的字节数
? LENGTH返回整个变量的数据项数 ( 即元素数 )
SIZE = LENGTH × TYPE
例题:属性及其 应用- 1/5
Data1 segment
v_byte equ this byte;v_byte是字节类型, 与变量 v_word的地址相同
v_word dw 3332h,3735h;v_word是字类型的变量
target dw 5 dup(20h);分配数据空间 2× 5= 10字节
crlf db 0dh,0ah,'$'
flag db 0
n_point dw offset s_label;取得标号 s_label的偏移地址
Data1 ends
例题:属性及其 应用- 2/5
code1 segment
start,……
mov al,byte ptr v_word;用 PTR改变 v_word的类型, 否则类型不匹配
dec al
mov v_byte,al;对 v_word的头一个字节操作, 原为 32H,现为 31H
n_label,cmp flag,1
jz s_label ;flag单元为 1转移
inc flag
jmp short n_label ;进行短转移
例题:属性及其 应用- 3/5
s_label,cmp flag,2
jz next ;flag单元为 2转移
inc flag
jmp n_point;段内的存储器间接寻址, 转移到 s_label标号处
next,mov ax,type v_word;汇编结果为 mov ax,2
mov cx,length target;汇编结果为 mov cx,5
例题:属性及其 应用- 4/5
mov si,offset target
w_again,mov [si],ax ;对字单元操作
inc si ;SI指针加 2
inc si
loop w_again ;循环
mov cx,size target;汇编结果为 mov cx,0ah
mov al,'?'
mov di,offset target
b_again,mov [di],al ;对字节单元操作
inc di ;DI指针加 1
loop b_again ;循环
例题:属性及其 应用- 5/5
mov dx,offset v_word;显示结果,1357
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
TYPE,SIZE,LENGTH操作符的应用
array dw 40 dup(?)
……
xor ax,ax; AX初始化
mov cx,length array;数据个数
mov si,size array-type array; SI指向数组最后
一个数
next,add ax,array[si];数据累加,指向下一个数
sub si,type array;修改地址,
loop next;循环
操作符的优先级
运算符的优先级别
1 ( ) <> [ ] ·LENGTH SIZE WIDTH MASK
2 PTR OFFSET SEG TPYE THIS,
3 HIGE LOW
4 * / MOD SHL SHR
5 + -
6 EQ NE GT LT GE LE
7 NOT
8 AND
9 OR XOR
运算规则
1 在同一表达式中, 按操作符的优先级从高到低运算 。
2 同级操作, 从左到右进行
3 可以用, ( ), 改变优先顺序
建议采用圆括号, ( ), 显式表达,
它可以极大地提高程序的可阅读性
程序段的定义和属性
?详述汇编语言程序格式的组成部分
首先, 简单了解 DOS支持的 exe程序和
com程序
其次, 重点掌握简化段定义格式的各
条伪指令
最后, 理解完整段定义格式所包含的
各种段属性
完整段定义伪指令
段名 segment 定位类型 组合类型 ‘ 类别名 '
..,;语句序列
段名 ends
? 完整段定义由 SEGMENT和 ENDS这一对伪指令实现,
SEGMENT伪指令定义一个逻辑段的开始, ENDS伪指令
表示一个段的结束
? 段名规定段的名称, 有用户自行定义, 这个段名
的定义与段的用途有关
? 段定义指令后的 4个关键字用于确定段的各种属性,
堆栈段要采用 stack组合类型, 代码段应具有 ‘ code’
类别, 其他为可选属性参数
? 如果不指定, 则采用默认参数;但如果指定, 注
意要按照上列次序
段定位 ( align) 类型
?定位类型是一个选项, 它表示对段起始位置的要求, 它
指定逻辑段在主存储器中的边界, 有 4种选择:
BYTE 表示段 起始地址可以从任一地址开始 ( xxxx xxxxb)
WORD 段开始为下一个可用的偶数地址 ( xxxx xxx0b)
PARA 段开始为下一个可用的节地址 ( xxxx 0000b)
PAGE 段开始为下一个可用的页地址 ( 0000 0000b)
?如果选用 para或 page定位类型, 其低 4位已经是 0,则本
段的 起始与段基址相同, 则段起始字节单元的偏移量就一
定 0。 如果未选择定位类型, 则默认为 para。
?如果选用 byte或 word定位类型, 则段的 起始地址就不一
定与段基址相同, 则段起始字节单元的偏移量就可能不为
0。
?一般采用 para或 page定位类型
段组合 ( combine) 类型
? 指定多个逻辑段之间的关系, 可为:
NONE 本段与其他段没有逻辑关系, 不与其
他段合并, 每段都有自己的段地址 。 这是 段定
义伪指令默认的段组合方式
PUBLIC 连接程序把本段与所有同名同类型
的其他段 相邻地连接在一起, 然后为所有这些
段指定一个共同的段地址, 也就是 合成一个物
理段 。
COMMAN 产生一个覆盖段, 主要用于共享
存储区, 长度由最大的段确定 。
STACK 本段是堆栈的一部分, 连接程序将
所有 STACK段按照与 PUBLIC段的同样方式进
行合并 。 这是 堆栈段必须具有的段组合
段组合 ( combine) 类型
memory 表示本段连接在其他段的最
后面, 即存储器的最高地址端 。
AT 表达式 将段定位在指定的节边界
上, 表达式的值是段基址 。
段类别 ( class) 属性
? 当连接程序组织段时, 将所有的同类
别段相邻分配
? 段类别可以是任意名称, 但必须位于
单引号中
? 大多数 MASM程序使用 ‘ code’、
‘ data’和 ‘ stack’来分别指名代码段,
数据段和堆栈段, 以保持所有代码和数
据的连续
?注意,定位类型, 组合类型和类别名
三个参数是任选的, 各项之间用空格分
隔, 可选其中一个或几个, 但位置不能
交换 。
段寻址寄存器伪指令
格式,ASSUME 段寄存器:段名 [,段寄存器名:段名,...]
功能:指示汇编程序,当前段与段寄存器的关系。
? 通知 MASM用指定的段寄存器来寻址对应的逻辑
段, 即建立段寄存器与段的缺省关系
? 在明确了程序中各段与段寄存器之间的关系后,
汇编程序会根据数据所在的逻辑段, 在需要时自动
插入段超越前缀 。 这是 ASSUME伪指令的主要功能
? ASSUME伪指令并不为段寄存器设定初值, 连接
程序 LINK将正确设置 CS, IP和 SS, SP
由于数据段通常都需要, 所以在样板源程序中,
首先为 DS赋值;如果使用附加段, 还要赋值 ES
段寄存器的装入
? DS和 ES的装入
通过寄存器传送
如,MOV AX,DATA1
MOV DS,AX
MOV AX,DATA2
MOV ES,AX
? SS的装入
( 1) 自动装入
采用定义段时指定组合类型 STACK参数, 在
ASSUME语句中建立 SS的关系, 这样就可以自动
装入 SS。
SS段寄存器的装入
stack1 segment para stack
dw 40h dup(?)
stack1 ends
……
code1 segment
assume cs:code1,ss:stack1,……
……
SS段寄存器的装入
(2) 程序设置
stack1 segment para stack
dw 40h dup(?)
top label word
stack1 ends
……
code1 segment
assume cs:code1,ss:stack1,……
……
mov ax,stack1
mov ss,ax
mov sp,offset top
……
CS和 IP的装入
(1)初始化时装入,根据 END伪指令指示的地址
END [标号 ]
END语句的作用:
告诉汇编程序,源程序结束
指定程序运行时的起始地址,即:
seg 标号 cs
offset 标号 ip
汇编结束伪指令END [标号 ]
?指示汇编程序 MASM到此结束汇编过程
?源程序的最后必须有一条 END语句
?可选的标号用于指定程序开始执行点, 连接
程序将据此设置 CS, IP值
———— 不要糊涂 ————
程序终止和汇编结束是两码事
CS和 IP的装入
(2)自动修改 CS和 IP
执行 CALL FAR和 RET指令
执行 JMP FAR指令
响应中断及中断返回( IRET)
RESET
……
汇编语言程序结构
stacksegsegment para stack
db 256 dup(?)
stacksegends
data1 segment word public 'const'
……
data1 ends
data2 segment word public 'vars'
……
data2 ends
codeseg segment
assume cs:codeseg,ds:data1,es:data2,ss:stackseg
汇编语言程序结构
start,mov ax,data1;初始化 DS和 ES
mov ds,ax
mov ax,data2
mov es,ax
……
mov ah,4ch ;程序结束, 返回 DOS
int 21h
codeseg ends
end start
第 4章 教学要求 ( 1)
1,掌握汇编语言语句格式
2,掌握或完整段定义源程序格式
3,掌握常量表达, 变量定义及应用, 变量, 标
号和逻辑段的属性
4,了解数值表达式和程序结构
5,掌握汇编语言源程序的编辑, 汇编, 连接和
调试的开发方法
第 4章 教学要求 ( 2)
6,掌握基本伪指令和操作符:
EQU/=, +- */,DB/ DW/ DD,? / DUP
ORG/ $,OFFSET/ SEG/ PTR
/ END
SEGMENT/ENDS
第 4章 教学要求 ( 3)
7,了解不常使用伪指令和操作符:
逻辑, 移位和关系运算符
THIS/ SHORT/ TYPE/ SIZE/ LENGTH
ASSUME
Take a Break