汇编语言指令

汇编语言源程序中以语句表示指令,语句有三种基本类型:

  1、指令:汇编后形成一条机器语言指令,它们之间是一一对应的,在程序执行时指令得以执行。

  2、伪指令:只是告诉汇编程序如何进行汇编,汇编后没有生成机器语言指令,他在程序汇编时得以执行。

  3、宏指令:它是由用户自己定义的指令,由指令和伪指令构成,他在程序汇编进行时宏展开,以相应的指令和伪指令替代宏指令。

1/1、汇编语言中语句的组成

  汇编语言中的语句由以下四部分组成:

    名称 空格或:          操作助记符  空格 操作数  ;注释

   注 : 每条语句可以有名称,也可以没有名称。这种名称有两种含义:

    1. 标号: 当语句中名称与助记符之间以冒号间隔时,该名称表示标号,用于表示指令的地址(段地址、偏移地址)。

    2. 变量名: 当语句中名称与助记符之间以空格间隔时,该名称表示变量名,用于表示存放数据的储存空间。

1/2、汇编语言中的常数与表达式

  常数 :

    数值:B(二进制)、 D(十进制)、 H(十六进制)

    字符串: 单引号内部 ,表示各字符的ASCII 码

  表达式 : 由操作数和操作符组成

  

"""
算数操作符:+、-、*、/、MOD
逻辑操作符:AND  OR   NOT  XOR
关系操作符:EQ(相等)、  EN (不等)
                  LT (小于)、  GT (大于)
                  LE (小于等于)、GE(大于等于)
"""
            

1/3 标号、变量

#标号用于指示相应指令的地址,与助记符之间用冒号间隔
例 :
    START:MOV AX,1000
注:
     标号START代表了指令“ START:MOV AX,1000”的地址,这样,可以使用转移语句JMP START ,转移到改地址。
#变量由伪指令来定义,之间用空格而不是冒号
格式为: 变量名 DB/DW/DD/DQ/DT 表达式  ;定义(8/16/32/64/80)
注:
    1、变量名可有可无
    2、一个或多个表达式或常数之间用逗号分隔
    3、一个、多个问号(?),这是表示只给变量分配存储空间
    4、重复方式,这时表达式的形式为
                                                    重复次数 DUP (表达式)  5、$ 出现在表达式中时,表示当前汇编语句的偏移地址  6、伪指令 DW DD 的特殊用法    伪指令DD DW 除定义变量外,还可以用来预置变量的段内偏移地址      DW 用法格式 : 变量名1 DW 变量名2         例: AD2 DW AD1  ; AD2指向AD1的起始地址      DD 用法格式和上面用法相同        例: AD4 DD AD1  ; AD4指向AD1的起始地址(只是DD为双字,第一个字内存放段内偏移地址,第二个字为段地址) 

1/4 属性操作符和PTR 操作符

  PTR操作符可以用来暂时改变已经定义过的变量或标号的类型(包括BYTE字节型、WORD字型、DWORD双字型,也可以取标号的类型NEAR近型、FAR远型)

  使用格式 : 类型 PTR 表达式

  

#属性操作符

SEG             取出段地址
OFFSET        取出偏移地址
TYPE             取出其类型
LENGTH        取出变量重复的次数
SIZE              取出变量的大小

2/1 数据与转移地址的寻址方式

 1、数据的寻址方式:寻找指令操作所需数据的方法

 2、转移地址的寻址方式: 寻找转移指令所需程序地址的方法

#数据的寻址方式
8086CPU指令系统的常用数据寻址方式有8种:立即寻址、寄存器寻址、存储器寻址(5种:直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、基址变址且相对寻址)、隐含寻址

以下通过一些例子介绍较难理解的寻址方式:
    #寄存器相对寻址
        MOV CX,VAR1[BX] ; (CX)<--((BX)+OFFSET VAR1)
        MOV AL,VAR2[DI-15]  ; (AL)<--((DI)+(OFFSET VAR2 -15))
        MOV 5[SI+24],DX   ;((SI)+(5+24))<--(DX)
    #基址变址寻址
        MOV DX,[BX][SI]   ;(DX)<--((BX)+(SI))
        MOV AX,[BP][SI]   ;(AX)<--((BP)+(SI))  BP默认段地址在SS段
    #基址变址且相对寻址
        MOV VAR1[BP][DI],AX  ;((BP)+(DI)+OFFSET VARI)<--AX
    #隐含寻址
        MOVSB  ;指令含义:从(DS:SI)的存储单元中取出一个字节,传送             到(ES:DI)存储单元,并且SI和DI的内容自动增1(当DF=1)时,或自动减1(当DF=1时)
#转移地址的寻址方式
转移地址的寻址方式有4种:段内直接方式与间接方式、段间直接方式与间接方式

2/1

数据传送类指令  :通用传送类指令    MOV  

         获取有效地址指令    LEA

         获取地址指针指令      LDS, LES

         标志传送指令     LAHF, SAHF

         数据交换指令     XCHG

         字节转换指令     XLAT

         堆栈操作指令     PUSH, POP, PUSHF, POPF  

#通用传送指令
格式MOV DST,SRC ;
说明:将源操作数中的一个字节或一个字传送到目的操作数所指定的位置。
注意:MOV指令不能直达的路径:
(1)、立即数    段寄存器
(2)、存储单元  存储单元
(3)、段寄存器   段寄存器
如果要完成以上这些数据的传送,可以分以下步骤完成
立即数--通用寄存器--段寄存器
"""
MOV AX,3A01H
MOV DS,AX
"""
存储单元--通用寄存器--存储单元
"""
MOV AX,VAR1
MOV VAR2,AX
"""
段寄存器--通用寄存器--段寄存器
"""
MOV AX,CS
MOV DS,AX
"""
(CS寄存器不能用作目的寄存器)

对于双操作指令,两个操作数的类型必须匹配:
~两者都指定了类型,则必须一致,否则出错
~两者之一指定了类型,一般指令无措
~两者都无类型,则指令出错

对于操作数的类型
~立即数是无类型的
~不含变量名的直接寻址、寄存器相对寻址、寄存器间接寻址、基址变址寻址、基址变址且相对寻址的操作数也是无类型的
~利用PTR操作符可指定或暂时改变存储单元的类型

从形式上看,立即数有:由常数等组成的表达式、所有由属性操作符得到的标号或变量的属性(OFFSET   SEG  LENGTH  TYPE  等 )

MOV

 1 #取有效地址指令LEA
 2 格式:LEA REG16,MEM
 3 说明:取有效地址指令LEA可以将源操作数的有效地址送入16位寄存器REG16,它传送的不是MEM(存储单元)的内容,而是存储单元的有效地址。这里源操作数MEM只能是直接寻址方式
 4
 5 例如:
 6 LEA DI,VAR1                :等同于 MOV DI,OFFSET VAR1
 7 LEA BX,VAR1+15
 8
 9 #取地址指针指令 LDS LES
10 格式:LDS REG16,MEM        :(DS)<--(MEM+2),(REG16)<--(MEM)
11          LES REG16,MEM          :(ES)<--(MEM+2),(REG16)<--(MEM)
12 说明:取地址指令LDS可以将双字节变量MEM内容的高16位送入到DS,低16位送入指定的REG16中,取地址指令LES可以将双字节变量MEM内容的高16位送入到ES,低16位送入指定的REG16中.
13 注意:这里的REG16不允许为段寄存器

LEA LDS LES

1 格式 :LAFH    ;(AH)<--PSW的寄存器的低8位
2           SAHF    ;PSW的寄存器的低8位<--(AH)
3 说明:指令LAHF可以将PSW寄存器中的低8位传送到集训器AH中,而指令    SAHF可以将AH的内容传送到PSW寄存器的低8位。源操作数和目的操作数的寻址方式均为隐含寻址方式

LAHF SAHF

1 #数据交换指令 XCHG
2 格式:XCHG DST,SRC   ;DTS<-->SRC
3 说明:数据交换指令完成两个操作数之间数据的交换,但两者不能同时为存储单元,XCHG指令可以完成寄存器与寄存器之间、寄存器和存储单元之间的内容交换,但应该注意,这里不能采用段寄存器。

XCHG

 1 #字节转换指令
 2 格式:XLAT    ;(AL)<--((BX)+(AL))
 3 说明:字节转换指令XLAT可以将有效地址BX+AL的存储单元的内容送入AL。当输入为一个字节(AL的内容时)时,输出也是一个字节(同样存放在AL中)
 4 例:
 5      在DS段:
 6
 7              TABLE DB 30H,31H,32H,33H,34H
 8       在CS段:
 9              MOV AL,4
10              LEA BX,TABLE
11              XLAT
12
13 ‘‘‘即AL=34H 字符‘4‘ ‘‘‘

XLAT

 1 #堆栈操作指令
 2 堆栈必须按字操作!且操作数不能为立即数
 3 堆栈的段地址由SS指定,堆栈的偏移地址由SP指定
 4
 5 格式:PUSH SRC
 6          PUSHF
 7          POP SRC
 8          POPF
 9
10 说明:将SRC压入堆栈
11          将PSW的内容压入堆栈
12          从堆栈弹出一个字送入到SRC
13          从堆栈中弹出一个字送入到PSW
14             

PUSH POP PUSHF POPF

2/2

算数运算类指令:

加减法指令     ADD ADC INC     SUB SBB DEC NEG

比较指令             CMP

乘除法指令          MUL IMUL          DIV IDIV

符号扩展指令      CBW CWD

BD数运算调整指令   AAA DAA     AAS DAS     AAM     AAD

#加法指令 ADD ADC
格式:ADD DST,SRC    ;(DST)<--(SRC)+(DST)
         ADC DST,SRC    ;(DST)<--(SRC)+(DST)+(CF)
说明:ADC为带进位的加法指令
ADD ADC指令会正常影响PSW中的6个状态标志位:CF AF OF SF ZF PF

#增量指令
INC DST    ;(DST)<--(DST)+1
INC指令可以影响PSW中的5个标志位,但不会影响CF位。

#减法指令 SUB SBB
格式:SUB DST,SRC
         SBB DST,SRC
说明:同加法
#减量指令
格式:DEC DST
说明:同加法

ADD ADC INC SUB SBB DEC NEG

 1 #比较指令
 2 格    式:CMP DST,SRC     ;(DST)-(SRC),并设置PSW中的 状态标志位
 3 说    明:(DST)-(SRC),并设置PSW中的 状态标志位,但其结果不保存到DST。CMP指令会影响PSW中的6个状态标志位
 4 对两个数进行CMP运算,其主要的目的是为了比较两个数的大小、相等关系
 5 ~若两个数相等,则ZF=1
 6 ~SF等同于最高位
 7 ~CF OF视具体情况而定,
 8 当两个无符号数进行比较时,
 9         如果CF=0 ZF=0则表示DST>SRC
10         如果CF=1 则表示DST<SRC
11 当两个有符号数进行比较时,
12         OF=1表示运算产生了溢出,但大小的比较要根据OF和SG共同决定,当    OF    与上   SF == 0    时,DST >=SRC,当OF SF 同时为1时,DST<SRC

CMP

微处理器状态字PSW各标志位(9个):

CF:进位标志    D7或D15有无进位,有进位CF=1

PF:奇偶标志 操作结果的低8位含有‘1’的个数,偶数个为1,奇数个为0

AF:辅助进位标志   D3位有无进位,有进位AF=1

ZF:零标志位    运算结果为0时ZF=1

SF:符号标志    操作结果为负SF=1

OF:溢出标志  溢出OF=1

DF:方向标志DF=0时,变址寄存器(SI,DI)的内容递增

TF:陷阱标志 TF=1时,CPU处于单步执行方式

IF :中断允许标志 IF=1时,CPU能够响应中断请求

两点说明:

CPU只要涉及运算,其结果就会影响状态标志

段寄存器不能参与运算

   

原文地址:https://www.cnblogs.com/BlogOfEr/p/8366577.html

时间: 2024-10-28 00:44:01

汇编语言指令的相关文章

汇编语言指令英文全称

1.通用数据传送指令MOV----> moveMOV dest,src;dest←srcMOV指令把一个字节或字的操作数从源地址src传送至目的地址dest.MOVSX---->extended move with sign dataMOVZX---->extended move with zero dataPUSH---->pushPOP---->pop进栈出栈指令PUSHA---->push allPOPA---->pop allPUSHAD---->p

汇编语言指令与debug命令符

•MOV与ADD指令 汇编指令 控制CPU完成的操作 形式化语法描述 mov ax, 18 将18送入AX (AX)=18 mov   ah, 78 将78送入AH (AH)=78 add ax, 8 将AX中的数值加8 (AX)=(AX)+8 mov ax, bx 将BX中数据送入AX (AX)=(BX) add   ax, bx 将AX.BX内容相加,结果存入AX (AX)=(AX)+(BX) •说明:汇编指令不区分大小写:两个操作数必须位数一致. •Debug命令 ?R命令:查看.改变CP

汇编语言指令与伪指令

[指令语句]每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句.每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于汁算机内的中央处理器(CPU).存储器.I/O接口等硬件设备来实现的. [伪指令语句]伪指令语句是用于指示汇编程序如何汇编源程序,所以这种语句又叫命令语句.例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中哪些

实验1查看CPU和内存,用机器指令和汇编语言指令编程

(1)实验截图如下:   (2).将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方.     mov ax,1     add ax,ax     jmp 2000:0003 给出第一次和第16次t命令结果截图 (3)查看日期并尝试修改其值. (4)向内存从B8100H开始的单元中填写数据,如: -e B8100:0000 01 01 02 02 03 03 04 04 请读者先填写不同的数据,观察产生的现象:再改变填写的地址,观察产生的现象. 输入数据之后会在上面

汇编语言--百度百科

汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.[1] 许多汇编程序为程序开发.汇编控制.辅助调试提供了额外的支持机

深入理解计算机系统(3.1)------汇编语言和机器语言

<深入理解计算机系统>第三章--程序的机器级表示.作者首先讲解了汇编代码和机器代码的关系,阐述了汇编承上启下的作用:接着从机器语言IA32着手,分别讲述了如何存储数据.如何访问数据.如何完成运算以及如何进行跳转.通过这些步骤,又告诉了我们分支语句.循环语句是怎么完成的,函数调用.栈帧结构以及递归过程.最后能通过编译器产生的汇编代码表示,我们要了解编译器和它的优化能力,知道编译器能为我们完成哪些工作. 而这篇博客我们将讲解汇编和机器代码的关系.首先下面一张图是C语言.汇编语言以及翻译过的机器语言

程序是怎样跑起来的-第10章 通过汇编语言了解程序的实际构成

第10章通过汇编语言了解程序的实际构成 热身问题 1.本地代码指令中,表示其功能的英文缩写称为什么? 助记符.汇编语言是通过利用助记符来记述程序的. 2.汇编语言的源代码转换成本地代码的方式称为什么? 汇编.使用汇编器这个工具来进行汇编. 3.本地代码转换成汇编语言的源代码的方式称为什么? 反汇编.通过返汇编,得到人们可以理解的代码. 4.汇编语言的源文件的扩展名,通常是什么格式? .asm..asm是assembler(汇编器)的简称 5.汇编语言程序中的段定义指的是什么? 构成程序的命令和数

简单的汇编语言译码程序

这里实现的是汇编语言译码. eg:这里的一段MIPS汇编语言指令 ORI $1 $0 7 ORI $2 $0 4 ADD $3 $1 $2 SUB $4 $1 $2 OR $5 $3 $4 AND $6 $3 $4 ORI $7 $6 $12 MOVE $8 $2 SW $1 3 ($9 ) LW $2 3 ($9 ) BEQ $2 $8 -10 INC $2 JAL 01001010010 翻译为二进制之后为: 01001000 00000001 00000000 00000111 01001

汇编语言从入门到精通-预备知识

汇编语言 1.预备知识 1.1 汇编语言的由来及其特点 1.1.1 机器语言 机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码.机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等. 由于机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同,而且它们的指令系统往往相差很大.但对同一系列的CPU来说,为了满足各型号之间具有良好的兼容性,要做到:新一代CPU的指令系统必须包括先前