伪指令

段定义伪指令

段定义伪指令可用来定义各种类型的段。
格式如下:

段名  SEGMENT  [类型参数]
段名 ENDS

SEGMENT和ENDS必须成对使用,表示段的开始和结束。

ASSUME伪指令

ASSUME伪指令用于指明段寄存器与段的对应关系,格式为:

ASSUME 段寄存器:段名,[段寄存器:段名,…]

如果不使用ASSUME伪指令,系统就无法获知用户定义的段都有哪些,进而就不能正确地划分段。

数据定义伪指令

数据定义伪指令格式为:

[存储单元名]  DB(或DW、DD等伪指令) 操作数

其中:
(1)存储单元可以起名也可以不要名字
(2)数据定义伪指令
DB 定义字节单元
DW 定义字单元
DD 定义双字单元
DQ 定义四字单元
DT 定义十字节单元

  • 操作数用于指出存储单元的内容即该单元的值。
  • 一条数据定义伪指令可以给多个存储单元赋值。
  • 确定存储单元的内容时要与存储单元的属性一致。

赋值伪指令

  • 在程序中多次出现同一个表达式时,可以用EQU定义一个符号来代表表达式,以简化书写。
  • 与EQU伪操作相似,等号 = 伪操作也可以给表达式赋值(只能是数值表达式),允许对一个符号多次重复定义;而EQU则不允许。
    CONT EQU 125*3.14
    STR EQU 'RIGHT'
    SUM EQU 0
    BUFF=56
    PASS=2034H
    BUFF=56H

设置偏移地址伪指令

当前的偏移地址可以用ORG伪指令定义。

如果用在数据段中,该指令可以确定存储单元的偏移地址,例如将X单元的偏移地址定义为0020H,该单元的内容为5,即(DS:0020H)=5。伪指令如下:

DATA  SEGMENT
ORG 0020H
X DW 5
DATA ENDS

如果用在代码段中,可从指定的单元开始存放并执行指令。
例如从代码段的100H开始执行:

ORG 100H
START:MOV AX,X ;标号START设置为100H
MOV BX,Y
ADD AX,BX

操作符

回送偏移地址值OFFSET

MOV BX, OFFSET X ;将X单元的偏移地址传送给BX
MOV AX, OFFSET START ;将标号START的偏移地址传送给AX

回送段地址值SEG

MOV BX,SEG X ;将X单元的段地址传送给BX
MOV AX, SEG START ;将标号START的段地址传送给AX

类型回送操作符TYPE

MOV BX,TYPE X ;如果X是字节单元,则回送值为1,即 BX←1;
;若是字单元,值为2,双字单元,值为4

属性操作符PTR

MOV BYTE PTR [BX],10 ;定义目的操作数为字节单元
MOV WORD PTR [SI],20 ;定义目的操作数为字单元

类型操作符LABEL

X LABEL BYTE ;X单元的类型定义为BYTE字节型,也可以定义为WORD字型、DWORD双字型等

基本汇编指令

数据、栈及查表

MOV传送指令

MOV传送指令是双操作数指令,SRC为源操作数、DST为目的操作数。
格式:MOV DST,SRC

MOV指令用法:

  • MOV 寄存器,寄存器 MOV AX, BX
  • MOV寄存器,立即数 MOV AX, 20
  • MOV 寄存器,存储单元 MOV AX, [BX]
  • MOV 寄存器,段寄存器 MOV AX, CS
  • MOV 存储单元,寄存器 MOV [DI], BX
  • MOV存储单元,立即数 MOV WORD PTR[BI][DI], 28
  • MOV 存储单元,段寄存器 MOV [BP], DS
  • MOV 段寄存器,寄存器 MOV DS, AX
  • MOV段寄存器,存储单元 MOV SS, [BX]

下面列出的指令是非法的:

MOV AX,BL           ;操作数类型不匹配
MOV 1234H , CX ;目的操作数不能是立即数
MOV [BX],[SI] ;两个操作数不能都是存储单元
MOV [BX],20 ;目的操作数属性不确定
MOV CS,AX ;CS不允许赋值
MOV DS,1000 H ;DS、ES、SS等段寄存器不允许用立即数赋值

数据交换指令XCHG

XCHG指令是双操作数指令,功能是将两个操作数的内容互换。要求必须有一个操作数是寄存器,而且两个操作数的属性必须一致。操作数不能为立即数。
格式:`XCHG OPR1,OPR2

XCHG  AX,BX     ;寄存器AX和BX的内容互换
XCHG [BX],AL ;AL寄存器的内容和字节型存储单元的内容互换
XCHG CX,X[SI] ;CX寄存器的内容和字型存储单元的内容互换

进栈和出栈指令

PUSH SRC
POP DST

查表转换指令XLAT

格式:XLAT

  • 使用 AL 的值作为偏移量,从查找表的基址 BX 开始计算内存地址 BX + AL
  • 将内存地址 BX + AL 处的字节值加载到 AL 中。

逻辑地址的获得

LEA有效地址传送指令(Load Effective Address)

格式:LEA 寄存器,存储单元
功能:将存储单元的有效地址传送给寄存器。

LEA  BX,TABLE
LEA DX,[BX]
LEA BX,COUNT[SI]

LDS(Load DS)数据段地址传送指令

格式:LDS 寄存器,双字存储单元
功能:将双字单元中保存的低字送入寄存器,高字传送给DS数据段寄存器。

LES(Load ES)附加段地址传送指令

格式:LES 寄存器,双字存储单元
功能:将双字单元中保存的低字送入寄存器,高字传送给ES附加段寄存器。

算术运算类指令

加法类

  • ADD加法指令
    格式:ADD DST,SRC
  • ADC带进位加法指令(Add with Carry)
    格式:ADC DST,SRC
    源操作数加上目的操作数再加上进位标志CF,结果放入目的操作数DST。
  • INC加1指令(Increase 1)
    格式:INC OPR
    不影响CF,但影响其它状态标志位。

减法类

  • SUB减法指令(Substract)
    格式:SUB DST,SRC
  • SBB带借位减法指令(Substract with Borrow)
    格式:SBB DST,SRC
    功能:目的操作数减去源操作数后再减去进位标志CF,结果放入目的操作数DST。
  • DEC减1指令(Decrease 1)
    格式:DEC OPR
    功能:将操作数OPR减1
  • NEG求补指令(Negative)
    格式:NEG OPR
    功能:将操作数求反加1。即求补操作,对正数的补码求补变为其负数的补码,对负数的补码求补变为其正数的补码。
    利用NEG指令可以求负数的绝对值。
  • CMP比较指令
    格式:CMP OPR1,OPR2
    功能:将两个操作数作相减运算,结果不回送,改变标志位。通常后跟条件转移指令,根据CMP比较之后标志位的值进行转移。

乘法类

  • MUL无符号数乘法指令
    (1)字节乘法
    格式:MUL SRC
    功能:(AX)←(AL)×(SRC)
    (2)字乘法
    格式:MUL SRC
    功能:(DX、AX) )←(AX)×(SRC)
  • IMUL带符号数乘法指令
    执行带符号数乘法指令时,系统将把操作数作为补码进行运算。
  • DIV无符号数除法指令
    (1)字节除法
    格式:DIV SRC
    功能:(AL)←(AX)/(SRC)的商 (AH)←(AX)/(SRC)的余数
    (2)字除法
    格式:DIV SRC
    功能:(AX)←(DX、AX)/(SRC)的商 (DX)←(DX、AX)/(SRC)的余数
  • IDIV带符号数除法指令

屏幕显示和键盘输入

DOS功能调用

键盘输入1个字符: 01号DOS功能调用
显示器输出1个字符: 02号DOS功能调用
AH=2
DL=字符
INT 21H
功能:输出DL中的一个字符到显示器的光标处。

键盘输入缓冲区: 0AH号DOS功能调用
键盘输入字符串
格式:AH=10
DS:DX=字节缓冲区首址
INT 21H
说明:定义缓冲区的第1个字节单元为允许输入的最大字符数,第2个单元为实际键入个数(由系统自动填入),从第3个单元开始存放键入字符。
功能:从键盘输入一串ASCII字符到缓冲区,用“回车”结束输入。若输入字符超过缓冲区能容纳的个数,则系统忽略此字符并响铃警告。

显示字符串: 09号DOS功能调用
显示字符串
格式:AH=9
DS:DX=字符串地址
INT 21H
功能:显示一个以“$”结尾的ASCⅡ码字符串。

返回DOS控制: 4CH号DOS功能调用