声明:博主原创,禁止转载。邮箱:qxlxi@qq.com测试
寻址特色:spa
计算机的指令一般包含操做码和操做数部分。3d
Mov al,32指针
当即数只能做源操做数,不能做目的操做数。(遇到A-F开头的数字出如今指令中时,要加上一个数字0 Mov AX,0FF00H)blog
在寄存器寻址方式下,操做数包含在寄存器中,内存
对于16位操做数,AX.BX CX DX SI DI SP BPci
对于8位操做数,则用寄存器AH AL BH BL CH CL DH DL字符串
MOV DX,AX同步
注意:源操做数的长度必须与目的操做数一致字符串处理
默认使用的段寄存器为数据段寄存器DS
MOV AX,[2000]
基址寄存器BX BP 变址寄存器SI DI
BX、SI、DI 默认数据段中
BP 默认堆栈段中
MOV BX,[SI]
MOV COUNT[SI]
机制寄存器(BX、BP)和变址寄存器(SI、DI)
MOV AX,[BX][SI]
Bx为寄存器时,使用DS作段寄存器
BP为寄存器时,使用SS作段寄存器
有关[]须要注意的就是
通用数据传送指令
指令格式 MOV 目的、源
指令功能:将源操做数(一个字节或一个字)传送到目的操做数
例如:mov al,10
Cs不能作目的操做数
Mov指令容许在cpu的寄存器之间、存储器和寄存器之间。也能够将当即数送到寄存器或存储器中,Ip寄存器不能作源操做数或目的操做数。目的操做数也不容许用cs寄存器 另外,除了源操做数外,两个操做数中必须有一个是寄存器。但不能都是段寄存器。Mov指令不能再两个存储单元之间直接传送数据。也不能在两个段寄存器之间直接传送数据。
指令格式:push 源
指令功能:将源操做数推入堆栈
源操做数能够是16位通用寄存器,端寄存器或存储器中的数据字,但不能是当即数。堆栈区的段地址由SS段寄存器的内容肯定,堆栈的最大容量为64K,既一个段的最大容量。堆栈指针SP始终指向栈顶。
执行push sp>sp-2
指令格式:pop 目的
指令功能:把当前sp所指向的堆栈顶部的一个字送到指定的目的操做数中。
目的操做数能够是16位通用寄存器 段寄存器 或存储单元 但cs不能作目的操做数,每执行一次出现操做,sp>sp+2
指令格式:XCHG 目的 源
指令功能:把一个字或字节的源操做数和目的操做数相互交换。
交换能够在寄存器之间,寄存器与存储器之间进行,但段寄存器不能做为操做数,也不能直接交换两个存储单元中的内容。
XCHG AX,[BX+200H]
输入输出指令
输入输出指令用来完成i/o端口与累加器之间的数据传送,指令中给出io端口地址值。当执行输入指令时,把指定端口中的数据读入累加器中,当执行输出指令时,则把累加器中的数据写入指定的端口中。
IN AL,端口地址
8位-Al 16位AX.
IN指令有两种格式,第一种格式 端口地址00-FF直接包含在IN指令里寻址256个端口,因为8086cpu能够直接访问地址0000-FFFFH的64k个i/o端口,当端口地址大于FFH,必须使用第二种寻址方式,先将端口号送入DX寄存器执行输入操做。
OUT 端口地址,al
指令功能:将AL中的一个字节写到一个8位端口,或把AX中的一个字写到一个16位端口。
这是一类用于传送地址码的指令,用来传送操做数的段地址和偏移地址。
指令格式:LEA 目的,源
指令功能:取源操做数地址的偏移量,并把她传送到目的操做数所在的单元
LEA指令要求源操做数必需要是存储单元,目的操做数必须是一个除段寄存器以外的16位寄存器。
LEA BX,[SI]
指令格式:LDS 目的,源
指令功能:从源操做数指定的存储单元中,取出一个变量的4个字节地址指针,送进一对目的寄存器,其中 前两个字节送到指令中指定的目的寄存器中,后两个字节送到DS寄存器。目的操做是16位寄存器,一般使用SI寄存器,可是不能使用段寄存器。
指令格式:LES 目的,源
指令功能:这指令与LDS指令的操做接本相同,所不一样的是要将源操做数地址指针中的段地址部分送到ES寄存器中,而不是DS寄存器,目的操做数经常使用DI寄存器。
格式指令:LAHF
指令功能:把寄存器SF ZF AF PF CF分别传送到AH寄存器对应位置上
执行这条指令后,标志位自己不受影响。AH相同于8080的标志寄存器,从而对8080程序进行切换
指令格式:SAHF
指令功能:把AH内存存入标志寄存器,这条指令与LAHF的操做相反,它把寄存器AH中的送入标志寄存器。高位标志OF DF TF不受影响
指令格式:PUSHF
指令功能:把整个标志寄存器的内容推入堆栈,同时修改堆栈指针,使Sp<-sp-2
注意:这条指令执行后对标志位无影响。
指令格式:POPF
指令功能:把当前堆栈指针Sp所指的一个字,传送给标志寄存器FLAGS并修改堆栈指针 Sp<-sp+2
注意点:成对的使用pushf和popf这两条指令,可对标志寄存器进行保护和恢复经常使用在过程(子过程)调用和中断程序的开头与结尾处,对进行过程调用或发生中断时主程序的状态进行保护。
算数运算指令可处理4种类型的数,无符号二进制整数,带符号二进制整数、无符号压缩十进制整数和无符号非压缩十进制整数。
例如:
非压缩十进制数58
压缩十进制数0101 1000B
非压缩十进制数 0000 0101B 和 0000 1000B
指令格式:ADD 目的,源
指令功能:将源操做数和目的操做数相加,结果送回到目的操做数中
既 目的ß- 源+ 目的
指令格式:ADC 目的,源
指令功能:目的ß- 源+目的+CF
注意:这两条指令的源操做数能够是寄存器 存储器或当即数
目的操做数只能用寄存器和存储单元
Add 和 Adc指令影响的标志位Cf Of Pf Sf Zf Af
指令格式:INC 目的
指令功能:对目的操做数加1 结果送回到操做数
目的ß- 目的+1
该指令主要用在循环程序中,对地址指和循环计数器等进行修改。指令执行后影响AF OF PF SF ZF 但进位标志CF 不影响
注意:因为该指令只有一个操做数,若是要是内存单元的内容增1 则程序中必需要说明存储单元是字仍是字节的符号
INC BYTE PTR[BX]
BYTE à说明是字节
WORD à说明是字
指令格式:AAA
指令功能:运算结果以存在AL的状况下,用此指令将AL寄存器中的运算结构调整为1位非压缩十进制数,仍保留在AL中,AF=1表示有进位
指令格式:DAA
指令功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。相加后的数必须在AL中,才能使用DAA指令。
指令格式:SUB 目的 源
指令功能:将目的操做数减去源操做数,结果送回到目的操做数
目的ß- 目的-源
SUB AX,BX
指令格式:SBB 目的 源
指令功能:与SBB相似,只是在两个操做数相减后,还要减去进位/借位CF的值
SBB AL,CL Alß- AL-CL-CF
指令格式:DEC 目的
指令功能:对指定的目的操做数减1 结果送回到此操做数。
DEC BX; BXß- Bx-1
指令格式:NEG 目的
指令功能:对目的操做数取负,既用零减去操做数,在把结果送回到目的操做数
NEG AX; 将Ax中的数取负(正数变负数,负数变整数)
指令格式:CMP 目的,源
指令功能:将目的操做数减去源操做数,但结果不给目的操做数。仅将结果反映在标志位上。
指令格式:MUL 源
指令功能:把源操做数和累加器中的数都当成无符号数 而后将两数相乘,源操做数能够是字节或字
字节 AXß-- AL*源
字 DX AXß- AX*源
当源操做数是存储单元时,必须在操做数前加BYTE或WORD说明是字仍是字节
字节
字
指令格式:IMUL 源
指令功能:把源操做数和累加器中的数都做为带符号数,进行相乘
字节: AXß- AL*源
字: DX AXß- AX*源
指令格式:AAM
指令功能:对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,使得在AX中获得的正确的非压缩十进制数的乘积。
调整过程:把AL寄存器内容除以10,商放在AH中,余数在AL中
AHß-AL/10所得的数
ALß-AL/10所得的余数
指令执行后 将影响ZF SF PF 但AF CF OF无定义
指令格式:DIV 源
指令功能:对两个无符号二进制数进行除法操做。
ALß-AX/源的商
AHß-AX/源/的余数
指令格式:IDIV 源
指令功能:该指令执行的操做与DIV相同,单操做数必须带符号数的商和余数也都是带符号数的。
指令格式:CBW
指令功能:把寄存器AL中的字节的符号位扩充到AH的全部位
AL D7=0 就将这个0拓展到AH中
AL D7=1 1拓展到AH中
CWB执行后不影响标志位
指令格式:CWD
指令功能:把AX中的字的符号扩充到DX中
AX D15 = 0 则DX = 0000H
AX D15 = 1 则DX = 1111H
CWD执行后不影响标志位
指令格式:AAD
指令功能:在作除法前,把BCD码转换成二进制数
指令格式:NOT 目的
指令功能:将目的操做数求反,结果送回到目的操做数
目的ß- 目的
存储器数要说明是什么类型字节仍是字
执行后,均将CF和OF清零。SF和PF反映操做结果。AF未定义 源操做数不变
指令格式:AND 目的,源
指令功能:对两个操做数进行按位逻辑与操做,结果送回到目的操做数
目的ß- 目的∧源
主要用于使操做数的某些位保留 和1 相与
指令格式:OR 目的,源
指令功能:对两个操做数进行按位逻辑或操做,结果送回到目的操做数
目的ß-目的∨源
指令格式:XOR 目的,源
指令功能:对两个操做数进行按位逻辑异或运算,结果送回到目的操做数
目的ß-目的^源
指令格式: TEST 目的,源
指令功能:对两个操做数进行逻辑与操做,并修改标志位 但不会送结果。
SAL算数左移指令(Shift Arithmetic Left)
指令格式: SAL 目的,计数值
SHL逻辑左移指令(Shift Logic Left)
指令格式:SHL 目的,计数值
左移 最低位补0 最高位进入CF
若只须要移动一位,可直接将指令中的计数值置1 要是移位次数大于1
应该先将移位次数送入CL寄存器,再把CL放在指令的计数值位置上
指令格式:SHR 目的,计数值
指令功能:对目的操做数中各个进行右移,最低位进入CF 最高位补0
指令格式:SAR 目的,计数值
指令功能:其余和SHR相同 最低位进入CF 可是最高位保持不变 而不是补0
指令格式:ROL 目的,计数值
指令格式:ROR 目的,计数值
指令格式:RCL 目的,计数值
指令格式:RCR 目的,计数值
MOV字符传送指令
CMPS字符串比较指令
SCAS字符串扫描指令
LODS数据串转入指令
STOS数据串存储指令
标志操做指令
指令助记符 |
操做 |
指令名称 |
CLC |
CFß-0 |
进位标志清0(Clear Carray) |
CMC |
CFßCF |
进位标志求反(Complement Carray) |
STC |
CFß1 |
进位标志置1 (Set Carray) |
CLD |
DFß0 |
方向标志位清0(Clear Direction) |
STD |
DFß1 |
方向标志位置1(Set Direction) |
CLl |
IFß0 |
中断标志位清0(Clear interrupt) |
STI |
IFß1 |
中断标志位置1(Set Interrupt) |
外部同步指令
ESC换码指令
Wait等待指令
LOCK封锁总线指令
停机指令和空操做语句
HLT停机指令
NOP空操做和无操做指令