标号
1.标号就是程序中某一条特定指令的符号地址.标号所指示的地址位于代码段.
标号:指令助记符 操作数
例:L1: ADD AL,BL
VAR DB 12H ;
段属性SEG
偏移量属性OFFSET
类型属性TYPE
2.符号名字段:任选字段,不一定是变量,也可能是常量,表示地址
符号名 伪指令符 操作数 ;
例:VAR DB 12H ;
VAR EQU 10
3.变量,指某一个特定的内存单元,是具体的实在的。
语句格式:变量名 DB 表达式1,表达式2…
例:VAR DB 12H ;
4.常量,只能进行一次赋值,没有赋予任何内存单元
VAR EQU 10,VAR是常量,不是变量
等号语句的作用和等值语句完全一致,但用等号定义过的符号可以再次使用等号修改其定义。
算术运算
表示地址的变量只能做减法运算.
逻辑运算符
包括AND、OR、XOR、NOT四个运算符,只能用于数值表达式。
关系运算符
包括EQ、NE、LT、LE、GT、GE六个运算符
数值返回运算符
SEG运算符
加在引用的变量名或标号前面,运算结果是返回该变量或标号的段基值。
MOV AX,SEG VAR1
MOV DS,AX
OFFSET运算符
加在引用的变量名或标号前,运算结果为返回该变量或标号的偏移量。
mov ax, offset var1 ;汇编后是立即数
lea ax, var1 ;内存单元的偏移量
;固定搭配通用寄存器
TYPE运算符
加在引用的变量名或标号前,运算结果为返回该变量占用的字节数,或标号的FAR(-1)或NEAR类型(-2) 。
var1 db ?
var2 dw ?
……
mov ax, type var1 ;=1
mov bx, type var2 ;=2
LENGTH运算符
针对DUP.如果定义该变量时使用了DUP关键字,那么返回重复的次数;如果没有使用DUP,那么返回1。
SIZE运算符
只能加在引用变量名前,返回结果相当于LENGTH运算符和TYPE运算符的乘积,即数组变量总共占用的字节数目。
SIZE = LENGTH × TYPE
属性运算符
PTR运算符
PTR 地址,类型有:BYTE,WORD,DWORD
例子:mov al ,byte ptr var1
介绍两个DOS功能调用:
(1)1号功能键盘输入
格式: AH=1【mov AH 1H】
INT 21H
功能:从键盘输入一个字符并将该字符的ASCII码送入AL中。
(2)2号功能显示器输出
格式: AH=2【mov AH 2H】
DL=字符
INT 21H
功能:输出DL中的一个字符到显示器的光标处。
程序的段结构
段定义伪指令
段名 SEGMENT
其他伪指令
(1)地址计数器$ ,
$表示数据段的当前地址偏移量。
(2)段寻址伪指令ASSUME
在程序设计中,ASSUME语句一般在代码段中位于所有指令语句之前。
(3)begin—end
第一条指令的地址在源程序中是通过END伪指令来确定的。
示例:
数据段、堆栈段略去
code segment
assume cs:code,ds:data,ss:stack1
begin: mov ax, data ;初始化DS、ES
mov ds, ax
…… ;程序主体
mov ah, 4ch ;返回DOS
int 21h
code ends
end begin ;结束源程序
(3)SS的装入
两种方法
自动初始化:如果希望采用这种初始化方式,在定义堆栈段时必须使用STACK作为组合类型。对STACK段,操作系统将程序装入到内存准备运行时,会自动初始化SS和SP。
stack1 segment stack
dw 20h dup(0)
stack1 ends
手动初始化:MOV指令
基本结构框架
(1)使用特定的中断调用
mov ah, 4ch ;返回DOS
int 21h