汇编语言指令的构成

汇编语言指令的构成
汇编语言指令的构成

第一讲

第四章汇编语言程序设计-语句特点、伪指令

回顾:8086/8088的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。

重点和纲要:汇编语言程序设计-语句特点、伪指令(了解汇编的概念及其方法, 掌握汇编程序的基本格式,常用运算符的使用方

法,汇编的步骤。了解伪指令的功能,掌握定义数据、符号、

段、过程等伪指令的使用方法,能编写格式正确的汇编程序)。

讲授内容:

4.1 汇编语言的基本元素

一、汇编语言的语句格式

由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由1~4个部分组成,其格式是:

[标号] 指令助记符[操作数][;注解]

其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至少一个)分开,一行最多可有132个字符。

1.标识符

是给指令或某一存储单元地址所起的名字。可由下列字符组成:

字母:A ~ z ;数字:0 ~ 9 ;特殊字符:?、·、@、一、$ 。

数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长为31个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。

2.指令助记符

表示不同操作的指令,可以是8088的指令助记符,也可以是伪指令。 3.操作数

是指令执行的对象。依指令的要求,可能有一个、两个或者没有, 例如: RET ;无操作数

COUNT : INC CX ;一个操作数 如果是伪指令,则可能有多个操作数,例如: COST DB 3,4,5,6,7 ;5个操作数 MOV AX ,[BP 十4] ;第二个操作数为表达式 4.注解

该项可有可无,是为源程序所加的注解,用于提高程序的可读性。

二、 汇编语言的运算符

1.算术运算符、逻辑运算符和关系运算符

① 算术运算符可以应用于数字操作数,结果也是数字。而应用于存储器操作数时,只有+、- 运算符有意义。

2.取值运算符SEG 、OFFSET 、TYPE 、SIZE 和LENGTH · SEG 和OFFSET 分别给出一个变量或标号的段地址和偏移量。

例如,定义: SLOT DW 25

则:MOV AX ,SLOT ;从SLOT 地址中取一个字送入AX

MOV AX ,SEG SLOT ;将SLOT 所在段的段地址送入AX MOV AX ,OFFSET SLOT ;将SLOT 所在段的段内偏移地址送AX

· TYPE 操作符返回一个表示存储器操作数类型的数值。各种存储器地址操作数类型部分的值如表3-1所示。

· LENGTH 和SIZE 操作符只应用于数据存储器操作数。(用DB/DW/DD 等定义的操作数)

LENGTH 返回一个与存储器地址操作数相联系的单元数, SIZE 操作数返回一个为存储器操作数分配的字节数。 例如:若 MULT-WORD DW 50DUP (0) 则 LENGTH (MULT-WORD )=50

表3-1存储器操作数的类型属性及返回值

SIZE(MULT-WORD)=100

注意:SIZE(X)=(LENGTH X)* (TYPE X)

3.属性运算符

属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。常用的有:

(1) 合成运算符PTR

它作用于操作数时,则忽略了操作数当前的类型(字节或字)及属性(NEAR或FAR),而给出一个临时的类型或属性,

一般格式:类型PTR 表达式

功能:建立一个存储器地址操作数,它与其后的存储器地址操作数有相同的段地址偏移量,但有不同的类型。

例如:SLOT DW 25

此时SLOT已定义成字单元。若我们想取出它的第一个字节内容,则可用PTR 对其作用,使它暂时改变为字节单元,即

MOV AL,BYTE PTR SLOT

三、表达式

是由运算符和操作数组成的序列,在汇编时产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址,相应的表达式称为常量表达式和地址表达式。

1.常数

汇编语言语句中出现的常数可以有7种:

①二进制数后跟字母B,如01000001B。

②八进制数后跟字母Q或O,如202Q或202O。

③十进制数后跟D或不跟字母,如85D或85。

④十六进制数后跟H,如56H,0FFH。注意,当数字的第一个字符是A~F 时,在字符前应添加一个数字0,以示和变量的区别。

另有,十进制浮点数、十六进制实数、字符和字符串

2.常量操作数

常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。可以

为数字常量操作数或字符串常量操作数。前者可采用二进制、八进制、十进制或十六进制等计数形式;而后者则为相应字符的ASCII码。

3.存储器操作数

存储器操作数是一个地址操作数,代表一个存储单元的地址,通常以标识符的形式出现。

存储器操作数可以分为变量及标号两者类型,如果存储器操作数所代表的是某个数据在数据段、附加段或堆栈段中的地址,那么这个存储器操作数就称为变量;如果存储器操作数所代表的是某条指令代码在码段中的地址,那么这个存储器操作数称为标号。变量所对应的存储单元内容在程序的运行过程中是可以改变的,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改变。

存储器操作数有三个方面的属性。

(1) 段地址:即存储器操作数所对应的存储单元所在段的段地址;

(2) 偏移地址:即存储器操作数所对应的存储单元在所在段内的偏移地址;

(3) 类型:变量的类型是相应存储单元所存放的数据项的字节数;而标号的类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,可有两种情况,即NEAR和FAR。具体值可见表3-1

4.常量表达式

由常量操作数及运算符构成,在汇编时产生一个常量。

如PORT、V AL十1、OFFSET SUM、SEG SUM、TYPE CYCLE等。

5.地址表达式

由存储器操作数与运算符构成,必须有明确的物理意义。

例如SUM+2、CYCLE-5

表达式SUM+2、CYCLE-5的值仍然是一个存储器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM及CYCLE大2或小5。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。

四、汇编语言程序汇编步骤

汇编语言程序要能在机器上运行,还必需将汇编源程序汇编成可执行程序。为此必须完成以下几个步骤。过程如图3-1所示。

1.编辑源程序

2.调用宏汇编对源程序进行汇编

3.对目标程序进行连接

4.运行可执行程序并调试

4.2 伪指令

伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令CPU去执行什么操作。

一、定义数据伪指令

该类伪指令用来定义存储空间及其所存数据的长度。

· DB:定义字节,即每个数据是1个字节。

· DW:定义字,即每个数据占1个字(2个字节)。

· DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址。

· DQ:定义4字长,即每个数据占4个字。

· DT:定义10个字节长,用于压缩式十进制数,

例如:DATA1 DB 5,6,8,100

DATA2 DW 7,287

TABLE DB ? ;表示在TABLE单元中存放的内容是随机的

当一个定义的存储区内的每个单元要放置同样的数据时,可用DUP操作符。

一般格式:COUNT DUP(?),COUNT 为重复的次数,“()”中为要重复的数据。

如:BUFFER DB 100DUP(0) ;表示以BUFFER为首地址的100个字节中存放00H数据

BUFFER1 DB 100 DUP(3,5,2DUP(10),35),24,‘NUM’)

想一想存储区的情况?

二、符号定义伪指令EQU、=、及PURGE

· EQU 伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,

如:TIMES EQU 50

DATA DB TIMES DUP(?)

上述两个语句实际等效于如下一条语句:

DATA DB 50 DUP(?)

·“=”伪指令可给初始变量赋值。

如:COUNT=100 ;COUNT=100

TIME=50 ;TIME=50

·PURGE伪指令用于释放由EQU伪指令定义的变量,使这些变量可以被重新定义。

PURGE TIMES ; 释放TIMES变量

TIMES EQU 2 ; 重新定义

三、段定义伪指令SEGMENT和ENDS

一般来说,一个完整的汇编源程序由3个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合。

段定义伪指令一般格式为:

段名SEGMENT [定位类型] [组合类型] [类别]

段名ENDS

SEGMENT和END5应成对使用,缺—不可。其中段名是不可省略的。其它是可选项,是赋予段名的属性,可以省略。

例如:DATA SEGMENT

DW 20DUP(?)

DATA ENDS

四、设定段寄存器伪指令ASSUME

一般格式:ASSUME 段寄存器:段名[,段寄存器:段名,……]

功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。在段名中,CODE表示代码段,DATA 表示数据段,STACK表示堆栈段。

由于ASSUME伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有

包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。这一步是不可缺少的。

例如,CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

MOV AX,DATA ;DATA段值送AX

MOV DS,AX ;AX内容送DS,DS才有实际段值

CODE ENDS

当程序运行时,由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装入程序中DS寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对DS进行初始化,以装入用户的数据段地址。当使用附加段时,也要用MOV 指令给ES赋段地址。

五、定义过程的伪指令PROC和ENDP

在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。

一个过程由伪指令PROC和ENDP来定义,其格式为:

过程名PROC [类型]

过程体

RET

过程名ENDP

其中过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。ENDP表示过程结束。过程体内至少应有一条RET指令,以便返回被调用处。过程可以嵌套,也可以递归使用。

例如一个延时100ms的子程序,其过程可定义如下,

DELAY PROC

PUSH BX

PUSH CX

MOV BL,10

;延时10ms,改变BL和CX中的值,即可改变延时时间。

AGAIN:MOV CX,2801 ;

WAIT;LOOP WAIT

DEC BL

JNZ AGAIN

POP CX

POP BX

RET

DELAY ENDP

CALL DELAY ;调用该过程

远过程调用时被调用过程必定不在本段内。

例如,有两个程序段,其结构如下:

CODE1 SEGMENT

ASSUME CS:CODE1

FARPROC PROC FAR

RET

FARPROC ENDP

CODE1 ENDS

CODE2 SEGMENT

ASSUME CS:CODE2

CALL FARPROC

…..

CODE2 ENDS

CODE1 段中的FARPROC 过程被另一段CODE2调用,故为远过程。

六、宏指令

在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。

宏指令的一般格式为:宏指令名MACRO [形式参量表]

宏体

ENDM

例如:SHIFT MACRO

MOV CL,4

SAL AL,Cl

ENDM

这样定义以后,凡是要使AL中内容左移4位的操作都可用一条宏指令SHIFT 来代替。

宏指令与子程序有许多类似之处。它们都是一段相对独立的、完成某种功能的、可供调用的程序模块,定义后可多次调用。但在形成目的代码时,子程序只形成一段目的代码,调用时转来执行。而宏指令是将形成的目的代码插到主程序调用的地方。因此,前者占内存少,但执行速度稍慢;后者刚好相反。

七、ORG 伪指令

ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。

一般格式:ORG <表达式>

例如:DATA SEGMENT

BUFF1 DB 23,56H,‘EOF’

ORG 2000H

BUFF2 DB ‘STRING’

DATA ENDS

上述变量定义中,BUFF1从DATA段偏移地址为0的单元开始存放,而BUFF2则从DATA段偏移为2000H的单元开始存放,两者不是连续存放。

八、汇编结束伪指令END

该伪指令表示源程序的结束.令汇编程序停止汇编。因此,任何一个完整的源程序均应有END指令。

一般格式:END [表达式]

其中表达式表示该汇编程序的启动地址。例如:

END START ;表明该程序的启动地址为START。

习题与思考:

1.下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。

V AR1 DB 10,2

V AR2 DW 5DUP(?),0

V AR3 DB ‘HOW ARE YOU?’,‘$’

V AR4 DD -1,1,0

2.假定V AR1和V AR2为字变量,LAB为标号,试指出下列指令的错误之处。

(1)ADD V AR1,V AR2 (2)SUB AL,V AR1

(3)JMP LAB[SI] (4)JNZ V AR1

3.对于下面的符号定义,指出下列指令的错误。

A1 DB ?

A2 DB 10

K1 EQU 1024

(1)M OV K1,AX (2)MOV A1,AX

(3)CMP A1,A2 (4)K1 EQU 2048

4.数据定义语句如下所示:

FIRST DB 90H,5FH,6EH,69H

SECOND DB 5 DUP(?)

THIRD DB 5 DUP(?)

FORTH DB 5 DUP(?)

自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:

(1)编一段程序将这个数左移两位、右移两位后存放到自SECOND开始的单元(注意保留移出部分。

(2)编一段程序将这个数求补以后存放到自FORTH开始的单元。

5.试编程序将内存从40000H到4BFFFH的每个单元中均写入55H,并再逐个单元读出比较,看写入的与读出的是否一致。若全对,则将AL置7EH;只要有错,则将AL置81H。6.在当前数据段4000H开始的128个单元中存放一组数据,试编程序将它们顺序搬移到A000H开始的顺序128个单元中,并将两个数据块逐个单元进行此较;若有错将BL置00H;全对则将BL置FFH,试编程序。

第二讲:

4.2 汇编程序设计(一)

回顾:8086/8088的指令系统,汇编程序的基本格式,伪指令的功能,汇编程序的正确格式。

重点和纲要:掌握汇编程序的分析与设计方法(包括分支程序和循环程序,设计思想,与高级语言的学习结合)

讲述内容:

一、简单程序设计

简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。

例1 利用查表法计算平方值。已知0 ~ 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0≤X≤9且为整数。

分析:建立平方表,通过查表完成。

STACK SEGMENT

DB 100 DUP(?)

STACK ENDS

DATA SEGMENT

SUR DB ?

DIS DB ?

SQTAB DB 0,1,4,9,16,25,36,49,64,81 ; 0~9的平方表DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA BEGIN:PUSH DS

MOV AX,0

PUSH AX ;保证返回DOS,

MOV AX,DATA

MOV DS,AX ;为DS送初值

LEA BX,SQTAB ;以下程序部分完成查表求平方值

MOV AH,0 ;亦可用查表指令完成(如下程序段)

MOV AL,SUR ;AL=X LEA BX, SQTAB

ADD BX,AX ;MOV AL, SUR

MOV AL,[BX] ;XLAT

MOV DIS,AL ;MOV DIS, AL

CODE ENDS

END BEGIN

例2 已知Z=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩BCD码表示的数,写出程序。

分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。具体程序如下:

MOV AL,Z

MOV BL,W

ADD AL,BL

DAA

MOV BL,AL ;BL=(W+Z)

MOV AL,X

MOV DL,Y

ADD AL,DL ;AL=(X+Y)

DAA ;十进制调整

SUB AL,BL ;AL=(X+Y)-(Z+W)

DAS ;十进制调整

MOV Z,AL ;结果送Z

二、 分支程序设计

分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A 成立,则执行P1;否则执行P2。

例1 试编写程序段,实现符号函数。

分析:变量X 的符号函数可表示为:

1 X>0 Y= 0 X=0

-1 X<0

程序可通过对符号标志的判别来确定执行哪一分支。 START : MOV AX ,BUFFER ;(BUFFER )=X OR AX ,AX

JE ZERO ;X =0,则转ZERO JNS PLUS ;X 为正数,则转PLUS MOV BX ,0FFFFH ;X 为负数,则-1送BX

JMP CONT1 ZERO : MOV BX ,0

JMP

CONT1

PLUS :

MOV BX ,1

CONT1: ……

例2 利用表实现分支

根据AL 中各位被置位情况,控制转移到8个子程序P1~P8之一中去。转移表的结构如表3-2所示。

分析:对于这种程序关键要找出每种情况的转移地址,从图中可见

表地址=表基地址+偏移量, 而偏移量可由AL 各位所在位置*2求得。

表3-2 子程序R1—R8的入口地址表

流程图见图3-3。

DATA SEGMENT

BASE DW SR0,SR1,SR2,SR3,

SR4,SR5,SR6,SR7

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:

DATA

BEGIN:PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX 图3-3 流程图

LEA BX,BASE ;表头送BX

IN AL,PORT

GETBIT:RCR AL,1 ;右移一位

JC GETAD ;移出位是1?

INC BX

INC BX ;修改指针

JMP GETBI

GETAD:JMP WORD PTR[BX] ;实现散转

CODE ENDS

END BEGIN

根据跳转表构成方法不同,实现分支的方法也有所改变,下面有三个问题希望大家思考:

(1) 若跳转表地址由段值和偏移量四个字节构成,程序应如何实现?

(2) 若跳转表中的内容由JMP OPRD指令构成,表的结构应如何组织、程序如何实现?

(3) 上述程序若不用间接跳转指令,而改为直接跳转,程序如何变动?

例3将内存中某一区域的原数据块传送到另一区域中。

分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或串操作实现;若地址重叠,则要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传

送。程序如下:

DATA SEGMENT

STR DB 1000DUP(?)

STR1 EQU STR+7

STR2 EQU STR+25

STRCOUNT EQU 50

DATA ENDS

STACK SEGMENT PARA STACK ‘STACK’

STAPN DB 100DUP(?)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK GOO PROC

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

MOV CX,STRCOUNT

MOV SI,STR1

MOV DI,STR2

CLD

PUSH SI

ADD SI,STRCOUNT-1

CMP SI,DI

POP SI

JL OK

STD

ADD SI,STRCOUNT-1

ADD DI,STRCOUNT-1

OK:REP MOVSB

RET

GOO ENDP

CODE ENDS

END GOO

三、循环程序设计

循环程序是经常遇到的程序

结构,一个循环结构通常由以下

几个部分组成。

1.循环初始化部分。一般要进行

地址指针、循环次数及某标志

的设置,相关寄存器的清零等

操作。只有正确地进行了初始化设置,图3-4循环结构示意图

循环程序才能正确运行,及时停止。

2.循环体。是要求重复执行的程序段部分,对应于要求重复执行的操作。3.循环控制部分。由该部分修改并判断控制循环的条件是否满足。以决定是否继续循环。

4.循环结束部分。如保存循环运行结果等。

循环程序有两种结构形式,一种是DO—WHILE结构,另一种是DO—UNTIL 结构。前者把循环控制部分放在循环体的前面,先判断执行循环体的条件,满足条件就执行循环体,否则就退出循环,如图3-4(1)所示。而后者则是在执行循环体之后,再判断循环控制条件是否满足,若满足条件,则继续执行循环操作,否则,则退出循环。如图3-4(2)所示。DO—WHILE结构的循环程序,其循环体有可能并不执行,而DO—UNTIL循环程序的循环体至少必须执行一次。

例4 设内存BUFF开始的单元中依次存放着30个8位无符号数,求它们的和并放在SUM单元中,试编写程序。

分析:这是一个求累加的程序。(设计思想同C语言)程序如下:

MOV SI,BUFF ;设地址指针

MOV CX,30 ;设计数初值

XOR AX,AX ;设累加器初值

AGAIN:ADD AL,[SI]

ADC AH,0

DEC CX

JNZ AGAIN ;循环累加

MOV SUM,AX

例4在给定个数的16位数串中,找出大于零、等于零和小于零的个数,并紧跟着原串存放。

分析:这是一个统计问题,须设定三个计数器分别统计三种情况下的结果。程序如下:

DATA SEGMENT

BUFF DW X1,X2,X3,……,Xn

COUNT EQU $-BUFF ;此时,COUNT的值为BUFF所占的字节数

PLUSE DB ?

ZERO DB ?

MINUS DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

ASSUME ES:DATA,SS:STACK

BEGIN:MOV AX,DATA

MOV DS,AX

MOV CX,COUNT

SHR CX,1 ;相当于除2,正好为BUFF中的数据个数

MOV DX,0 ;设定计数器初值

MOV AX,0 ;设定计数器初值

LEA BX,BUFF

AGAIN:CMP WORD PTR[BX],0

JAE PLU ;大于等于0,则转PIU

INC AH ;<0,则统计

JMP NEXT

PLU:JZ ZER ;=0,则转ZER

INC DL ;>0,则统计

JMP NEXT

ZER:INC DH ;=0,则统计

NEXT:INC BX

LOOP AGAIN

MOV PLUS,DL

MOV ZERO,DH

MOV MINUS,AH

MOV AX,4C00H

INT 21H

CODE ENDS

END BEGIN

习题与思考:

1.设变量单元A、B、C存放有三个数,若三个数都不为零,则求三个数的和,存放在D中;若有一个为零,则将其余两个也清零,试编写程序。

2.有一个100个字节的数据表,表内元素已按从大到小的顺序排列好,现给定一元素,试编程序在表内查找,若表内已有此元素,则结束;否则,按顺序将此元素插入表中适当的位置,并修改表长。

3.内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。

4.编写一段程序,接收从键盘输入的10个数,输入回车符表示结束,然后将这些数加密后存于BUFF缓冲区中。加密表为:

输入数字:0,1,2,3,4,5,6,7,8,9;密码数字:7,5,9,1,3,6,8,0,2,4 第三讲:

4.3 汇编程序设计(二)

回顾:8086/8088的指令系统,汇编程序的基本格式,伪指令的功能,汇编程序的正确格式。分支程序和循环程序的设计方法。

重点和纲要:掌握汇编程序的分析与设计方法(包括循环程序和子程序,复杂程序设计思想、调用)。

讲述内容:

三、循环程序设计

例6 在ADDR单元中存放着16位数Y的地址,试编写一程序,把Y中1的个数存入COUNT单元中。

分析:这是一个循环统计的工作。采用DO—WHILE结构,做16次循环,每次将最高位移入CF中进行测试,先判断结果是否为0,若为0,则结束;否则统计计数后循环重复。

程序如下:

DATA SEGMENT

ADDR DW NUMBER

NUMBER DW Y

COUNT DW ?

DATA ENDS

PROGRAM SEGMENT

MAIN PROC FAR

ASSUME CS:PROGRAM,DS:DATA

START:PUSH DS

MOV AX,0

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV CX,0 ;计数器初值=0

MOV BX,ADDR

MOV AX,[BX] ;取Y送AX

REPEAT:TEST AX,0FFFFH ;检测是否为全0

JZ EXIT ;是,则转EXIT

JNS SHIFT ;最高位是0,则转SHIFT

INC CX ;最高位是1,则统计计数

SHIFT:SHL AX,1 ;处理下一位

JMP REPEAT

EXIT:MOV COUNT,CX

RET

MAIN ENDP

PROGRAM ENDS

END START

在实际应用中,有些问题较复杂,一重循环不够,必须使用多重循环实现,这些循环是一层套一层的,通常称为循环嵌套。

例8在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号16位数,现要编写程序将这100个字数据从大到小排序。

分析:排序的方法有很多,在这里,我们采用冒泡法。

(该方法的设计思想在C语言程序设计中已学过,可提问学生。)

程序如下:

LEA DI,BUFFER ;DI作为指针,指向要排序的数据

MOV BL,99 ;循环控制初值

NEXT0:MOV SI,DI

MOV CL,BL

NEXT3:MOV AX,[SI] ;取一个数

ADD SI,2

CMP AX,[SI] ;与下一个数进行比较

JNC NEXT5 ;大于等于时转移

MOV DX,[SI] ;否则,两数交换

MOV [SI-2],DX

MOV [SI],AX

NEXT5:DEC CL ;控制进行交换的次数

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

汇编语言指令汇总

汇编语言程序设计资料简汇 通用寄存器 8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。 16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。 AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。专用寄存器 指令指针:IP(16位)。 标志寄存器:没有助记符(FLAGS 16位)。 段寄存器 段寄存器:CS、DS、ES、SS。 内存分段:80x86采用分段内存管理机制,主要包括下列几种类型的段: ?代码段:用来存放程序的指令序列。 ?数据段:用来存放程序的数据。 ?堆栈段:作为堆栈使用的内存区域,用来存放过程返回地址、过程参数等。 物理地址与逻辑地址 ?物理地址:内存单元的实际地址,也就是出现在地址总线上的地址。 ?逻辑地址:或称分段地址。 ?段地址与偏移地址都是16位。 ?系统采用下列方法将逻辑地址自动转换为20位的物理地址: 物理地址= 段地址×16 + 偏移地址 ?每个内存单元具有唯一的物理地址,但可由不同的逻辑地址描述。 与数据有关的寻址方式 立即寻址方式 立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 例:MOV AL,18 指令执行后,(AL)= 12H 寄存器寻址方式 在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。 例3:MOV AX,BX 如指令执行前(AX)= 6789H,(BX)= 0000H;则指令执行后,(AX)= 0000H,(BX)保持不变。 直接寻址方式 直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。直接寻址方式适合于处理单个数据变量。 寄存器间接寻址方式 在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。 如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址。 如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段。

汇编语言指令详解

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H 立即数可以是8位的,也可以是16位的。若

是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以分成两种情况:

汇编语言指令

汇编语言指令集 数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2

格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,O ROR,ROL,RCR,RCL

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

MIPS 指令系统和汇编语言

第四章MIPS指令系统和汇编语言 1.考研预测:出题特点总结 本章是对统考408内容来说,本章是新增的章节。此外北航961大纲中制定了要考MIPS 指令集,从15年961真题来看MIPS是重中之重。但是今年计组并没有指定具体的教材,但大纲明确要求掌握MIPS指令集,所以还是建议考生将《计算机组成与设计:硬件/软件接口》中文版(原版第三版或第四版)作为本章的参考书籍。 本章大致内容是MIPS的基础知识,难度并不大。考生应该将重点放在MIPS指令集的基础上,考察C语言中的语句转换为对应的MIPS指令,所以需要熟练掌握C语言中一些语句对应的MIPS指令实现。本章出题很大可能就是C语言和MIPS汇编语言之间的转换,也可能涉及到第五章CPU指令流水线等内容。 2.考研知识点系统整理:梳理考点,各个击破 3.1 指令系统概述 机器指令要素 操作码:指明进行的何种操作 源操作数地址:参加操作的操作数的地址,可能有多个。 目的操作数地址:保存操作结果的地址。 下条指令的地址:指明下一条要运行的指令的位置,一般指令是按顺序依次执行的,所以绝大多数指令中并不显式的指明下一条指令的地址,也就是说,指令格式中并不包含这部分信息。只有少数指令需要显示指明下一条指令的地址。

指令执行周期 3.2 指令格式 一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操

作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。 指令的基本格式 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下: ( 其中A1为第一操作数地址,A2为第二操作数地址,A3为操作结果存放地址。 这条指令的含义:(A1)OP(A2)→A3 式中OP表示双操作数运算指令的运算符号,如“+”或“–”等。 (2)二地址指令

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

8088汇编语言指令

8088指令系统总结 预备知识:符号含意、数据传送原则 符号含意 符号含意 opr 操作数 src 源操作数 dst 目的操作数 mem 存储器 im 立即数 seg 段寄存器 reg 通用寄存器 EA 偏移地址 PA 物理地址 nn直接地址DISP8:8位偏移地址DISP16:16位偏移地址 数据传送原则 口诀数据传送原则 寄段储间互传数,seg、reg、mem之间的数据可以相互传送。 立即只入寄和储。im可入reg、mem 只有寄间互换数,reg之间的数据可以传送。Mem间、seg间不可自传CS立即不可目,CS和立即数不可入,不能当目的操作数 8088指令系统 8088指令系统分六大类 一、数据传送指令 二、算术运算指令 三、逻辑运算与位移指令 四、串操作指令 五、控制与转移指令 六、CPU控制指令 一、数据传送指令 1.通用传送指令 (1)传送指令MOV dst, src功能:dst←src (2)堆栈操作指令人W PUSH src作用:SP←SP-2 ((SP+1)+SP)←src src(reg seg mem) POP dst 作用:dst←((SP+1)+SP)SP←SP-2 dst(reg seg mem)

(3)交换指令XCHG OPR1,OPR2 OPR1←→OPR2 2.累加器传送指令 (1)输入输出指令 256B短格式:直接寻址,64K长格式:直接、间接寻址,PORT为8位口地址输入指令:直接寻址IN AX,PORT IN AL,PORT 间接寻址IN AX,DX IN AL,DX 输出指令:直接寻址OUT AX,PORT OUT AL,PORT 间接寻址OUT AX,DX OUT AL,DX (2)换码指令XLAT AL←(BX+AL)(BX)为mem地址 3.地址传送指令 (1)有效地址传送寄存器 LEA reg16, mem作用:mem的EA→reg16 (2)指针送寄存器和DS指令 LDS reg16, mem32 作用:reg16←mem32的低字高字→DS (3)指针送寄存器和有ES指令 LES reg16, mem32 作用:reg16←mem32的低字高字→ES 4.标志寄存器传送指令 (1)取标志指令:LAHF F的低字节→AH (2)置标志指令:SAHF AH→flag的低字节 (3)标志入栈指令:PUSHF SP-2→SP F→(SP+1):SP (4)标志出栈指令:POPF (SP+1):SP→F SP+2→SP 二、算术运算指令 1.加法类指令(Add)opr-reg mem B/W (1)不带进位加法ADD dst, src dst←dst+src 影响OSZAPC (2)带进位加法ADC dst, src dst←dst+src+CF影响OSZAPC (3)加1指令INC opr opr←opr+1影响OSZP (4)组合十进制调整DAA放在ADD后 (5)非组合十进制调整AAA放在ADC后 原理:2个十进制数相加,可能出现非法数(A到F),需用调整指令,进行加6调整变成合法十进制数。十进制=BCD组合=压缩组合BCD占4位非组合BCD占8位 2 . 减法类指令(substract) (1)减法指令SUB dst, src;dst←dst-src影响标志位OSZAPC (2)带借位减法指令SBB dst, src;dst←dst-src-CF影响标志位

常见汇编语言指令解释:

PC是一个16位的程序计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。 参数代表的意义: 1、Rn 表示R0~R7中的一个 2、#data 表示8位的数值 00H~FFH 3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址) 4、@Ri 表示寄存器间接寻址只能是R0或者R1 5、@DPTR 表示数据指针间接寻址 6、bit 表示位地址 7、$ 表示当前地址 常见汇编语言指令解释: 寄存器寻址 MOV A,R1将R1中的数值赋予A 直接寻址 MOV A,3AH将地址3AH中的数值赋予A 立即寻址 MOV A,#3AH将3AH数值赋予A

寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A 变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表 相对寻址 AJMP MATN跳转到行号为MATN处 位寻址 MOV C,7FH 将位地址7FH的数值赋予C MOV A,#3AH数据传输、赋值命令 PUSH direct将direct为地址的数值压入堆栈中 POP direct将direct为地址的数值弹出堆栈 XCH A,direct将direct中的数值与A进行交换 ADD A,direct将direct中的数值与 INC direct将direct中的数值加1 SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1 DA A 用于对BCD码加减法后进行10进制调整 MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中 DIV A B将A和B相除,并把商放在A中,余数放在B中 ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1) ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0) XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)

汇编语言常用指令大全解释

常用汇编指令:MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。 LES (Load ES with pointer) 指针送寄存器和ES指令 LES REG , SRC //常指定DI寄存器 执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已. LAHF( Load AH with Flags ) 标志位送AH指令

汇编语言常见指令

?PTR?操作符:强制类型转换 MOV BYTE PTR [BX], 20H ;1B立即数20H送DS:[BX] MOV WORD PTR [BX], 20H ;立即数20H送DS:[BX], ;00H送DS:[BX+1] 2.LEA(Load Effective Address) 设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后: LEA DX, X LEA BX, [BP] ; 执行后, (DX) = 1020H ; 执行后, (BX) = 0020H 3.地址传送指令LDS,LES LDS REG16, MEM ; 从存储器取出4B,送入REG16和DS LES REG16, MEM ; 从存储器取出4B,送入REG16和ES 4.符号扩展指令CBW,CWD CBW ;将AL寄存器内容符号位扩展到AH CWD ;将AX寄存器内容符号位扩展到DX 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CBW ;(AX)= 0060H 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CWD ;(DX)= 0FFFFH,(AX)= 8060H 5.交换指令XCHG 例如,(AX)= 5678H 执行下面指令后 XCHG AH, AL ;(AX)= 7856H 6.换码指令XLAT XLAT ;AL←DS: [BX+AL] 表格的首地址事先存放在内存逻辑地址DS: BX中, AL的内容是相对于表格的位移量, 把对应内存的内容取出放在AL寄存器。 7.逻辑运算符 SHR(右移) SHL(左移) AND(与) OR(或) XOR(异或)

反汇编语言常用指令

内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址, 在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。 3、指针寄存器

汇编语言指令详解大全

汇编语言指令详解大全

助记符指令说明字节 数 周 期 数 (数据传递类指令) MOV A,Rn 寄存器传送到累加器 1 1 MOV A, direct 直接地址传送到累加 器 2 1 MOV A,@Ri 累加器传送到外部 RAM(8 地址) 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器传送到寄存器 1 1 MOV Rn, direct 直接地址传送到寄存 器 2 2 MOV Rn, #data 累加器传送到直接地 址 2 1 MOV direct, Rn 寄存器传送到直接地 址 2 1

MOV direct, direct 直接地址传送到直接 地址 3 2 MOV direct, A 累加器传送到直接地 址 2 1 MOV direct, @Ri 间接RAM 传送到直接 地址 2 2 MOV direct, #data 立即数传送到直接地 址 3 2 MOV @Ri,A 直接地址传送到直接 地址 1 2 MOV @Ri, direct 直接地址传送到间接 RAM 2 1 MOV @Ri, #data 立即数传送到间接 RAM 2 2 MOV DPTR, #data16 16 位常数加载到数 据指针 3 1 MOVC A, @A+DPTR 代码字节传送到累加 器 1 2

MOVC A,@A+PC 代码字节传送到累加 器 1 2 MOVX A,@Ri 外部RAM(8 地址)传 送到累加器 1 2 MOVX A,@DPTR 外部RAM(16 地址)传 送到累加器 1 2 MOVX @Ri,A 累加器传送到外部 RAM(8 地址) 1 2 MOVX @DPTR,A 累加器传送到外部 RAM(16 地址) 1 2 PUSH direct 直接地址压入堆栈 2 2 POP direct 直接地址弹出堆栈 2 2 XCH A,Rn 寄存器和累加器交换 1 1 XCH A, direct 直接地址和累加器交 换 2 1 XCH A, @Ri 间接RAM 和累加器交 换 1 1

汇编语言期末复习总结(完整版)

〔习题1.24〕说明下列指令中源操作数的寻址方式?如果BX=2000H,DI=40H,给出DX 的值或有效地址EA的值。 (1)mov dx,[1234h] 直接寻址,EA=1234H (3)mov dx,bx 寄存器寻址,DX=2000H (6)mov dx,[bx+di] 基址变址寻址,EA=2040H 第2章8086的指令系统 〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。 (1)mov ax,1200h AX=1200H (2)mov ax,bx AX=0100H (3)mov ax,[1200h] AX=4C2AH ;偏移地址=1200h (4)mov ax,[bx] AX=3412H ;偏移地址=bx=0100h (5)mov ax,[bx+1100h] AX=4C2AH ;偏移地址=bx+1100h=1200h (6)mov ax,[bx+si] AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h (7)mov ax,[bx][si+1100h] AX=65B7H ;偏移地址 bx+si+1100h=0100h+0002h+1100h=1202h 〔习题2.2〕指出下列指令的错误 (1)mov cx,dl 两操作数类型不匹配 (2)mov ip,ax IP指令指针禁止用户访问 (3)mov es,1234h 立即数不允许传给段寄存器(DS、CS、SS、ES) (4)mov es,ds 段寄存器之间不允许传送 (5)mov al,300 两操作数类型不匹配 (6)mov [sp],ax 目的操作数应为[ SI ] (7)mov ax,bx+di 源操作数应为[BX+DI] (8)mov 20h,ah 立即数不能作目的操作数 〔习题2.8〕请分别用一条汇编语言指令完成如下功能: (1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。 (2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 (3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。 (4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。 (5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。 (1)ADD DX,BX (2)ADD AL,byte ptr [BX+SI] (3)ADD [BX+0B2H],CX (4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H

汇编语言英文指令

汇编语言英文指令 AH&AL=AX(accumulator):累加寄存器 BH&BL=BX(base):基址寄存器 CH&CL=CX(count):计数寄存器 DH&DL=DX(data):数据寄存器 SP(Stack Pointer):堆栈指针寄存器 BP(Base Pointer):基址指针寄存器 SI(Source Index):源变址寄存器 DI(Destination Index):目的变址寄存器 IP(Instruction Pointer):指令指针寄存器 CS(Code Segm ent)代码段寄存器 DS(Data Segm ent):数据段寄存器 SS(Stack Segm ent):堆栈段寄存器 ES(Extra Segment):附加段寄存器 OF overflow flag 溢出标志操作数超出机器能表示的范围表示溢出,溢出时为1. SF sign Flag 符号标志记录运算结果的符号,结果负时为1. ZF zero flag 零标志运算结果等于0时为1,否则为0. CF carry flag 进位标志最高有效位产生进位时为1,否则为0. AF auxiliary carry flag 辅助进位标志运算时,第3位向第4位产生进位时为1,否则为0. PF parity flag 奇偶标志运算结果操作数位为1的个数为偶数个时为1,否则为0. DF direction flag 方向标志用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大. IF interrupt enable flag 中断允许标志IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. TF trap flag 陷阱标志用于调试单步操作

相关文档
最新文档