当前位置:首页 > 教程 > 汇编语言总结(合集6篇)

汇编语言总结(合集6篇)

  • 总结
  • 2024-05-08 10:50:52
  • 160

汇编语言总结 第1篇

在汇编语言中,汇编指令的基本格式:标号 : 指令助记符(必须有)   目的操作数  , 源操作数  ;注释(汇编语言的注释是使用分号) 就像下面这样就是汇编指令。

数据传送指令: MOV  格式:MOV  OPD,OPS  xxx--意思是将源操作数中的数据送入 目的操作数,源操作数不变

MOV指令的传送方向:没画箭头则表示不可以传送。这个表格很重要。 所有的都不能传送到立即数:我们都知道立即数就是一个固定的数,所以当然不能给它传送东西呀。MOV指令的常见格式:

MOV 指令总结:

以下几个指令学了一个学期也没怎么用,具体怎么实验我不太懂,后面用到了我再来解释吧。

有效地址指令:LEA 指令格式:LEA OPD,OPS 指令功能:将源操作数的有效地址传送到目的地址。不影响标志位,注意传送的是有效地址。与MOV不一样,因为传送的是地址,所以源操作数必须是内存操作数。 比如:设BX=0100H,DI=0030H,DS:[ 0030 h]=2436H ,变量DATA 的有效地址为:0050H.

(MOV是数据传送,所以传过去的是物理地址所对应的内容) 从这几个例子里面就能感受到LEA 指令与MOV指令的相同处于不同处了

 基本概念:用于实现算术运算的功能,有单操作指令,双操作指令,还有隐含操作指令。操作数可以是8位也可以是16位。不允许两个操作数都是存储单元,目的操作数不能是立即数,操作数位数要一致(这些前面都有提到,基本上适合所有的指令)

INC和xxx除了不影响CF位,其他的都影响,ADD、ADC、SUB.....等均影响标志寄存器。

符号扩展是指用一个操作数的符号位(就是指最高位,二进制)形成另外一个操作数,形成的操作数是各位全为0(最高位为0)或者各位全为1(最高位为1)。符号扩展不改变大小。

xxx制调整指令是对二进制运算的结果进行xxx制调整,以得到xxx制的运算结果。

为什么需要这个xxx制的调整指令? 和前面说的BCD码牵扯到联系。

计算机用二进制运算规律进行xxx制的运算,用4位二进制数表示一位xxx制数,一位xxx制数逢10进一,4位二进制数是逢16进1 ,结果大于9或者AF、CF等于1时需要调整。

压缩BCD码:是用4个二进制位表示一个xxx制位 非压缩BCD码:用8个二进制位表示一个xxx制位,低4位表示一个xxx制位,高4位通常默认为0

BCD码的加、减、乘、除调整指令的调整对象均为隐含寄存器AL,BCD码运算只能使用以AL寄存器为目的操作数的8位数运算指令。

逻辑运算指令用于实现逻辑运算功能,对象是二进制

 移位指令都是两个操作数,一个是目的操作数,一个是需要移动多少位,其中,移动位数如果为1,可以直接写,如果移动位数大于一,需要先将移动位数放到CL寄存器,然后再作为移位指令的源操作数。两个操作数的位数不一定需要位数相同。

左是乘,右是除

逻辑移位指令:(无符号数),SHL:无符号数倍增,SHR:无符号数倍减 算术移位指令:(有符号数),SAL:有符号数倍增,SAR:有符号数倍减

 指令格式: ROL  OPD,OPS      ;不带进位循环左移 ROR OPD,OPS      ;不带进位循环右移 RCL OPD,OPS       ;带进位循环左移 RCR OPD,OPS      ;带进位循环右移 举例: MOV AX,458FH ; AX= 458F H = 0100 0101 1000 1111 MOV CL,4 ;CL=4 ROR AX ,CL;AX循环右移4位, AX = 1111 0100 0101 1000 = 0F458H ROR AX,CL ;AX 循环右移4位,AX = 1000 1111 0100 0101 = 8F45 H 

 对于汇编的源程序,程序是都是按照顺序进行的,但是如此程序的每一步都按照顺序来执行,如果遇到需要执行相同过程的程序,就没有必要都写出了,或者说是没必要花费时间在这上面。所以我们可以改变程序的执行顺序。

以下介绍:五种控制转移指令无条件转移指令、条件转移语句、循环控制指令、子程序调用及返回指令、程序返回指令  

无条件转移指令:JMP 指令格式:JMP LABLE(目标的位置) 指令功能:程序无条件跳转到指定的地址,从地址指令处开始执行程序,必须指明跳转的地址。 LABLE:是程序要跳转的地址,其中LABLE是否与当前指令在一个代码段,所以无条件转移指令又分为 段内转移 和 xxx转移 段内转移:         在当前代码段的范围64KB内转移(正负32KB范围)称为近转移(NEAR PTR ),         转移范围在段内  -128~ - 127  称为短转移(SHORT)。         段内转移CS段地址不变,只改变IP 偏移地址。xxx转移:         从当前代码段转移到另一个代码段,转移范围是1MB,需要改变CS和IP的偏移地址,因此目的地址必须用一个32位的表达式。         比如:JMP FAR PTR  LABLE ;转移到LABLE 的位置,IP = LABLE,CS =  LABLE 的的代码段的段地址。         比如:JMP FAR PTR mem ,其中mem 是xxx元的地址,从men 开始的4个连续的单元里面存放着2个16位的地址,一个是目标的偏移地址(低地址单元),一个是目标的段地址(高地址单元):即 IP = [ mem ] , CS = [ men + 2 ] 。 而对于 LABLE 的不同的寻址方式又分为: 直接寻址:转移地址在指令代码中 间接寻址:转移地址在寄存器或者xxx元中 在汇编语言中,汇编程序会自动根据目标的地址距离,自动处理成短转移、近转移、远转移。我们只需要根据需要设置相应的操作xxx:SHORT 、 NEAR PTR 或者 FAR PTR 强制。  

条件转移语句:JCC 注意:条件转移语句都是端内短转移 语句格式:JCC LABLE  指令功能:如果上一条指令的条件满足,则发生转移,不满足则不发生转移,继续执行下一条语句。转移的范围与SHORT 相同。转移范围在段内  -128~ - 127 。 指令中的条件即为状态标志的标志。在8086中有16种可用的条件 这些调整可分为:判断单个标志位的状态、比较无符号数的高低、比较有符号数的大小。1.判断单个标志位的状态: Z (Zero  0)、E (Equal  相等)、S(Sign 符号)、O(Over 溢出) P(Parity 奇偶)、C(Carry 进位)

2.无符号数比较高低(高:Above    低:Below):条件为一个标志或者标志组合 CF 来确定高低、ZF确定相等

( < )JB、JNAE、JC  

3.有符号数比较大小(大:Greater    小:Less):条件为标志组合。  

4.测试CX 值为0 的指令,CX = 0,则条件转移 指令格式:JCXZ   LABLE   

循环控制指令

循环结构是程序设计中使用最多的一种数据结构。 8086 提供了三条专用指令。循环指令默认利用CX寄存器,属于段内短转移 。

指令格式:LOOP  LABLE

先是CX 的值自动减一,判断是否为0,如果CX为0则执行下一条语句,退出循环,如果CX不等于0 ,则转移到地址LABLE 处执行指令

LOOPZ  /  LOOPE    LABLE   CX 先减一,如果CX 不等于0 且ZF =1 ,转到LABLE处执行指令,否则退出循环,执行下一条指令 LOOPNZ / LOOPNE LABLE  CX 先减一,如果CX 不等于0 且ZF =0 ,转到LABLE 处执行指令,否则退出循环 其中:CX一般设置在标号LABLE 的前面,ZF=0和ZF=1 的意思:LOOP 执行前ZF的状态。

 子程序调用及返回指令:CALL 子程序是完成特定功能的一段程序,写程序的过程中,经常使用到子程序的调用。子程序的调用可以提高编程的效率,使程序的结构更加清楚,便于维护。

子程序的调用指令:CALLxxx-->程序转移到子程序的起始处开始执行。 程序执行CALL指令时,会自动把下一条指令的段地址和偏移地址压入堆栈,保护起来。 CALL指令 位于主程序,CALL调用的子程序与CALL指令可以处于同一代码段也可以在不同的代码段,所以可以分为xxx调用和段内调用,调用时可以是直接寻址也可以是间接寻址 所以指令有4种格式: 段内直接调用:CALL NEAR PTR LABLE 段内间接调用:CALL   寄存器16位 xxx直接调用:CALL FAR PTR LABLE  xxx间接调用:CALL  xxx元

程序返回指令:RET RET指令是子程序最后执行的指令,作用为断点出栈,就是将CALL自动保存的下一条指令的CS :IP 出栈 根据子程序与主程序是否处于同一个代码段内,返回指令也分为段内返回和xxx返回(指令的助记符都是LEA,执行时,由程序自动识别) 指令格式: RET    ;无参数段内或者xxx返回, RET n ;有参数段内或者xxx返回,n 为一个16位的立即数,                将堆栈指令SP加上n ,SP = SP+n  

段内返回:只需要将IP出栈,IP = SS :[ SP],SP =SP+2 xxx返回:IP 和CS出栈,IP = SS:[ SP ],SP =SP +2   ,CS = SS :[ SP ] ,SP = SP +2  

在存储器中存放一组连续数据,称为数据串,对数据串进行操作的指令称为串操作指令。操作数可以是字节(B)也可以是字(W)

串操作数是存放在内存中的,串的首地址存放在指定的寄存器中,指每执行一次串操作令,串操作数的地址会自动进行调整,这样就可以对字符串进行操作。

以下将依次介绍: 串传送指令、串存储指令、串读取指令、串比较指令、串扫描指令、重复前缀指令

串操作数的寻址:

 串传送指令:

 串存储指令:

串读取指令:

串比较指令:

串扫描指令: 

重复前缀指令:(类似于LOOP指令)

概念:处理器控制指令用于控制CPU的操作,实现对CPU的管理,主要有: 有标志寄存器,使CPU通过暂停、等待、与外部设备同步,使CPU空操作等。

概念:输入输出指令是控制CPU与外设交换数据的指令。

概念:中断也是一种改变程序执行顺序的方法。

中断是指:CPU暂停现在运行的程序,转去处理 I/O 设备的请求或者某系紧急的事件,紧急事件处理结束后,CPU会返回原来的程序运行,这个过程就叫做中断过程。

引起中断的事件或者设备叫做“中断源”,原程序被中断的地方叫做“断点”。CPU被中断后转去执行的程序叫做“中断处理程序”或者“中断子程序”。

汇编语言总结 第2篇

反汇编命令:U 可以在后面指定反汇编的地址和结束地址,或者反汇编的长度,如果不指定,默认从当前CS:IP所指位置开始

显示xxx元内容命令:D 从指定地址开始显示一定范围xxx元的内容,也可以是数据段的内容 比如:D DS:0000 D 1256:0

修改xxx元内容命令:E 将数据输入到内存中指定的地址。 比如:E  1000:10

查看或者修改寄存器的内容:R R 显示当前所有寄存器的内容 R 寄存器名  (显示并修改寄存器的内容)

跟踪命令:T

跟踪一条指令或者一个子程序:P    CALL、INT 21H等

运行程序命令:G 跳转到指定地址执行

退出DEBUG:Q

想要在debug里面(内存)直接写入汇编语句:A

 

例:BUF的段地址是0500第H,偏移地址为0015HBUF为字类型变量。

BUF  DW  1111H, 2255H, 3333H

BUF1  DB  9 DUP (1)

求下列指令执行后寄存器的值。

MOV     SI, OFFSET BUF         SI0015H

MOV     BX, SEG BUF            BX0500H

MOV     DI, TYPE BUF         DI2

MOV     CX, LENGTH BUF1       CX9

MOV     DX, SIZE BUF1           DX9

MOV     AL, BYTE PTR BUF3    AL22H

例:BUF的段地址是0500H,偏移地址为0015HBUF为字类型变量。

BUF  DW  1111H, 2255H, 3333H

BUF1  DB  9 DUP (1)

求下列指令执行后寄存器的值。

MOV     SI, OFFSET BUF         SI0015H

MOV     BX, SEG BUF            BX0500H

MOV     DI, TYPE BUF         DI2

MOV     CX, LENGTH BUF1       CX9

MOV     DX, SIZE BUF1           DX9

V   AL, BYT PTR BUF3    AL22H

汇编语言总结 第3篇

(1)指令语句格式:[标号:]   指令助记符 操作数[,操作数] [;注释]

     标号:标号的名字由用户自定义,标号后面必须有冒号,代表该指令在代码段中的偏移地址,为分支,循环,调用等指令提供目的地址。标号是不能以数字开头的字符、数字串,长度不超过31个字符,不能使用保留字,保留字包括指令助记符、伪指令助记符、寄存器符号等。     注释:汇编程序在翻译源程序时不对它们做任何处理。

(2)伪指令语句:伪指令是在程序汇编期间由汇编程序处理的操作。                                [名字]  伪指令助记符  参数,参数…[;注释] 名字:是反映伪指令偏移地址的标识符,后面没有冒号。取名与标号的取名一样。 伪指令助记符:表示伪指令的所要完成的操作。 参数:为伪指令要求的内容,常数、变量、表达式,允许多个。 比如:

完整的汇编语言由若干个代码段、数据段、附加段、和堆栈段组成,段与段之间的顺序可以随意调换。

可运行的程序必须包括代码段,并需要指明程序的起始语句,数据段、堆栈段、附加段都不是必须的

指令语句必须位于某个代码段内,伪指令可按需要位于任一段内。

语句参数分数值型参数(立即数)和地址型参数(标号、变量)

1.常数 ,表示一个固定的数值,就是一个数,(xxx制、字符串、ASCII码、符号常数等都是)

2.符号常数定义伪指令(EQU 、=)

3.数值表达式: 由常数、寄存器、变量及标号名等用运算符连接起来的式子

(1)算术运算符:+、-、*、/、MOD(取余)、SHL、SHR

(2)逻辑运算符:AND、OR、XOR、NOT

(3)关系运算符: EQ(等于)、NE(不等于)、GT(大于)、LT(小于)、GE(大于等于)、LE(小于等于)

指:标号,变量,地址表达式 包括变量名、xxx、过程名

标号和变量都具有三种属性:段属性、偏移地址属性、类型属性

例如: 例:BUF的段地址是0500H,偏移地址为0015H,BUF为字类型变量。 BUF  DW  1111H, 2255H, 3333H BUF1  DB  9 DUP (1) 求下列指令执行后寄存器的值。MOV       SI, OFFSET BUF             ;SI=0015H  ;offset:变量或者标号的偏移地址MOV       BX, SEG BUF                  ;BX=0500H ;SEG 变量或者标号的段地址 MOV       DI,  TYPE  BUF               ;DI=2  ;返回类型大小(DB、DW、DD、DF、DQ、、、) MOV       CX,  LENGTH   BUF1         ;CX=9  ;变量的单元数 MOV       DX, SIZE BUF1             ;DX=9  ;变量的字节数=LENGTH * TYPE MOV       AL, BYTE PTR BUF+3      ;AL=22H

 (1)强制类型转换:(WORD、BYTE)PTR

(2)数值返回操作符:

表达式是变量:DB=1,DW=2,DD=4 比如:BUF DW 1111H,2222H,3333H MOV DI,TYPE BUF ;DI=2

表达式是标号:NEAR=-1,FAR=-2 表达式是常数:=0

汇编语言总结 第4篇

接下来需要记好多的寄存器

预备知识:

计算机的指令由操作码字段和操作数字段组成,操作码字段是指明计算机所要执行的操作,比如后面我们的MOV,就是传送的意思,操作数是指令的处理对象。、

其中对于操作数,8086操作数可以是 0个操作数(比如后面会用到的:CLD),一个操作数(比如:JMP A),两个操作数(比如 MOV AX,BX)。其中分别也叫:零地址指令、一地址指令、二地址指令

源操作数src(OPS)是:用来存放运算的数据,目的操作数dst(OPD):存放运算的数据或者运算的结果。

指令操作数可以存放在 指令 、 寄存器 、内存 、 端口中,其中端口是接口中的寄存器。

其中操作数可以分为三类

重点掌握:立即寻址、寄存器寻址、直接寻址

段地址:ES    偏移地址:EA

8086CPU有4个段寄存器,每个段寄存器用来确定一个逻辑段的起始位置,每种逻辑段均有各自的用途 CS(代码段):指明代码的起始位置 (必须要有)利用CS:IP来取得下一条要执行的指令 SS(栈堆段):指明栈堆段的起始位置  利用SS:SP操作堆栈顶的数据 DS(数据段):指明数据的起始位置,利用DS:EA存取数据段中的数据 ES(附加段):指明附加段的起始位置, 利用ES:EA存取附加段中的数据 注意: EA是偏地址,称之为有效地址EA 若操作数在主存中,存取的方法有直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式  ,基址变址寻址方式和相对基址变址寻址方式。

 立即寻址方式:

操作数类型是立即数,存放在指令中

常用于给寄存器或者xxx元赋值,在二地址操作数指令中,目的操作是不能是立即数。

寄存器寻址方式:

操作数在寄存器中,在指令中指明寄存器的名称。

常用于寄存器之间传送数据

前面我们知道,操作数的类型有三类:立即数 、寄存器操作数 、(内存)存储器操作数。除了以上的两种寻址方式,下面的五种寻址方式均为存储器操作数,讲述的是不同地址形式的指定操作数所在段的有效地址(也就是偏移地址EA)

以下均为存储器寻址方式。 存储器寻址用到  物理地址=段地址+偏移地址

直接寻址方式:

操作数默认在数据段(DS),其表示的是对应物理地址所对应的内容。

寄存器间接寻址方式:

操作数在内存中   [ ]  方括号里面只能是BX,BP,DI,SI

寄存器的相对寻址方式:

其实就是上面的寄存器寻址方式加一个偏移量而已。

 ​​​​​​基址变址寻址方式:意思是用一个基址寄存器和一个变址寄存器的值相加为其偏移地址。(各一个,有4种情况)

相对基址变址寻址方式:

就是在基址变址的基础上加一个偏移量,寄存器的使用和基址变址的使用是一样的。

汇编语言总结 第5篇

8086的内部结构是16位(Byte)的,内外数据总线均为16条,可以处理16位和8位的数据 但是其地址总线是20位的,所以其寻址能力是:2^20B=1MB,范围是00000H ~ 0FFFFFH

 1.对于指令执行单元:EU

2.总线接口单元BIU:负责CPU和存储器之间的信息传送。

上面我们有提到以下几个东西:

指令队列:其是一个大小为6字节的寄存器,所以指令队列里面最多存放6个字节指令,因为是一个队列,所以遵循先进先出的原则。当指令队列为空时,BIU自动执行总线的操作,取指令存入指令队列再执行。当程序发生转移的时候,BIU需要重新取指令执行,这时取的指令不用放到指令队列,而是直接存入EU去执行,执行的同时BIU依旧会不断的取指令。

地址加法器:是将指令指针IP和段寄存器CS或者将EU送来的偏移量与段寄存器DS形成一个20位的物理地址,从寄存器中取出指令或者数据。

过程如下:

 寄存器位于内存储器的特殊区域的说法是错误的。

寄存器是一种特殊的存储器,这样说才对。

微机一般分为主机(含CPU、内存)和外设(含外存、I/O设备)。

寄存器一般视为CPU的一部分,所以“寄存器是一种特殊的内存储器”根本不对。

如果按照冯·诺伊曼模型,分为I/O设备、运算器、控制器、存储器,这种分法又没有将内存储器单独提出来,所以这句话还是错的。

“寄存器是一种特殊的存储器”,这样说才对。

寄存器到后面会用到,用到再说

8086有两个控制寄存器:IPxxx指令指针寄存器,PSW或flagsxxx标志寄存器或叫程序状态字寄存器

其中条件码标志有六个: 作用是用来记录程序运行结果的状态信息,运行的结果由CPU自动设置,后续主要用于条件转移控制的条件,所以叫条件码。

控制标志有三个:

在DEBUG中,不会显示什么ZF=1或者CF=1,而是如以下显示

 

CS(代码段):用来存放当前正在运行的程序(必须有)DS(数据段):用来存放当前运行程序所用的数据。SS(堆栈段):定义堆栈所在的区域,堆栈是一种数据结构,它开辟了一个比较特殊的存储区域,这个特殊的区域是通过先进后出的方式的来访问这一段区域。ES(附加数据段):是附加的数据段,是一个辅助的数据区域,也是存串处理的指令的目的操作数的存放区域,  

除非专门去指定,一般情况下,各段在存储器中的分配是由操作系统负责的,每个段可以独立占用64K的存储区。各段也是可以重叠的,重叠是指段区域的大小可以根据需要来指定大小,不一定要占64K,虽然说段的区域是由系统分配的,但是系统运行时程序员在必要时可以指定所需要的占用的内存空间。

汇编语言总结 第6篇

 系统功能的调用:一般是指调用DOS的INT 21提供的子程序。调用BIOS提供的中断子程序称为“BIOS调用”

DOS的调用过程 (1)将系统的功能号送到AH (2)在指定的寄存器中设置有关的入口参数 (3)INT 21H ;这是DOS的中断处理程序,对于不同的系统的功能号,可以完成对不同设备的控制。这个是一段中断子程序,调用后会自动改变AH、AL的内容。注意:在DEBUG的调试过程中,遇到INT 21H只能使用P指令,不能用T

常用的功能调用:

格式:MOV AH,1 INT  21H 功能:等待用户从键盘输入一个字符,并将输入字符的ACSII码送到AL寄存器(输入的字符我们要在AL寄存器里面去找),同时到屏幕上面显示。 说明:执行该调用时,计算机的屏幕上会出现一个闪亮的光标,等待用户输入单个字符,当随便按下一个键,该键的ASCII码将被放入AL寄存器,并将该字符在显示器上显示,不需要按Enter键结束。

格式:MOV AH,2 MOV DL, 字符的ASCII码  INT 21H 功能:在屏幕当前的位置显示DL寄存器中的字符,并将光标后移一格  

格式:MOV  AH,9 MOV DX ,字符串的首地址 INT 21H  功能:将当前数据区DS:DX 所指向的以 $ 结尾的字符串送到显示器上显示。  

格式:MOV  AH,10 MOV DX,字符串的首地址 INT 21H  功能:从键盘接受一个 字符串,并存入用户定义的输入缓冲区。 该指令的调用,要求输入缓冲区按照规定的格式去定义,并且一定要在当前的数据段, 缓冲区的格式如下定义: BUF DB n           DB ?          DB n DUP (?) 定义的输入缓冲区, 第一个字符表示:缓冲区能容纳的字符个数 第二个字节表示:保留一个字节单元,由系统自动存入用户从键盘输入的字符个数(就是我们实际输入的字符个数,不包括回车字符)。所以我们输入的字符是从第三个字节开始存放用户从输入的ASCII码的(这里包括回车字符)。当实际输入的字符个数小于缓冲区的大小时,缓冲区的其余字节自动填0,当实际输入的字符大于缓冲区的大小时,多余的字符会丢失,并且扬声器发出警示音。

格式: MOV  AH,004CH INT  21H 功能:4CH号功能的调用,结合当前正在执行的程序,返回DOS系统,无入口参数。