看完这篇文章就不要再问我汇编了( 二 )


段寄存器(段地址)必须通过寄存器如AX寄存器进行立即数的初始化
MOV AL,‘E’
把立即数(字符E的ASC码)送到AL寄存器
MOV BX,TABLE
将TABLE的偏移地址(而不是内容)送到BX寄存器中 。其中为属性操作符,表示的是将其后的符号地址的值(不是内容)作为操作数
MOV AX,Y[BP][SI]
把地址为16d×(SS)十(BP)十(SI)十位移量Y的存储单元的内容送给AX寄存器
XCHG (): 交换指令
功能: 交换两个操作数的数据
语法: XCHG
格式: XCHG r1,r2 XCHG m,r XCHG r,m
交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同,可以是一个字节,也可以是一个字,也可以是双字 。寄存器不能是段寄存器,两个操作数也不能同时为内存变量 。XCHG指令不影响标志位 。
1. 不能同时都为内存操作数
2. 任何一个操作数都不能为段寄存器
3. 任何一个操作数不能为立即数
4. 两个操作数的长度不能不相等
XCHG指令的功能和MOV指令不同,MOV指令是一个操作数的内容被修改,而前者是两个操作数都会改变 。
PUSH,POP
功能: 把操作数压入或取出堆栈
语法: PUSH操作数POP 操作数
格式: PUSH r PUSH M PUSH data POP r POP m
PUSH F, POP F, PUSH A, POP A
功能:堆栈指令群
push寄存器:将一个寄存器中的数据入栈
pop寄存器:出栈用一个寄存器接收数据
push pop 只对字操作(不允许字节进栈)操作数长度为32位时进出栈为双字
如 push dl是不正确的,应该是push dx
PUSH导致SP减2而不是加2 。原因:栈在内存中实际存储结构是栈底在高地址,栈顶在低地址(x86中的栈是“满递减栈”,也就是sp指向的栈的内存单元中是满的,有内容的,而且push数据时,栈顶对应的地址是递减的)
不可以使用立即数寻址方式(其他版本允许)
pop不可以使用立即数寻址方式,使用段寄存器时不可使用CS段寄存器
SP是个寄存器,SP的内容是地址,sp指向栈顶,而栈顶的内容是什么与(sp)是什么无关 。
LEA,LDS,LES
功能: 取地址至寄存器
语法: LEA r,m LDS r,m LES r,m
LEA指令返回间接操作数的偏移地址,间接操作数可能使用一个或多个寄存器,
因此其偏移值是在运行时计算的 。地址传送指令load
地址传送指令获取存储器操作数的地址
LEA指令类似地址操作符的作用
跟的区别:
lea edi, var mov edi,var
LEA(Load): 有效地址传送指令
LEA指令在指令执行时计算出偏移地址
操作符在汇编阶段取得变量的偏移地址
无需在执行时计算、指令执行速度更快
LEA指令能获取汇编阶段无法确定的偏移地址
LEA指令是在执行过程中获得地址,当无法在汇编阶段获得地址时,就用LEA指令
LEA BX,[SI] ;BX处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允许位.
CLI 清中断允许位.
六、伪指令
DW 定义字(2字节).
PROC 定义过程.
ENDP 过程结束.
定义段.
建立段寄存器寻址.
ENDS 段结束.
END 程序结束.
寄存器在CPU中 。内存在内存条中 。前者的速度比后者快100倍左右 。
程序要求每条指令要么没有内存数据,要么在有一个寄存器的参与下有一个内存数据 。(也就是说,不存在只访问内存的指令) 。”