汇编语言总结(合集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,偏移地址为0015H,BUF为字类型变量。
BUF DW 1111H, 2255H, 3333H
BUF1 DB 9 DUP (1)
求下列指令执行后寄存器的值。
MOV SI, OFFSET BUF ;SI=0015H
MOV BX, SEG BUF ;BX=0500H
MOV DI, TYPE BUF ;DI=2
MOV CX, LENGTH BUF1 ;CX=9
MOV DX, SIZE BUF1 ;DX=9
MOV AL, BYTE PTR BUF+3 ;AL=22H
例:BUF的段地址是0500H,偏移地址为0015H,BUF为字类型变量。
BUF DW 1111H, 2255H, 3333H
BUF1 DB 9 DUP (1)
求下列指令执行后寄存器的值。
MOV SI, OFFSET BUF ;SI=0015H
MOV BX, SEG BUF ;BX=0500H
MOV DI, TYPE BUF ;DI=2
MOV CX, LENGTH BUF1 ;CX=9
MOV DX, SIZE BUF1 ;DX=9
V AL, BYT PTR BUF+3 ;AL=22H
汇编语言总结 第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系统,无入口参数。
本文由admin于2024-05-08发表在叁佰资料网,如有疑问,请联系我们。
本文链接:http://www.sanbaiyy.com/p/20088.html
上一篇
领导年度个人总结(推荐22篇)
下一篇
2000字期末总结(优选42篇)