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、…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
