9.程序的机器级代码表示,CISC和RISC
目录
一. x86汇遍语言基础(Intel格式)
二. AT&T格式汇编语言
三. 程序的机器级代码表示
(1)选择语句
(2)循环语句
(3)函数调用
1.函数调用命令
2.栈帧及其访问
3.栈帧的切换
4.函数传参和返回值
四. CISC和RISC
一. x86汇遍语言基础(Intel格式)
x86架构的CPU有哪些寄存器?
对于前面的通用寄存器,还可以指定使用16位或8位:
常用的x86汇编指令:
算术运算指令:
d和s的解释:destination:目的地(d目的操作数),source:来源地(s源操作数)。因为最终运算结果要送回d,所以目的操作数d不可以是常量。此外x86不允许两个操作数同时来自于主存。
除法的解释:32位的被除数除以32位的除数,在计算前会对被除数进行扩展,把被除数扩展到64位,低32位存入eax,高32位存入edx。
逻辑运算指令:
其他:
用于实现分支结构、循环结构的指令: cmp、test、 jmp、jxxx
用于实现函数调用的指令:push、pop、call、ret
用于实现数据转移的指令:mov
二. AT&T格式汇编语言
三. 程序的机器级代码表示
408考试要求:
只需关注x86汇编语言;若考察其他汇编语言题目会详细注释
题目给出某段简单程序的C语言、汇编语言、机器语言表示。能结合C语言看懂汇编语言的关键语句(看懂常见指令、选择结构、循环结构、函数调用)
汇编语言、机器语言一一对应,要能结合汇编语言分析机器语言指令的格式、寻址方式
不会考:将C语言人工翻译为汇编语言或机器语言
注: Intel x86处理器中程序计数器PC ( Program Counter)通常被称为IP( lnstruction Pointer)
(1)选择语句
jmp <地址> #PC无条件转移至<地址>:
jmp 128 #<地址>可以用常数给出
jmp eax #<地址>可以来自于寄存器
jmp [999] #<地址>可以来自于主存
也可以用“标号”锚定位置,这样不用每次更改地址:
条件转移指令:
示例:
注意:写汇编语言代码时,一般会以函数名作为“标号”,标注该函数指令的起始地址。
扩展:cmp命令的底层原理,本质上是做减法运算。
(2)循环语句
用条件转移指令实现循环:
用loop指令实现循环(注意:循环计数器必须使用ECX寄存器):
(3)函数调用
1.函数调用命令
函数调用指令:call <函数名>
函数返回指令:ret
call指令的作用:①将IP(其实就是程序计数器PC)旧值压栈保存(保存在函数的栈帧顶部)
②设置IP新值,无条件转移至被调用函数的第一条指令
ret指令的作用:从函数的栈帧顶部找到IP旧值,将其出栈并恢复IP寄存器。
2.栈帧及其访问
函数的栈帧(Stack Frame):保存函数大括号内定义的局部变量、保存函数调用相关的信息。
下面的图示,栈顶在下,栈底在上,上面是高地址,下面是低地址。
访问栈帧数据有两种方法:(1)push和pop指令;(2)mov指令
标记栈帧范围:x86中有EBP、ESP寄存器。EBP是堆栈基指针,ESP是堆栈顶指针。EBP:指向当前栈帧的“底部,ESP:指向当前栈帧的“顶部”。对栈帧内数据的访问,都是基于ebp、esp进行的。
1.使用push和pop指令(eax寄存器里的初始值是211)
执行完上述指令后,栈内内容如下,eax内容变为666:
注意:x86系统中,默认以4字节为栈的操作单位。
2.mov指令
可以用mov指令,结合esp、 ebp指针访问栈帧数据
可以用减法/加法指令,即 sub/add修改栈顶指针esp的值。
3.栈帧的切换
在call add后,call会首先把IP(PC)的旧值压栈保存,然后设置IP(PC)新值,无条件转移至被调用函数的第一条指令。在被调用的函数体中,开头一般是这两条命令:
push ebp # 保存上一层函数的栈帧基址(ebp旧值)
mov ebp,esp # 设置当前函数的栈帧基址(ebp新值)
push ebp会把上一层函数的栈帧基址压入栈中,成为本层函数栈帧的底,同时esp向下移动;然后执行mov指令,把ebp也指向本层函数栈帧的底,到此一个新的函数栈帧形成,可以往里继续压入一些数据。以上两行代码可以用enter等价表示:
当函数返回时,切换栈帧的方式如下:
mov esp, ebp # 让esp指向当前栈帧的底部
pop ebp # 将esp所指元素出栈,写入寄存器ebp
mov指令可以把esp和ebp都指向栈帧的底,然后弹出栈中元素至ebp,这时ebp就可以恢复指向上一层函数栈的栈底,esp+,指向IP旧值,最后执行ret指令,从函数的栈帧顶部找到IP旧值,将其出栈并恢复IP寄存器。上面两行可以用leave等价表示:
4.函数传参和返回值
栈帧里包含的内容:gcc编译器将每个栈帧大小设置为16B的整数倍(当前函数的栈帧除外),因此栈帧内可能出现空闲未使用的区域。
- 通常将局部变量集中存储在栈帧底部区域
- 通常将调用参数集中存储在栈帧顶部区域
- 栈帧最底部一定是上一层栈帧基址(ebp旧值)
- 栈帧最顶部一定是返回地址(当前函数的栈帧除外)
使用[ebp-8],[ebp-12]等读取,返回参数。
此外,调用其他函数前,如果有必要,可将某些寄存器(如:eax、 edx、ecx)的值入栈保存,防止中间结果被破坏。如果这些寄存器值不是运算的中间结果,则可以不保存。(这部分内容一般在空区域后,调用参数前)
四. CISC和RISC
可以把CISC理解为“库函数+C语言”,RISC理解为C语言。
CISC:Complex Instruction Set Computer
设计思路:一条指令完成一个复杂的基本功能。
代表:x86架构,主要用于笔记本、台式机等。
RISC: Reduced lnstruction Set Computer
设计思路:一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能。
代表:ARM架构,主要用于手机、平板等。
80-20规律:典型程序中80%的语句仅仅使用处理机中20%的指令。
相关文章:

9.程序的机器级代码表示,CISC和RISC
目录 一. x86汇遍语言基础(Intel格式) 二. AT&T格式汇编语言 三. 程序的机器级代码表示 (1)选择语句 (2)循环语句 (3)函数调用 1.函数调用命令 2.栈帧及其访问 3.栈帧的…...

《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》《从零开始读懂相对论》
文章目录 《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》内容简介核心精华使用ChatGPT可以高效搞定写作的好处如下 《从零开始读懂相对论》内容简介关键点书摘最后 《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》 内容简介 本书从写作与ChatG…...

【2016年数据结构真题】
已知由n(M>2)个正整数构成的集合A{a<k<n},将其划分为两个不相交的子集A1 和A2,元素个数分别是n1和n2,A1和A2中的元素之和分别为S1和S2。设计一个尽可能高效的划分算法,满足|n1-n2|最小且|s1-s2|最大。要求…...

创作者等级终于升到4级了
写了两个月的文章,终于等到4级了。发文纪念一下:...

Games104现代游戏引擎笔记 面向数据编程与任务系统
Basics of Parallel Programming 并行编程的基础 核达到了上限,无法越做越快,只能通过更多的核来解决问题 Process 进程 有独立的存储单元,系统去管理,需要通过特殊机制去交换信息 Thread 线程 在进程之内,共享了内存…...

系列三、GC垃圾回收【总体概览】
一、GC垃圾回收【总体概览】 JVM进行GC时,并非每次都对上面的三个内存区域(新生区、养老区、元空间/永久代)一起回收,大部分回收的是新生区里边的垃圾,因此GC按照回收的区域又分为了两种类型,一种是发生在新…...
无线WiFi安全渗透与攻防(N.3)WPA破解-创建Hash-table加速并用Cowpatty破解
WPA破解-创建Hash-table加速并用Cowpatty破解 WPA破解-创建Hash-table加速并用Cowpatty破解1.Cowpatty 软件介绍2.渗透流程1.安装CoWPAtty2.抓握手包1.查看网卡2.开启监听模式3.扫描wifi4.抓握手包5.进行冲突模式攻击3.STA重新连接wifi4.渗透WPA wifi5.使用大字典破解3.hash-ta…...
golang 动态库
目录 1. golang 动态库2. golang 语言使用动态库、调用动态链接库2.1. Go 插件系统2.2. 动态加载的优劣2.3. Go 的插件系统:Plugin2.4. 插件开发原则2.4.1. 插件独立2.4.2. 使用接口类型作为边界2.4.3. Unix 模块化原则2.4.4. 版本控制 2.5. 插件开发示例2.5.1. 编写…...
Python的2042小游戏及其详解
源码: import random import os# 游戏界面尺寸 SIZE 4# 游戏结束标志 GAME_OVER False# 初始化游戏界面 board [[0] * SIZE for _ in range(SIZE)]# 随机生成一个初始方块 def add_random_tile():empty_tiles [(i, j) for i in range(SIZE) for j in range(SIZ…...

怎么去掉邮件内容中的回车符
上图是Outlook 截图,可见1指向的总有回车符; 故障原因: 不小心误按了箭头4这个选项; 解决方法: 点击2箭头确保tab展开; 点击3以找到箭头4. 取消勾选或者多次点击,即可解决。...

Git-概念与架构
GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区(working directory)2.暂存区(staging area)3.本地仓库(local…...

android 数独小游戏 经典数独·休闲益智
一款经典数独训练app 标题资源下载 (0积分)https://download.csdn.net/download/qq_38355313/88544810 首页页面: 1.包含有简单、普通、困难、大师四种难度的数独挑战供选择; 记录页面: 1.记录用户训练过的数独信息&…...

GAT里面的sofamax函数的实现:
1.sofamx 公式: 2. GAT里的sofamax函数的实现: 1. 因为指数在x轴正轴爆炸式地快速增长,如果zi比较大,exp(zi)也会非常大,得到的数值可能会溢出。溢出又分为下溢出(Underflow)和上溢出&#x…...

Idea 编译SpringBoot项目Kotlin报错/Idea重新编译
原因应该是一次性修改了大量的文件, SpringBoot项目启动Kotlin报错, Build Project也是同样的结果, 报错如下 Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.1.13. Build-&…...

【Qt之QWizard问题】setPixmap()设置logo、background、watermark无效不显示解决方案
问题原因: 使用QWizard或者QWizardPage设置像素图,结果设置完不显示效果。 设置示例: setPixmap(QWizard::WatermarkPixmap, QPixmap("xxx/xxx/xxx.png"));setPixmap(QWizard::BackgroundPixmap, QPixmap("xxx/xxx/xxx.png&…...
mysql 设置远程登录
为了允许远程连接到MySQL服务器,你需要采取以下步骤: 编辑MySQL配置文件: 打开MySQL的配置文件 my.cnf 或 my.ini,这取决于你的操作系统和MySQL版本。该文件通常位于MySQL安装目录下的 etc 或 etc/mysql 目录中。 添加或确保以下行…...
ES的索引概念
1. 概念:Elasticsearch(ES)是一个开源的全文搜索引擎,可以快速地存储、搜索和分析大量的结构化和非结构化数据。 2. 索引的作用:ES索引是将数据存储在Elasticsearch中的基本方式。它用于存储、搜索、分析和查询数据。…...

text/xml和application/xml
困惑 在http消息中,同样是传送xml信息,有的时候看到Content-Type的值是text/xml,有的时候值是application/xml,感到困惑。 例如,用Postman发送http消息给Tomcat中的基于JAX-WS的 web服务: 请求中传送了xm…...
鸿蒙4.0正式版升级机型
官网支持升级机型入口:HarmonyOS 4支持机型 | 华为官网 (huawei.com) 正式版 手机 HUAWEI P60 HUAWEI P60 Pro HUAWEI P60 Art HUAWEI Mate X3 HUAWEI Mate X3 典藏版 HUAWEI Mate 50 HUAWEI Mate 50 Pro HUAWEI Mate 50 RS 保时捷设计 HUAWEI Mate 50E …...

架构开发与优化咨询和实施服务
服务概述 得益于硬件平台算力的提升,汽车电子电气架构的集成度逐渐提高,从单体ECU、到功能域集成控制器、到区域集成控制器,多域融合成为了目前行业中软件工程的重要工作内容。同时,在传统控制器C代码开发的基础上,C、…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...