快速查阅方法:CTRL+F搜索
快速查阅方法:CTRL+F搜索
快速查阅方法:CTRL+F搜索
选择寻址方式有两条原则:第一实用,第二有效。
;MOV 目的操作数,源操作数
MOV AH,80H ;把80H送入AH中
MOV AX,BX
MOV AX,[2000H] ;表示该指令表示从数据段的 2000H 单元读出一个字送入 AX。
MOV ES:[2000H] ;该指令表示从附加段的 2000H 单元读出一个字送入 AX。
MOV BX,1200H;把1200H送给BX
MOV AX,[BX] ; 把BX中存放的地址中存放的数据送给AX
代码中BX存入1200H的地址,然后送数据时,因为1200H存放的是8位的数据,所以把1200H的值赋给AL,1201H的值赋给AH。
MOV AX 1200H
MOV DS AX
MOV BX 2000H
MOV AL [BX]5 ;这一行等效为 MOV AL [BX+5] 表示把BX+5地址的数据送给AL
MOV SI 1100H
MOV BX,SI
MOV AX,[SI+BX] ; 把2200H的数据给AL,2201H的数据给AH。
MOV DI 1100H
MOV BP,DI
MOV AL,[BP+DI+5];或者写为[BP][DI]5 把2205H的数据给AL
MUL BL ; 执行了AL * BL ->AX的操作
除标志传送指令外,其它指令的执行对标志位不产生影响
MOV DEST SRC ; DEST <- SRC
MOV [BX][BP],BX ; 这个例子是错的,因为BX BP是俩个基地址寄存器,从寻址方式的角度说是错的。
XCHG DEST,SRC ;把DEST操作数与SRC操作数的内容相互交换
PUSH SRC ; SP<-SP-2,[SP] <-SRC,就是把栈顶指针上移俩个字节,然后把源操作数压入堆栈。
POP DEST ; [SP] ->DEST,SP<-SP+2,把栈顶内容弹到目的操作数中,然后堆栈的栈顶指针下移俩个字节。
XLAT ; AL<-DS:[BX+AL].BX的内容作为数据段中数据表的首地址,AL内容为查表的项数,将其对应的字节单元的值再送给AL。
CBW;若最高位为0,则AH=00H,若最高位为1,则DX=FFFFH。
CWD;若最高位为0,则DX=0000H,若最高位为1,则DX=FFFFH。
LEA REG,MEM; 把源操作数的有效地址送到指定的寄存器。
LDS REG,MEM
LES REG,MEM
隐含操作数AH:
LAHF 标志寄存器低8位送AH
SAHF AH送标志寄存器低8位
隐含操作数FLAG
POPF 将标志寄存器的内容压栈
PUSHF 将栈顶内容送标志寄存器
注:SAHF和POPF指令将直接影响标志位,而其他传送均不会对标志位产生影响。
专门面向IO口操作的指令
指令寻址方式:根据端口地址码的长度,指令具有两种不同的端口地址表
现形式。
直接寻址:端口地址为8位时,指令中直接给出8位端口地址;寻址256个端口。
间接寻址:端口地址为16位时,指令中的端口地址必须由DX指定;
可寻址64K个端口。
IN acc PORT ;
OUT PORT acc ;
算术运算指令的执行大多对状态标志位会产生影响
如果是存储器操作数,需要声明操作数的字长(用PTR运算符)
ADD OPRD1,OPRD2; OPRD1+OPRD2---->OPRD1
ADD OPRD1,OPRD2, OPRD1+OPRD2 + CF --->OPRD1
INC OPRD ;OPRD + 1 OPRD不能是段寄存器,不能是立即数
SUB PORD1 PORD2 ;PORD1 - PORD2 -->PORD1
SBB PORD1 PORD2 ;PORD1 - PORD2 - CF --->PORD1
DEC PORD1 ; PORD1 - 1 ; 指令对操作数的要求及对标志位的影响与INC相同
NEG PORD ; 0 - PORD
CMP PORD1 PORD2 ; PORD1 - PORD2
乘除运算均采用隐式操作数
乘法命令
; 无符号乘法,PORD不能是立即数 若PORD是字节数AL * PORD - > AX
;若PORD是16位数AX * PORD -> DXAX
MUL PORD
MUL BYTE PRT[BX]
;有符号乘法
;指令格式及对操作数的要求与MUL指令相同。
IMIUL PORD
除法命令
DIV PORD
IDIV PORD
概述:
与指令AND:
或指令OR
非指令NOT
异或指令XOR
测试指令TEST
AND PORD1 PORD2
OR PORD1 PORD2
NOT PORD
XOR PORD1 PORD2
TEST PORD1 PORD2
概述:
非循环移位指令
指令执行后影响CF PF ZF SF OF位
;算数移位指令
SAL/SAR DEST,CNT; 用于有符号数据的移位,左移1相当于乘2,右移1相当于除以2
;逻辑移位指令
SHL/SHR DEST,CNT;用于无符号数据的移位,左移1相当于乘2,右移1相当于除以2
循环移位指令
把CF作为目的操作数的扩展位
指令执行后影响CF PF ZF SF OF位
ROL DEST,CNT ;左循环移位
ROR DEST,CNT ;右循环移位
RCL DEST,CNT ;带进位左循环移位
RCR DEST,CNT ;带进位右循环移位
概述:
串指令的执行要确定串的首地址,串区域,串长度,串方向
REP MOVS/LODS/STOS; 无条件重复前缀当CX不为0时,则重复指令,常用于传送类指令前
REPE MOVS/LODS/STOS; 有条件重复类指令当CX不为0且CF=1,则重复执行
REPNE/REPNZ;;不相等重复前缀;若CX=0或ZF=1则推出重复炒作循环,若CX不为0且ZF=0则执行指定串操作一次
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT
例子:判断俩个字符串是否相等
LEA SI,MEM1
LEA SI,MEM2
MOV CX,200
CLD
REPE CMPSB
JZ STOP; 判断zf=1,如果等于1,说明是cx=0,则串相同
DEC SI; 指向存放不相等数据的位置
MOV AL,[SI]
MOV BX,SI
STOP:HLT
常用于再指定存储区域中寻找某个关键字;与CMPS的操作相似,但是源操作数变为了AX或者AL,指令用DI指向的串操作元素与AL/AX寄存器的内容比较。
只改变了IP的值而改变了指令的执行顺序,叫段内转移;若同时改变CS与IP的值而改变了指令的执行顺序,则为段间转移。
JMP OPRD
段内转移
JMP DISP8; IP=IP+8 段内短程转移,目标地址与JMP指令处所在地址的距离再-128到127内
JMP DISP16;IP = IP+16 段内进程直接转移,目标地址与JMP指令处所在地址的距离再-32768到32767内
JMP REG/MEM IP的内容由寄存器或存储单元提供,目标地址与JMP指令处所在地址的距离再-32768到32767内
段间转移
JMP ADDR ; 段间直接转移
JMP MEM ; 段间间接转移
JMP DWORD PTR[BX]
CX或标志为ZF进行测试,确定是否循环
指令格式 | 执行操作 |
---|---|
LOOP OPRD | CX= CX-1;若CX不为0,则循环 |
LOOPNZ/LOOPNE OPRD | CX=CX-1,若CX不为0且ZF=0,则循环 |
LOOPZ/LOOPE OPRD | CX = CX-1,若CX不为0且ZF=1,则循环 |
有点像函数
段内调用指令中直接给出子过程的入口地址,段间调用则由内存获得子程序的入口地址
CALL NEAR PTR OPRD;
CALL FAR PTR OPRD ;
;例子
;段内调用
CALL TIMER ; 直接调用
CALL WORD PTR[SI] ;间接调用
;段间调用
CALL FAR TIMERE;直接调用
CALL DWORD PTR[SI];间接调用
INT n 中断指令
IRET 中断返回指令
NOP指令 不操作,调试程序时用它占用一定的存储单元以便再正式运行时用其他指令取代
HLT 停机指令 使CPU处于暂停状态
WAIT 等待指令
LOCK 总线封锁指令
ESC 交权指令