
数据传输指令
通用数据传送(对标志位没有影响)
一般数据传送指令
格式:MOV dest,src
将str(源操作数)送到dest(目的操作数)中
如:MOV AL,BL
注意:
- 两个操作数字长必须相同
- 两个操作数不能同时为存储器操作数
- 两个操作数不能同时为段寄存器( CS,DS,ES,SS)
- 如果源操作数为立即数,目标操作数不能是段寄存器
如(都是错的)
MOV AL,BX ; 两个操作数不等字长
MOV [BX][BP],Bx ;没有基址,基址寻址方式
MOV DS,1000H ;源操作数为立即数,目标操作数不能是段寄存器
MOV [1200],[SI] ; 两个操作数不能同时为段寄存器
堆栈操作指令
原则:
- 先进后出
- 以字为单位:两个字节
压栈指令:
- 格式:PUSH 16位寄存器或者存储器两个单元
出栈指令:
- 格式:POP 16位寄存器或者存储器两个单元
PUSH指令执行过程:
- SP=SP-2;
- SP+1,存入高字节
- SP,存入低字节
如:设AX=1234H,SP=1200H;执行PUSH AX
指令后堆栈取的状态:
SP=12FEH
(12FFH)=12H
(12FEH)=24H
POP指令执行过程:
SP:弹出低字节
SP+1:弹出高字节
SP=SP+2;
注意:
- 操作数必须为16位
- 操作数可以是寄存器,存储单元。不能是立即数
交换指令
XCHG REG,MEM/REG
注意:
- 两个操作数必须有一个是寄存器操作数
- 不准使用段寄存器(DS,ES,CS,SS)
如:
XCHG AX,BX
XHNG [2000],CL
查表指令
格式:XLAT
说明:用BX表示表格首地址,AL的内容表示表内偏移量。BX+AL得到要查找元素的偏移地址
操作:将BX+AL所指的单元里的内容放到AL中
字位扩展指令
将有符号数的符号位扩展到最高位
格式:CBW(扩展到一个字节)
操作:将AL的内容扩展到AX
规则:
- 若最高位为1,则AH=FFH
- 若最高位为0,则AH=00F
格式:CWD (将一个字节扩展到一个字)
操作:将AX的内容扩展到DX AX
- 若最高位为1,则DX=FFFFH
- 若最高位为0,则DX=0000F
地址传送指令
LEA指令
操作:将变量的16位偏移地址写入目标寄存器
当程序中用符号表示内存偏移地址时,必须使用该指令
格式:LEA REG,MEM
指令要求 :
- 源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器(BX,BP,DI,SI)
MOV和LEA指令对比。
假设声明一个偏移地址的变量i,其里面的内容为5,则:
MOV AL i ;AL=5
MOV BX i; ;BX=i;
标志传送指令
指令;LAHF
操作:将FLAGS的低八位转入AH中
指令:SAHF
操作:将AH转入FLAGS中
输入输出指令
功能:
- 从端口地址读入到累加器或者将累加器的值输出到端口中
格式:
- 输入指令:
IN acc,PORT
- 输出指令:
OUT PORT,acc
PORT :端口地址
acc:累加器:AL或者AX
寻址方式:
直接寻址:
- 端口地址为8位,指令中直接给出端口地址 。可以寻256个端口
间接寻址:
- 端口地址为16位。指令中的端口地址必须放在DX中,可以寻址64K
IN AX,80H ;从80H端口读入16bit的数据到AX
MOV DX,2400H
IN AL,DX ;从2400H端口读入8bit的数据到AL中
OUT 35H,AX ;将16bit的数据写到35H端口
OUT AX,35H ;格式错误
算数运算指令(大多数对状态标志位产生影响)
加法运算指令
- 普通加法指令:ADD
- 带进位的加法指令:ADC
- 加1指令:INC