汇编语言期末复习不挂科——知识点总结

本文详细介绍了汇编语言中的关键伪指令如Even、Align和ORG,以及内存变量和标号的属性操作。内容涵盖数据传送、算术运算、逻辑运算、移位操作和比较指令,强调了指令系统的分类和实际应用,对前端开发者准备面试有参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字不能作为标识符

常见的偏移量伪指令

Even、Align、org

Even 偶对齐伪指令 本伪指令下面的内存变量从下一个偶地址单元开始分配

Align NUM,NUM必须是2的幂

ORG 数值表达式,本伪指令下面的内存变量从该“数值表达式”所指定的偏移量开始分配。

重复说明符

count DUP(表达式,表达式…)

例如:BUFFER DB 100DUP(?),重复100个?

LEA指令和OFFSET的联系与区别

相同:都是取偏移指令的操作

注意事项:1.lea、offset指令的源操作数必须是内存操作数

2.lea、offset指令的目的操作数必须是16位寄存器

3.lea指令不影响状态标志寄存器内容。

区别:4.offset指令的源操作数不能是下标(类似数组),lea可以。

5.offset在汇编时生效,lea在指令执行时才生效。

内存变量和标号的属性

1.类型属性操作符:TYPE是返回该变量所占字节数,或标号的远近类型。在这里插入图片描述

2.长度属性操作符:LENGTH是针对内存变量的操作符,它返回重复操作符DUP中的重复数。如果有嵌套的DUP,只返回最外层的重复数。如果没有DUP,则返回1

3.容量属性操作符:SIZE是针对内存变量的操作符

SIZE(变量)=LENGTH变量×TYPE变量

强制属性操作符

数据类型 PTR 地址表达式

例如:MOV byte ptr[BX],1H

存储单元别名操作符

操作符THIS的一般格式为:<变量名>equ this <类型>

<变量名>DB|DW|DD <表达式>

例如:WBUFFER EQU THIS WORD

BUFFER DB 20DUP(?)

进制伪指令RADIX

.RADIX exp 伪指令前面要用点开始,exp的值必须是[2,16]内的一个整数

.radix 8

B1 DB 10,11,12 这三个数是八进制

等价语句

符号名 EQU 表达式 ,其作用是用左边的符号名来代表右边的表达式

例如:GREETING EQU ‘How are you!’

在该定义之后,就可以使用符号GREETING 来代表字符串‘How are you!’

指令系统


指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有一些实现其他功能的指令,也有为某种特殊的应用而增设的指令。

指令按其功能分成以下几大类:数据传送指令、标志位操作指令、算术运算指令、逻辑运算指令、移位操作指令、位操作指令、比较运算指令、循环指令、转移指令、条件设置字节指令、字符串操作指令、ASCII-BCD码运算调整指令和处理器指令等。

数据传送指令

  • 传送指令MOV

格式如下:MOV Reg/Mem,Reg/Mem/Imm

寄存器Reg 存储器Mem 立即数Imm


注意:①两个操作数的数据类型要相同,要同为8位、16位

②两个操作数不能同时为段寄存器,

③代码段寄存器CS不能为目的操作数,但可作为源操作数

④立即数不能直接传给段寄存器

⑤立即数不能作为目的操作数

⑥指令指针IP,不能作为MOV指令的操作数

⑦两个操作数不能同时是存储单元

在这里插入图片描述

  • 传送—— 填充指令

是把位数短的数据传送给位数长的目的操作数

MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm

MOVSX用符号位填充,MOVZX用0来填充

  • 交换指令XCHG

XCHG Reg/Mem,Reg/Mem

作用是交换两个寄存器,寄存器不能是段寄存器,两个操作数不能同时为内存变量

  • 取有效地址指令LEA

指令LEA是把一个内存变量的有效地址送给指定的寄存器,格式:LEA Reg,Mem

LEA指令和OFFSET的联系与区别

相同:都是取偏移指令的操作

注意事项:1.lea、offset指令的源操作数必须是内存操作数

2.lea、offset指令的目的操作数必须是16位寄存器

3.lea指令不影响状态标志寄存器内容。

区别:4.offset指令的源操作数不能是下标(类似数组),lea可以。

5.offset在汇编时生效,lea在指令执行时才生效。

  • 取段寄存器指令

LDS/LES Reg,Mem

该组指令的功能是把内存单元的一个低字传送给指令中指定的16位寄存器,把随后的一个高字传给相应的段寄存器。

若Reg是16位寄存器,那么Mem必须是32位指针

  • 进栈操作

PUSH Reg/Mem

  • 出栈操作

POP Reg/Mem

  • 转换指令XLAT

无操作数,但有两个隐含操作数BX和AL

指令格式如下:XLAT/XLATB,其功能是把BX的值作为内存字节数首地址,下标为AL的数组元素的值传送给AL

FLAG寄存器

  • ZF标志,零标志:计算结果为0置1,不为0置0

  • PF标志,奇偶标志:计算结果二进制数有奇数个1还是偶数个1,奇数个1写0,偶数个1写1

  • SF标记,符号标记:运算结果为正,置0;为负,置1

  • CF标志,进位标志:最高位是否有进位或错误,有置1,没有置0

  • OF标志,溢出标志:8位数是否超过-128到127,是溢出置1

  • AF标志,辅助进位标志,低4位是否向高4位进位或借位,是置1,否置0

算术运算指令


加法指令

1.ADD加法指令:把源操作数的值加到目的操作数

2.ADC带进位加指令:把源操作数和进位标志CF一起加到目的操作数

3.INC指令:操作数的值加1

4.交换加指令XADD:先交换两个操作数的值,在镜像加法运算

减法指令

1.SUB减法指令:从目的操作数中减去源操作数

2.SBB带借位减法:把源操作数和标志位CF的值从目的操作数中一起减去

3.DEC减法:把源操作数的值减去1

4.求补指令NEG:改变操作数的正负号

乘法指令

MUL指令:隐含目的操作数,把源操作数和AL(AX)的值相乘保存到AX(DX+AX)中

除法指令

DIV指令:在这里插入图片描述

类型转换指令


系统提供了四条数据类型转换指令:CBW、CWD、CWDE、CDQ

CBW字节转换为字指令:隐含操作数AH和AL,其功能是用AL的符号位去填充AH

CWD字转换为双字指令:隐含操作数DX和AX,其功能是用AX的符号位去填充DX

逻辑运算指令


逻辑与指令

指令格式:AND Reg/Mem,Reg/Mem/Imm

在这里插入图片描述

逻辑或指令

指令格式:OR Reg/Mem,Reg/Mem/Imm

在这里插入图片描述

逻辑非

指令格式:NOT Reg/Mem

在这里插入图片描述

在这里插入图片描述

TEST指令

格式:TEST Reg/Mem,Reg/Mem/Imm

功能是对两个操作数进行逻辑与运算,但结果不送至目的操作数,只是影响状态标志

作用是检测一些条件是否满足,但又不希望改变操作数,即使用于检查一个字节或字中的某些特定位是否有一位为1

移位指令


1.SHL指令(逻辑左移)

相当于将数倍增

在这里插入图片描述

2.SHR指令(逻辑右移)

将一个无符号数向右移动,左边出现空位补0,右边低位移至CF

在这里插入图片描述

3.SAL指令(算术左移)

SAL指令同SHL,实际上SHL和SAL是同一条指令的两种助记符,它们执行的操作完全一样。

4.SAR指令(算术右移)

SAR类似于SHR,SAR同SHR的区别是:SHR连同符号位一起右移,左边最高位出现的空位补0;而SAR右移时符号位不动,左边出现的空位补上符号位的值。

其中值得注意的一点是:如果目的操作数是负数,且其中具有1的位数移出后,则SAR指令产生的结果与用整数IDIV指令产生的结果不一样。

例如:-5经SAR右移之后得-3,IDIV之后为-2

5.ROL指令(循环左移)

功能:每执行一次,把最高位移到最低位,同时还把最高位移到CF

在这里插入图片描述

6.ROR指令(循环右移)

与ROL指令类似

在这里插入图片描述

7.RCL指令(通过进位循环左移)

RCL指令对目的操作数1字节或字中的各位循环左移,进位标志CF被看作目的操作数的“一部分”。每执行一次,CF的值循环移入目的操作数的低位,而目的操作数的最高位移入CF。

在这里插入图片描述

8.RCR指令(通过进位循环右移)

RCR与RCL类似,

在这里插入图片描述

比较指令CMP

功能:用第二个操作数去减第一个操作数,并根据所得的差设置有关标志位,为随后的条件转移指令提供条件,但并不保存该差,所以不会改变指令中的操作数。

循环指令

CX寄存器中存放循环次数,一般循环跳转是,CX先减1,后判断CX是否为0

LOOP 标号

在这里插入图片描述

相等或为零循环指令

LOOPE/LOOPZ 标号

在这里插入图片描述

在这里插入图片描述

总结

=============================================================

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;如果因为我的笔记太过简陋不理解,可以关注我以后我还会继续分享。

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值