8086汇编:基本汇编指令
伪指令
段定义伪指令
段定义伪指令可用来定义各种类型的段。
格式如下:
段名 SEGMENT [类型参数] |
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 |
如果用在代码段中,可从指定的单元开始存放并执行指令。
例如从代码段的100H开始执行:
ORG 100H |
操作符
回送偏移地址值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 ;操作数类型不匹配 |
数据交换指令XCHG
XCHG指令是双操作数指令,功能是将两个操作数的内容互换。要求必须有一个操作数是寄存器,而且两个操作数的属性必须一致。操作数不能为立即数。
格式:`XCHG OPR1,OPR2
XCHG AX,BX ;寄存器AX和BX的内容互换 |
进栈和出栈指令
PUSH SRC
POP DST
查表转换指令XLAT
格式:XLAT
- 使用
AL
的值作为偏移量,从查找表的基址BX
开始计算内存地址BX + AL
。 - 将内存地址
BX + AL
处的字节值加载到AL
中。
逻辑地址的获得
LEA有效地址传送指令(Load Effective Address)
格式:LEA 寄存器,存储单元
功能:将存储单元的有效地址传送给寄存器。
LEA BX,TABLE |
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功能调用