XCHG指令不允许的情况有以下四种:
1. 不能同时都为内存操作数 (存储器)
2. 任何一个操作数都不能为段寄存器
3. 任何一个操作数不能为立即数
4. 两个操作数的长度必须相等
指令格式:XCHG OPRD1,OPRD2
目的 源
功能:将一个字节或一个字的源操作数和目的操作数相交换。
交换指令可以在寄存器之间,寄存器与存储器之间进行,具体形式如下:
XCHG Reg,Reg 例如: XCHG AL,CL
XCHG Reg,Mem 例如: XCHG AX,BUF1
XCHG Mem,Reg 例如: XCHG COUNT[SI],BX
伪指令
伪指令语句告诉汇编程序如何进行汇编,但它没有对应的机器码
1. 段定义语句——用来定义一个逻辑段
XXXX(段名) SEGMENT [定位类型] [组合类型] [分类名]
XXXX ENDS
段名: 用户指定,确定了该逻辑段在存储器中的段基址,即高16位物理地址
对于堆栈段,组合类型STACK不可省略
2. 段分配语句——ASSUME
告诉汇编程序,4个段寄存器分别与哪些段有关。8086CPU系统中,存储器采用分段结构,每段容量<=64KB,用户可以设置多个逻辑段,但最多只允许4个逻辑段同时有效。
ASSUME CS: CODE DS: DATA SS: SSTACK ES: 附加段名
各段的段名必须是用SEGMENT 和ENDS 定义过的段名。
ASSUME 虽然能给各个段分配相应的段寄存器,但不能将段基址装入相应的寄存器,因此要给DS ES SS寄存器赋初值。同时,不允许用户对CS进行初始化,而是在程序装入后由操作系统对CS:IP赋初值。而对堆栈,除了SS寄存器外,还要给SP赋初值,设置了SS:IP也就设置了堆栈。
DATA SEGMENT ;数据段
X DB ?
Y DB ?
DATA ENDS
EXTRA SEGMENT ;附加段,用于字符串操作时,存放目的串
ALPHA DB ?
BETA DW ?
EXTRA ENDS
STACK SEGMENT PART STACK 'STACK' ;堆栈段 100个字节大小 TOP是SP的值
STAPN DB 100 DUP(?)
TOP EQU LENGTH STAPN ;TOP的值是STAPN的大小,100.
STACK ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE, DS:DATA
ES:EXTRA,SS:STACK
START: MOV AX,STACK ;STACK中存的是16位立即数,偏移地址
MOV SS,AX ;立即数和段寄存器之间无法直接交换数据
MOV SP,TOP ;堆栈指针,TOP的内容是100,STAPN的大小
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
RET
MAIN ENDP
CODE ENDS
END MAIN
设置堆栈的第二种方法:
STACK SEGMENT STACK
DW 50 DUP(?) ;50个字(100个字节)的存储单元,偏移地址00~99
TOP LABEL WORD ;TOP定义位字变量,偏移地址100
STACK ENDS
CODE SEGMENT
START:MOV AX,STACK
MOV SS,AX
MOV SP,OFFSET TOP ;TOP的偏移地址100给堆栈指针SP
CODE ENDS
END START
3. 过程定义语句——PROC RET ENDP
过程名 PROC [NEAR]/FAR 必须说明是近过程还是远过程 NEAR——段内调用(可省) FAR——段间调用
……
RET RET n 可以返回一个数
ENDP
4. 变量定义语句——数据定义语句,位数据项分配存储单元,即用一个符号与该存储单元联系
变量名 DB/DW/DD/DQ/DT 操作数
DUP(?)复制操作符 用来定义重复变量——如开辟一大块存储单元,规定了大小和初值(?表示不确定)
5.其他伪指令
EQU——等值
COUNT EQU 8
LABEL——定义类型
TOP LABEL WORD——将TOP定义为字变量
EVEN——对准
将下一条语句指向的地址调整为偶地址(8086从奇地址访问字单元时,存取一个字数据要进行两次操作)
ORG——指定起始偏移地址
PUBLIC EXTERN——模块链接指令