一.数据寻址方式
1.立即数寻址
立即数是一般的16进制常熟,以下MOV指令的寻址方式即为立即数寻址,立即数只能是源操作数: MOV BL,80H MOV AX,1090H
2.寄存器寻址
对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP
对于8位操作数,寄存器可以是AL,AH,BL,BH,CL,CH,DL,DH。
例如: MOV CL,DL MOV AX,BX
3.存储器寻址
(1)直接寻址:
如果没有特殊说明,直接寻址方式的操作数一般在存储器的数据段中,即隐含的段寄存器是DS
MOV BL,[1064H]
MOV AX,[109H]
假设DS=2000H上面两条指令的源操作数的物理存储单元分别为:
P1=DS10H+1064H=20000H+1064H=21064H
P2=DS10H+109H=20000H+109H=20109H
假如源操作数在别的段寄存器当中,可以段超越声明:
MOV AL,ES:[1064H]
(2)寄存器间接寻址:
寄存器中存储了操作数存储单元的物理地址 MOV AX, [SI] MOV [BX], AL
允许作为间接寻址的寄存器有: SI,DI,BX
(3)寄存器相对寻址
MOV [SI+10H], AX
MOV CX, [BX+COUNT]
(4)基址变址寻址
MOV [BX+DI], AX
MOV AH,[BP][SI]
(5)基址变址相对寻址
MOV AH, [BP+SI+1234H]
MOV [BP+SI+DATA],CX
MOV AX,[BX][SI]COUNT
二.数据传送指令
1.数据传送MOV指令
格式:MOV dst,src
作用:将源操作数传送给目的操作数
传送立即数时,不能直接用立即数给段寄存器CS,DS,SS,ES和控制寄存器IP,FLAGS赋值,其中CS任何情况都不能通过MOV指令赋值。
立即数可以先存放到通用寄存器当中,再将通用寄存器作为源操作数给目的段寄存器赋值,例如:
MOV DS 2000这样的写法是错误的,正确的写法应该是:
MOV AX 2000 ;先将2000存入AX寄存器中
MOV DS AX ;再将AX中的2000赋值给DS段存储器
2.堆栈操作指令
内存中高位是栈底,低位是栈顶。
(1)入栈指令PUSH
格式:PUSH src
作用:将源操作数放入堆栈段栈顶位置SP,并且SP指针-2(如果src是字节,则SP-1)
(2)出栈指令POP
格式:POP dst
作用:将堆栈指针指向的内存单元的数据弹出栈,并存放到目的操作数dst中,然后SP的值+2(如果弹出的是字节,则SP+1)
3.数据交换指令XCHG
格式:XCHG dst,src
作用:将目的操作数和源操作数的数据进行交换,二者不能同时为存储器。
4.目标地址传送指令
(1)取有效地址指令LEA
格式:LEA reg16,mem
作用:目的操作数必须是16位通用寄存器,源操作数是存储器操作数。将源操作数的有效地址,即16位偏移地址传送到目标寄存器中。
以下两条语句的作用是相同的:
LEA BX , BUFFER
MOV BX , OFFSET BUFFER
都是将变量BUFFER的偏移地址存入BX寄存器中
(2)地址指针装入DS指令LDS
格式:LDS reg16,mem32
作用:将一个32位的远地址指针作为源操作数,其中包括高16位的段地址和低16位的偏移地址。段地址传送到DS中,而偏移地址传送到目的操作数指定的寄存器中。
三.算数运算指令
1.加法指令
(1)加法指令ADD
格式:ADD dst,src
作用:将目的操作数dst与源操作数进行相加,结果保存在目的操作数dst当中。
(2)带进位的加法指令ADC
格式:ADC dst,src
作用:将目的操作数dst与源操作数以及CF进行相加,结果保存在目的操作数dst当中。
(3)加1指令INC
格式:INC dst
作用:让目的操作数dst的值加1,不改变CF的值
2.减法指令
(1)减法指令SUB
格式:SUB dst,src
作用:将dst作为被减数,src作为减数进行相减,结果保存在目的操作数dst当中。
(2)带借位的减法指令
格式:SBB dst,src
作用:将dst作为被减数,src作为减数进行相减,再减去CF,结果保存在目的操作数dst当中。
(3)减1指令DEC
格式:DEC dst
作用:将目的操作数dst的值减1,不改变CF的值
3.乘法指令
(1)无符号乘法指令MUL
格式:MUL src
作用:如果是字节乘法,则操作数src与AL进行相乘,结果保存在AX当中
如果是字乘法,则操作数与AX机型相乘,高位保存在DX当中,低位保存在AX当中
如果运算结果的高半部分结果为0,则CF=OF=0,否则CF=OF=1.
(2) 有符号乘法指令IMUL
格式:IMUL src
作用:如果是字节乘法,则操作数src与AL进行相乘,结果保存在AX当中
如果是字乘法,则操作数与AX机型相乘,高位保存在DX当中,低位保存在AX当中
如果高半部分仅仅是第半部分符号位的扩展,则CF=OF=1,否则CF=OF=0.
4.除法指令
(1)无符号除法指令DIV
格式:DIV src
作用:规定被除数的长度是除数的两倍
字节除法:被除数在AX当中而src作为除数进行除法运算,结果的商保存在AL当中,余数保存在AH当中。
字除法:被除数在DX:AX当中而src作为除数进行除法运算,结果的商保存在AX当中,余数保存在DX当中。
(2)有符号除法指令IDIV
格式:IDIVL src
作用:运算方法与DIV一致,IDIV指令对非整数商舍去尾数,而余数的符号总是与被除数的符号相同。
四.位操作运算指令
1.逻辑运算指令
逻辑运算指令的目的操作数可以是寄存器或存储器,源操作数可以是立即数,寄存器或存储器,但是目的操作数和源操作数不能同时位存储器。
(1)逻辑与指令AND
格式:AND dst src
作用:将目的操作数与源操作数进行按位与运算,结果保存在目的操作数当中。
(2)逻辑或指令OR
格式:OR dst src
作用:将目的操作数与源操作数进行按位或运算,结果保存在目的操作数当中。
(3)逻辑异或指令XOR
格式:XOR dst src
作用:将目的操作数与源操作数进行按位异或运算,结果保存在目的操作数当中。
(4)逻辑非指令NOT
格式:NOT dst src
作用:将目的操作数与源操作数进行按位非运算,结果保存在目的操作数当中。
2.移位指令
(1)逻辑左移指令SHL
格式:SHL dst 1/CL
作用:将目的操作数左移1位或左移CL中存的位数。
(2)逻辑右移指令SHR
格式:SHL dst 1/CL
作用:将目的操作数右移1位或右移CL中存的位数。