汇编-指令系统

 

3-指令系统

   指令系统分为如下六个功能组:

(1)       数据传送

(2)       算术运算

(3)       逻辑运算

(4)       串操作

(5)       程序控制

(6)       处理器控制

 

指令由四部分组成:标号、指令、操作数和注释。

 

对于每条指令,注意以下几点:

(1)       指令的功能

(2)       适用于指令的操作数寻址方式

(3)       指令对标志的影响

(4)       指令的长度和执行时间

 

一、指令列表

 

指令助记符

指令格式

指令说明

例子

传递指令:MOV

MOV DST,SRC

此指令把一个字节或一个字从源操作数SRC送至目的操作数DST(8位或16位)

MOV AX,BUFFER

MOV AX,CS

交换指令:XCHG

XCHG OPRD1, OPRD2

此指令把操作数OPRD1的内容与OPRD2 的内容交换(8位或16位)

XCHG AL, AH

XCHG SI, BX

传送有效地址指令:LEA

LEA REG, OPRD

该指令把操作数OPRD的有效地址传送到操作数REG中。

LEA AX, BUFFER

LEA DX, [BX+3]

LEA SI, [BP+DI+4]

LDS

LDS REG,OPRD

该指令把操作数OPRD中所含的一个32位地址指针的段值部分送到数据段寄存器(DS)中,将偏移部分送到指令给出的通用寄存器REG中。

LDS DI,[BX]

LDS SI,FARPOINTER

LES

LES REG, OPRD

该指令把操作数OPRD中所含的32位地址指针的段值部分送到附加段寄存器ES中,把偏移部分送到指令给出的通用寄存器REG中

 

PUSH/POP:堆栈操作指令,进栈和出栈

 

 

PUSH DS

POP DI

LAHF/SAHF

 

该条指令把标志寄存器的低8位传送到寄存器AH的指定位中;或者从寄存器AH中把指定位送至寄存器的低8位中。

 

PUSHF/POPF

 

该条指定把标志寄存器的内容压入堆栈;或者把当前堆栈顶的两个字节传送到标志寄存器中。

 

CLC/STC/CMC:

进位标志位操作指令

 

清除;置位;取反

 

CLD/STD:方向标志位操作指令

 

清除;置位

 

CLI/STI:中断标志位操作指令

 

清除;置位

 

普通加法指令:ADD

ADD OPRD1, OPRD2

OPRD1ßOPRD1+OPRD2

 

带进位加指令:

ADC

ADC OPRD1,OPRD2

OPRD1ßOPRD1+OPRD2+CF

 

加1指令:

INC

INC OPRD

OPRD<-OPRD+1

 

减法指令:

SUB

SUB OPRD1,OPRD2

OPRD1<-OPRD1 – OPRD2

 

带借位减法指令:

SBB

SBB OPRD1,OPRD2

OPRD1<-OPRD1-OPRD2-CF

 

减1指令:

DEC

DEC OPRD

OPRD<-OPRD-1

 

取补指令:

NEG

NEG OPRD

OPRD<-0-OPRD

 

比较指令:

CMP

CMP OPRD1,OPRD2

OPRD1-OPRD2运算结果不存放到OPRD1,而是影响CF,ZF,SF,OFAF和PF

 

无符号数乘法:MUL

MUL OPRD

如果OPRD是字节操作数,则把AL中的无符号数与OPRD相乘,16位结果送到AX中;

如果OPRD是双字节数,则把AX中的无符号数与OPRD相乘,32位结果送到DX和AX中,其中DX含有高16位,AX含有低16位。

 

有符号数乘法:

IMUL

IMUL OPRD

把乘数和被乘数都当成有符号,其他与MUL类似

 

无符号数除法指令:DIV

 

DIV OPRD

如果OPRD是字节操作数,则把AX中的无符号数处理OPRD,8位的商送到AL中,8位的余数送到AH中;如果OPRD是双字节数,则把DX(高16位)和AX(低16位)中的无符号数除以OPRD,16位的商送到AX中,16位余数送到DX中。

 

有符号数除法:

IDIV

IDIV OPRD

把除数和被除数都当成有符号的,其他与DIV同。

 

字节转换成字指令:CBW

CBW

将寄存器AL中的符号扩展到寄存器AH中。即若AL的最高有效位为0,则AH=0;若AL的最高有效位为1,则AH=FFH

MOV AX,3487H

CBW

则AX=FF87H

字转换成双字指令:

CWD

CWD

把寄存器AX中的符号位扩展到寄存器DX中。若AX的最高有效位为0,则DX=0;若AX的最高有效位为1,则DX=FFFFH

MOV AX, 4567H

CWD

 

则AX=4567H, DX=0

逻辑否:

NOT

NOT OPRD

把操作数OPRD取反,然后送回OPRD

NOT AX

逻辑与:

AND

AND OPRD1, OPRD2

对两个操作数进行按位逻辑“与”运算,结果送到目的操作数OPRD1

MOV AL,34H

AND AL,0FH

则AL=04H

逻辑或:

OR

OR OPRD1,OPRD2

对两个操作数进行按位逻辑“或”运算,结果送到目的操作数OPRD1中

 

逻辑异或:

XOR

XOR OPRD1,OPRD2

对两个操作数进行按位逻辑“异或”操作,结果送到目的操作数OPRD1中。

 

测试指令:

TEST

TEST OPRD1, OPRD2

和AND指令类似,把两个操作数进行按位“与”,但结果不送到操作数OPRD1中,仅仅影响标志。

TEST AL, 01000100B

如果位2和位6均为0,则执行上述指令后,ZF置为1;否则为0

算术左移SAL和逻辑左移SHL

SAL OPRD, m

SHL OPRD, m

把操作数OPRD左移m位,每移动一位,右边用0补足一位,移出的最高位进入标志位CF

 

算术右移:

SAR

SAR OPRD, m

将操作数右移m位,同时每移一位,左边的符号位保持不变,移出的最低位进入标志位CF

 

逻辑右移指令:

SHR

SHR OPRD, m

将操作数右移m位,同时每移一位,左边用0补足,移出的最低位进入标志位CF

 

ROL

ROR

RCL

RCR

 

左循环移位指令

右循环移位指令

带进位左循环移位指令

带进位右循环移位指令

 

 

 

二、堆栈指令说明

堆栈操作指令说明:

在8086/8088系统中,堆栈是一段RAM区域,称为栈底的一端地址较大,称为栈顶的一端地址较小。堆栈的段值在堆栈段寄存器SS中,堆栈指针寄存器SP始终指向栈顶。

在8086/8088系统中,进出堆栈的数据均以字节为单位。

堆栈的具体用途如下:

(1)       现场和返回地址的保护

(2)       寄存器内容的保护

(3)       传递参数

(4)       存储局部变量

 

三、循环移位指令说明

ROL:左循环移位指令; ROR:右循环移位指令

RCL:带进位左循环移位指令;RCR:带进位右循环移位指令

 

前两条没有把进位标志位CF包含在循环的环中;后两条把进位标志CF包含在循环的环中。

 

四、转移指令

转移分为段内转移(近转移)和段间转移(远转移)。

段内转移是指仅重置指令指针IP的转移,由于没有重置代码段寄存器CS,所以转以后继续执行的指令仍在同一个代码段中。包括条件转移指令和循环指令。

段间转移是指不仅重置IP,而且重新设置代码段寄存器CS的转移,由于重新设置了CS,所以转以后继续执行的指令在另一个段中。包括软中断指令和中断返回指令。

无条件转移指令和过程调用及返回指令,既可以是段内转移,也可以是段间转移。

 

对于不带进位的循环移位指令而言,如果操作数是8位,那么在移位8次后,操作数就能复原;如果操作数是16位,那么在移动16次后,操作数就能复原。

对于带进位的循环移位指令而言,则相应多一次才能复原。

 

五、循环指令

循环指令不影响各个标志位。

5.1计数循环指令

LOOP 标号

这条指令使寄存器CX的值减1,如果结果不等于0,则转移到标号,否则顺序执行LOOP指令后面的指令。此条指令类似于:

DEC CX

JNZ 标号

 

5.2等于/全零循环指令

LOOPE/LOOPZ 标号

这条指令使寄存器CX的值减1,如果结果不等于0,并且零标志ZF等于1,那么转移到标号,否则顺序执行。

 

5.3不等于/非零循环指令LOOPNE/LOOPNZ

LOOPNE 标号

LOOPNZ 标号

这条指令使寄存器CX的值减1,如果结果不等于0,并且零标志位ZF为0.,那么转移到标号,否则顺序执行。

 

5.4跳转指令

JCXZ 标号

跳转指令当寄存器CX的值等于0时转移到标号,否则顺序执行。

 

六、条件转移指令

 

 

ZF:Z,E   SF:S  OF:O  PF:P  CF:A,B,C

有:1,没有(N):0

但JAE和JNAE恰好相反,对应着CF为0和1

 

 

(1)JB和JBE的区别:前者是CF为1,,也即小于,跳转;后者是CF或ZF为1,也即小于等于,跳转。

(2)CMP和SUB区别:前者进行减操作,但不赋值;后者将减操作结果赋值给第一个操作数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分支程序设计,循环程序设计,子程序结构 1、练习逻辑运算指令、比较指令和条件转移指令的功能、用法以及与标志位的关系和可用的寻址方式 2、用地址表法,完成下面要求的多分支程序的设计。根据MODE单元中的模式字(0-7)分别转向L0-L7标号处执行。L0-L7处分别完成显示‘0’-‘7’字符。 当MODE=0时,转L0标号,完成显示‘0’ 当MODE=1时,转L1标号,完成显示‘1’ 当MODE=2时,转L2标号,完成显示‘2’ 当MODE=3时,转L3标号,完成显示‘3’ 当MODE=4时,转L4标号,完成显示‘4’ 当MODE=5时,转L5标号,完成显示‘5’ 当MODE=6时,转L6标号,完成显示‘6’ 当MODE=7时,转L7标号,完成显示‘7’ 3、编制程序实现如下操作: 设有10个学生成绩,分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并存放于S5、S6、S7、S8、S9、S10单元中。 实验六: 1. 请编写一程序,从附加段中一个未排序的字数组中,找出最大数和最小数分别存放在AX 和BX寄存器中。 2. 以GRADE为首地址的10个字的数组中保存有学生成绩。建立一个10个字的RNAK 数组,并根据GRADE中的学生成绩将学生名次填入RANK数组中(提示:一个学生的名次等于成绩高于等于该学生的人数加1)。 寄存器分配情况说明如下: AX 存放当前被测学生的成绩 BX 存放当前被测学生的相对地址指针 CX 内循环计数值 DX 存放当前被测学生的名次计数值 SI 内循环测试时的地址指针 DI 外循环计数值 3、数组DATAX,其中的数据排列规律是:头三项是0,0,1,以 每项的值均是前三项之和。试将项值小于等于2000以前的各项数据填入数组DATAX中。 算法: n≥ 4时: ① an=an-1+an-2+an-3 ② an=2an-1—an-4 要求:按上述两种算法编程 4、从DATA_BUF(1000H)开始存放50个字节数据,编写程序将这些数据由小到大排序,排序后的数据仍放在该区域中。 要求原始数据在源程序中给出,排序前后的数据以每行10个的格式显示在屏幕上。 5、测量一字符串长度,并用十六进制数显示之

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值