当前位置: 首页 > article >正文

考研拓展:汇编基础

一.说明

本篇博客是基于考研之计算机组成原理中的程序机器级代码表示进行学习的,并不是从汇编语言这一门单独的课程来学习的,涉及的汇编语言知识多是帮助你学习考研之计算机组成原理中对应的考点。

二.相关寄存器

1.相关寄存器

X86处理器中有8个32位的通用寄存器,各寄存器及说明:

名称说明作用
EAX累加器什么数据都可以存
EBX基地址寄存器什么数据都可以存
ECX计数寄存器什么数据都可以存
EDX数据寄存器什么数据都可以存
ESI变址寄存器用于线性表、字符串的处理
EDI变址寄存器用于线性表、字符串的处理
EBP堆栈基指针用于实现函数调用
ESP堆栈顶指针用于实现函数调用

注意:上面四个寄存器的使用非常灵活,可以只使用它的16位,甚至只使用它的8位,而后面四个寄存器则比较呆,只能单独一起使用32位。

单独使用前4个寄存器,名称如下:

TuZl.jpg

2.读取长度

如何指明内存地址的读写长度:

dword ptr               //双字,32bit
word ptr                //单字,16bit
byte ptr                //字节,8bit

三.常用指令

1.常见算术运算指令

功能汇编指令格式注释
add d,s计算d+s,结果存入d
sub d,s计算d-s,结果存入d
mul d,s无符号数d*s,乘积存入d
div d,s无符号数除法:edx:eax/s,商存入eax,余数存入edx
取负数neg d,s将d取负数,结果存入d
自增++inc d,s将d++,结果存入d
自减–dec d,s将d–,结果存入d
imul d,s有符号数d*s,乘积存入d
idiv d,s有符号数除法:edx:eax/s,商存入eax,余数存入edx

注意1:这里面需要注意的是除法运算edx:eax是什么意思,在除法运算时,首先被除数要进行位扩展,把32位扩展为64位,再用64位的被除数除32位的除数,商存入eax,余数存入edx。这里面使用的隐含寻址的数据寻址方式,2个寄存器(32位)连起来使用存储64位的被除数,所以用:号连接。

2.常见逻辑运算指令

功能汇编指令格式注释
add d,s将d、s逐位相与,结果放回d
or d,s将d、s逐位相或,结果放回d
not d将d逐位取反,结果放回d
异或xor d,s将d、s逐位异或,结果放回d
左移shl d,s将d逻辑左移s位,结果放回d(通常s是常量,即立即数)
右移shr d,s将d逻辑右移s位,结果放回d(通常s是常量,即立即数)

补充:这里常见的逻辑运算和算术运算,如果你不了解,可以查看逻辑与算术运算

3.补充指令

  • 功能:数据传送
  • 指令格式:mov d,s
  • 注释:将第二个操作数复制到第一个操作数,但不能用于直接从内存复制到内存

四.汇编格式

使用不同的编程工具开发程序时,用到的汇编程序也不同,一般有两种不同的汇编格式:AT&T格式和Intel格式。

我们之前学的X86汇编语言都是Intel格式。

T6tq.jpg

两种格式需要注意的点都在这里了。

五.选择语句的机器级表示

1.无条件转移指令-jmp

  • jmp <地址> PC无条件转移至<地址>
  • jmp 128 <地址>可以用常数给出
  • jmp [999] <地址>可以来自于主存
  • jmp eax <地址>可以来自于寄存器
  • jmp NEXT <地址>可以用“标号”锚定

2.有条件转移指令

THLx.jpg

需要注意的是,因为是有条件注意,所以它经常和cmp比较指令一起组合使用

例如:

cmp eax,ebx                    #比较寄存器eax和ebx里的值
jg NEXT                        #若eax > ebx,则跳转到NEXT:

3.C语言程序编译成汇编程序

示例如下:

TwkH.jpg

六.循环语句机器级表示

循环语句我们非常熟悉了,也知道他们之间可以互相转换。

例如:

int result = 0;
for(int i=0;i<=100<i++){
	result +=i;
}

可以转化为while循环

int i=1;
int result = 0;
while(i<=100){
result +=i;
i++;
}

那么转化的汇编语言程序是什么呢?

mov eax 0            #用eax保存result, 初值为0
mov edx, 1           #用edx保存i, 初始值为1
cmp edx,100          #比较i和100
jg L2                #若i>100,转跳到L2执行
L1 :                 #循环主体
add eax,edx          #实现result +=i
inc edx              #inc自增指令,实现i++
cmp edx,100          #i和100
jleL1                #若i<=100,转跳到L1执行
L2 :                 #跳出循环主体

这里补充介绍一条命令:

loop  NEXT
<===>
dec ecx
cmp ecx,0
jne NEXT

理论上能用loop指令实现的功能,也一定能用条件转移实现。

补充:本篇博客仅仅针对于考研之计算机组成原理指令系统这一章节,仅作了解即可。


http://www.kler.cn/a/15788.html

相关文章:

  • 【redis】—— 环境搭建教程
  • vue如何实现组件切换
  • [Linux]多线程详解
  • 【星海随笔】ZooKeeper-Mesos
  • 动力商城-03 Idea集成apifox Mybatis-Plus字段策略
  • 浅层神经网络
  • Python 多线程实例
  • 「SQL面试题库」 No_53 项目员工II
  • web小游戏开发:华容道(一)
  • WordPress切换为经典编辑器可视化/文本切换不显示解决方法
  • 入参校验产品化 schema
  • SQL server 数据库同步(发布与订阅)【解决办法】
  • 即时通讯独立系统源码包含Android 、iOS、PC
  • RabbitMQ笔记
  • Mysql 日志
  • 【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!
  • 2023有潜力的新药都有哪些?新药筛选方法总结
  • VP记录:Codeforces Round 867 (Div. 3) A~G2
  • GeoTools实战指南: 一步步教您轻松实现Shapefile矢量图层可视化
  • 使用Git和GitHub完成团队项目开发
  • 【python基础语法三】列表,元组,集合,字典相关操作
  • 数据可视化大屏的页面布局以及自适应
  • CVE-2023-28432 MiniO信息泄露漏洞复现
  • 哈夫曼树【北邮机试】
  • LCD、OLED、Mini LED、Micro LED和Smart MNT
  • 【备战蓝桥杯国赛-国赛真题】2022