dx 汇编dec_常用汇编指令

汇编语言指令大致分为以下几类

> 一、传送类指令

> 二、算数运算类指令

> 三、位操作指令

> 四、串操作指令

> 五、控制转移类指令

> 六、处理器控制类指令

> 七、汇编指令伪指令

* * * * *

**一、传送类指令**

**1.数据传送指令**

**(1) MOV 目的操作数,源操作数**

`将源操作数送到目的操作数,目的和源的数的长度要相同,否则会长度不匹配`

**(2)XCHG 传送指令**

`XCHG 目的操作数,源操作数 //把源和目的操作数交换数值`

**2.有效地址传送指令LEA**

~~~

LEA 目的操作数,源操作数

把源操作数的偏移地址送目的操作数,

源操作数必须是一个内存操作数,

目的操作数必须是16位通用寄存器

~~~

**3.堆栈指针操作指令**

堆栈是一块特殊的存储器区域,这块区域是以先进后出的方式工作,系统为此提供了特殊的指针SP,和段寄存器SS

主要特点是:

(1)堆栈是以字方式操作的

**(2)压入堆栈**。

①先修改指针:`SP=SP -2`

②再存入一个字

**(3)弹出堆栈。**

①先弹出一个字

②再修改指针:`SP=SP +2`

**(4)入栈指令PUSH**

格式:PUSH 操作数

该指令为数据入栈指令

即将操作数指定的一个字节的内容传送至SP所指的栈顶

寻址方式有寄存器寻址(段寄存器SS除外)和存储器寻址,

不能用立即数作操作数。

该指令不影响标志位。

过程:

首先,堆栈`SP=SP-2`

然后,操作数的高位字节——>存入((SP)+1)单元中

操作数的低位字节——>送入(SP)

**(5)出栈指令:POP**

POP 操作数

将SP所指的栈顶内容传送至操作数指定的一个字。

**寻址方式有:**

寄存器寻址(段寄存器SS除外)和存储器寻址

不能用立即数作操作数。

该指令不影响标志位。

**过程:**

首先堆栈((SP)+1)单元字节——>操作数的高字节位,

(SP)单元字节——>操作数的低位字节。

然后`SP=SP-2`

**4.输入输出指令**

**(1)IN 输入指令**

~~~

IN AL,N ; (N)——>AL

IN AX,N ; (N+1:N)——>AX

IN AL,63H ; 将端口地址为63H的一个字节内容输入到AL

IN AX,55H ;将两个相邻端口地址58H和59H的16位数据输入到AX

~~~

**(2)OUT 输出指令**

~~~

OUT N,AL ;(AL)字节——>N端口地址的单元中

OUT N,AX ;(AX)字——>N+1和N端口地址的单元中

OUT 66H,AL ;将AL内容送端口地址66H的单元中

OUT 66H,AX ;将AX内容送66H和67H端口地址的单元中

~~~

**!注意:**

> 在汇编语言中,端口地址小于256(十六进制00H~FFH)时

> 可以直接在指令中写出端口地址

> 如果端口地址大于256,先将端口地址送入DX寄存器中,

> 然后在IN或OUT指令中用DX代表端口地址。

* * * * *

**二、算数运算类指令**

参加运算的可以是无符号数或带符号数,带符号的数以补码的形式存放或参与运算

**1.加法指令**

**(1)ADD 目的操作数,源操作数**

目的操作数+源操作数——>目的操作数

**(2)ADC带进位的加法指令**

ADC 目的操作数,源操作数

目的操作数+源操作数+CF——>目的操作数

**例子:**

~~~

MOV AH,0 ;0——>AH

MOV AL,92H ;92H——>AL

ADD AL,86H ;92H+86H=18H——>AL,CF=1

ADC AH,0 ;(AH)+0+CF=0+0+1=1——>AH,即01H=AH

~~~

**(3)INC 加|指令**

INC 操作数 //操作数加1,结果送操作数

操作数可以是任意一个8或16位的通用寄存器或存储单元,不能是立即数

指令中操作数当作无符号数时,主要用于计数器计数或修改指针地址的值。

如:

~~~

INC DI ;(DI)=DI+1

INC CX ;(CX)=CX+1

~~~

**说明**:除了指令INC对标志位CF不影响外,其它加法指令对标志位的影响如下

> ①CF:两个数相加,最高有效位有进位时,即字节运算超出无符号输的范围

> 0~255,字运算超出无符号数的范围0~65535时,CF=1,否则CF=0.

> 故两个无符号数相加时,可用CF值来判断是否超出了无符号数的表示范围

> 如果CF=1表示此无符号数加法运算结果发生了溢出。

> ②PF:运算结果以二进制数表示时,若"1"的个数为偶数时PF=1,否则PF=0

> ③AF:运算中D3向D4有进位时,AF=1,否则为0

> ④ZF:运算结果为0时,ZF=1;否则ZF=0

> ⑤SF:运算结果最高位为1时,SF=1,否则为0

> ⑥OF:当两个操作数的符号相同,而相加的结果的符号与操作数的符号相反时

> OF=1,否则OF=0。该标志位用来判断带符号数相加的溢出

**例如:**

~~~

ADD AL,30H ;(AH)+30H ——> AL

ADD AX,3000H ;(AX)+3000H ——> AX

ADD BX,[SI] ;(BX)+((SI))——>BX

~~~

**2.减法指令**

**(1)SUB**

`SUB 目的操作数,源操作数`

目的操作数=目的操作数-源操作数

**(2)SBB 带错位的减法指令**

`SBB 目的操作数,源操作数`

目的操作数=目的操作数-源操作数-CF

**(3)DEC 减1指令 格式:DEC 操作数**

`DEC DI ;DI=(DI)-1`

**(4)NEG 求补指令**

~~~

NEG 操作数 //0-操作数的内容后结果回送操作数

MOV DI,05H

NEG DI ;DI=0-(DI)=0-05H=0FBH

~~~

**(5)CMP 比较指令**

CMP 目的操作数,源操作数

执行时目的操作数与源操作数相减,只根据结果设置标志位

操作数均保持原值不变

**3.类型扩展指令**

为了解决操作数长度的匹配,有时需要把数据类型进行扩展。

主要有把字节扩展成字,把字扩展成双字

~~~

CBW:字节扩展成字

CWD:字扩展成双字

~~~

**例子:**

**正数的扩展**

~~~

MOV AL,52H

CBW ;执行指令后,AX=0052H

CWD ;执行指令后,DX=0000H,AX=0052H

~~~

**负数的扩展**

~~~

MOV AL,86H

CBW ;执行指令后,AX=FF86H

CWD ;执行指令后,DX=FFFFH,FF86H

~~~

**4.乘法指令**

~~~

MUL :无符号数乘法

IMUL:带符号数乘法

~~~

目的操作数必须是累加器,不必在指令中写出。

**例子:**

**无符号数乘法**

~~~

MOV AL,05H

MOV BL,06H

MUL BL //执行结果AX=30=001EH

~~~

**有符号数乘法**

~~~

MOV AL,-5

MOV BL,+6

IMUL BL //AX=-30=FFE2H

~~~

**5.除法指令**

**DIV:无符号除法**

~~~

SRC(源操作数)为字节时,AL=AX/SRC的商,AH=AX/SRC的余数

SRC为字时:AX=(DX,AX)/SRC的商,DX=(DX,AX)/SRC的余数

~~~

商和余数都是无符号数。

**IDIV:有符号除法**

操作同上类似,目的操作数必须是累加器AX和DX,不必写出。

* * * * *

**三、位操作指令**

~~~

AND 与运算.

or 或运算.

XOR 异或运算.

NOT 取反.

TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).

SHL 逻辑左移.

SAL 算术左移.(=SHL)

SHR 逻辑右移.

SAR 算术右移.(=SHR)

ROL 循环左移.

ROR 循环右移.

RCL 通过进位的循环左移.

RCR 通过进位的循环右移.

以上八种移位指令,其移位次数可达255次.

移位一次时, 可直接用操作码. 如 SHL AX,1.

移位>1次时, 则由寄存器CL给出移位次数.

如 MOV CL,04

SHL AX,CL

~~~

**四、串操作指令**

~~~

DS:SI 源串段寄存器 :源串变址.

ES:DI 目标串段寄存器:目标串变址.

CX 重复次数计数器.

AL/AX 扫描值.

D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.

Z标志 用来控制扫描或比较操作的结束.

MOVS 串传送.

( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )

CMPS 串比较.

( CMPSB 比较字符. CMPSW 比较字. )

SCAS 串扫描.

把AL或AX的内容与目标串作比较,比较结果反映在标志位.

LODS 装入串.

把源串中的元素(字或字节)逐一装入AL或AX中.

( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )

STOS 保存串.

是LODS的逆过程.

REP 当CX/ECX<>0时重复.,也就是直到CX=0时结束

REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.

REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.

REPC 当CF=1且CX/ECX<>0时重复.

REPNC 当CF=0且CX/ECX<>0时重复.

~~~

**五、控制转移类指令**

**1>无条件转移指令 (长转移)**

~~~

JMP 无条件转移指令

CALL 过程调用

RET/RETF过程返回.

~~~

**2>条件转移指令 (短转移,-128到+127的距离内)**

~~~

( 当且仅当(SF XOR OF)=1时,OP1

JA/JNBE 不小于或不等于时转移.

JAE/JNB 大于或等于转移.

JB/JNAE 小于转移.

JBE/JNA 小于或等于转移.

以上四条,测试无符号整数运算的结果(标志C和Z).

JG/JNLE 大于转移.

JGE/JNL 大于或等于转移.

JL/JNGE 小于转移.

JLE/JNG 小于或等于转移.

以上四条,测试带符号整数运算的结果(标志S,O和Z).

JE/JZ 等于转移.

JNE/JNZ 不等于时转移.

JC 有进位时转移.

JNC 无进位时转移.

JNO 不溢出时转移.

JNP/JPO 奇偶性为奇数时转移.

JNS 符号位为 "0" 时转移.

JO 溢出转移.

JP/JPE 奇偶性为偶数时转移.

JS 符号位为 "1" 时转移.

~~~

**3>循环控制指令(短转移)**

~~~

LOOP CX不为零时循环.

LOOPE/LOOPZ CX不为零且标志Z=1时循环.

LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.

JCXZ CX为零时转移.

JECXZ ECX为零时转移.

~~~

**4>中断指令**

~~~

INT 中断指令

INTO 溢出中断

IRET 中断返回

~~~

**六、处理器控制类指令**

处理器控制类指令只能完成对CPU的简单控制功能。

共有12条

**对标志位操作**

~~~

CLC(进位位置0指令)

CMC(进位位求反指令)

STC(进位位置为1指令)

CLD(方向标志置1指令)

STD(方向标志位置1指令)

CLI(中断标志置0指令)

STI(中断标志置1指令)

~~~

**同步控制**

~~~

WAIT(等待)

ESC(交权)

LOCK(封锁总线)

~~~

**其他**

~~~

NOP(无操作)

HLT(暂停)

~~~

* * * * *

**七、汇编指令伪指令**

~~~

DW 定义字(2字节).

PROC 定义过程.

ENDP 过程结束.

SEGMENT 定义段.

ASSUME 建立段寄存器寻址.

ENDS 段结束.

END 程序结束.

~~~

* * * * *

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值