首页 > 编程语言 >【408精华知识】程序的机器级代码表示

【408精华知识】程序的机器级代码表示

时间:2024-09-14 12:26:25浏览次数:10  
标签:汇编语言 代码 函数调用 指令 精华 寄存器 栈帧 408

在这里插入图片描述

程序的机器级代码表示是计算机组成原理的核心内容,其综合第四章指令与第五章CPU,并常常结合第三章存储系统进行考察,可以说是把计算机组成原理最核心的内容都汇集在了一起。本文着重讨论程序的机器级代码表示,并辅以历年真题进行讲解。关于存储、指令、CPU组成请详见:【408精华知识】关于存储系统,看这一篇就够了!【408精华知识】指令的寻址方式【408精华知识】指令周期的数据流【408精华知识】计算机系统结构等文章。

文章目录

一、考试要求

  1. 只需关注x86汇编语言,若考察其他汇编语言题目会详细注释;
  2. 题目给出某段简单程序的C语言、汇编语言、机器语言表示,能结合C语言看懂汇编语言的关键语句(看懂常见指令、选择结构、循环结构、函数调用);
  3. 汇编语言、机器语言 一 一对应,要能结合汇编语言分析机器语言指令的格式、寻址方式

在这里插入图片描述

二、汇编语言基础

(一)指令格式

在这里插入图片描述

(二)寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 通用寄存器E*X(X = 未知);
  2. 变址寄存器(用于线性表、字符串处理等):E*I (I = Index);
  3. 堆栈指针(用于实现函数调用等):E*P(P = Pointer);

注意:每个寄存器大小都是32bit,通用寄存器要根据取数大小使用部分寄存器而不是整个寄存器。

(三)例子

在这里插入图片描述

  1. 寄存器:见(三);
  2. 立即数:常量;
  3. 主存中:给出地址与读写长度;

在这里插入图片描述

(四)总结

在这里插入图片描述

三、常用的x86汇编指令

(一)指令类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)选择语句(jmp/jxxx)

  1. jmp:无条件转移指令
    在这里插入图片描述

  2. jxxx:条件转移指令
    在这里插入图片描述
    注意:关于这几个标志位,详见:【408精华知识】计组中关于数据的考察

举个栗子
在这里插入图片描述

(三)循环语句(loop)

  1. 条件转移指令实现:
    在这里插入图片描述

  2. loop指令实现:
    在这里插入图片描述

(四)函数调用(call/ret)

在这里插入图片描述

  1. 函数调用指令: call <函数名>
    ①将PC旧值压栈保存(保存在函数的栈帧顶部)
    ②设置PC新值,无条件转移至被调用函数的第一条指令
  2. 函数返回指令: ret
    从函数的栈帧顶部找到PC旧值,将其出栈并恢复PC寄存器

1.函数调用栈的位置

在这里插入图片描述

注意:栈底在高地址,栈顶在低地址
在这里插入图片描述

2.如何访问栈帧

在这里插入图片描述

3.栈桢包含的内容

  1. gcc 编译器将每个栈帧大小设置为 16B 的整数倍(当前函数的栈帧除外),因此栈帧内可能出现空闲未使用的区域
  2. 通常将局部变量集中存储在栈帧底部区域
  3. 通常将调用参数集中存储在栈帧顶部区域
  4. 栈帧最底部一定是上一层栈帧基址(ebp旧值)
  5. 栈帧最顶部一定是返回地址(当前函数的栈帧除外)

在这里插入图片描述
在这里插入图片描述

4.总结

在这里插入图片描述

四、历年真题

(一)2014-44、45

(二)2015-43、44

(三)2019-45、46

(四)2020-43、44

写在后面

这个专栏主要是我在学习408真题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!

参考资料
[1]王道408教材(2025版)
[2]王道课程资料

标签:汇编语言,代码,函数调用,指令,精华,寄存器,栈帧,408
From: https://blog.csdn.net/weixin_51193374/article/details/141893404

相关文章

  • OpenSSH 远程代码执行漏洞(CVE-2024-6387) Ubuntu22.04 和 centos7处理方法
    这是文档,不是脚本,请一行一行复制粘贴执行,不用批量自动执行下面是Ubuntu22.04和centos7的处理方法,其他系统可能需要适当调整#!/bin/bash#========================================================================================##Ubuntu22.04升级openssh#......
  • 代码随想录算法训练营,9月14日 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差文档讲解︰代码随想录(programmercarl.com)视频讲解︰二叉搜索树的最小绝对差日期:2024-09-14想法:好好利用二叉搜索树中序遍历是有序的性质,设置一个节点表示前一个结点就能很方便的计算差值了Java代码如下:classSo......
  • 参数绑定在PHP代码测试中的重要作用与应用场景
    在PHP代码测试过程中,参数绑定起着至关重要的作用。它不仅能够提高代码的安全性,还能够优化性能,减少常见的错误。因此,了解参数绑定的作用以及其应用场景,对于开发者来说十分重要。参数绑定主要的作用之一就是防止SQL注入。SQL注入是数据库安全中常见的攻击方式之一,攻击者通过在SQL语......
  • 程序员的 AI 启蒙:ChatGPT+ Copilot开发Vue3 仿简书项目 90%代码AI生成
    在人工智能技术日益成熟的今天,程序员们正在迎来一场全新的编程革命。ChatGPT和Copilot等AI工具的出现,让代码生成不再是遥不可及的梦想。本文将带你体验如何利用这些先进技术,仅用90%的代码量,开发出一个基于Vue3的仿简书项目,感受AI在编程领域的革新力量。一、引言ChatGPT和C......
  • 无需代码,通过逻辑引擎简单几步配置,实现邮件自动化发送
    无论是在个人生活中还是在工作场景中,发送邮件是一个常见的需求。通常在业务系统中有这样的场景:新增数据的时候动态取一些信息然后发送邮件给客户开户发送密钥邮件等那么在JVS低代码逻辑引擎中,我们可以通过配置【发送邮件】节点来实现配置说明发送邮件,需要有一个邮件传输协议服务器......
  • 基于CNN-LSTM-Attention的共享单车租赁预测研究(数据可换)(Python代码实现)基于CNN-LSTM
                        ......
  • 若依架构代码改造
    概述若依架构是开源优秀版本,实现前后端分类,主要相关文档链接如下:https://doc.ruoyi.vip/ruoyi/问题汇总和处理尝试用若依架构改造本地项目,遇到问题汇总,便于大家参考交流问题1、登录提示验证码有误:解决:替换项目的时候,主要framework项目这个文件CaptchaConfig.java,如下行配置:K......
  • 通过注释一行代码 开启关闭一个div的css样式 - 开发调试技巧
    通过注释一行代码开启关闭一个div的css样式-开发调试技巧需求:开发的时候,我需要对页面的某个样式反复开关,但是html不能通过注释来开关,所以可以在div的上面加一个js但是vue的template里面不能加script,需要加component重点代码不写v-bindvscode有红色波浪<componentv-bind:......
  • 内网穿透技术的思考--反向代理、TCP 隧道、 UDP 打洞--C++代码示例
    概述内网穿透是一种技术,用于在私有局域网(LAN)中的设备与外部网络(如互联网)之间建立通信通道,使得外部设备可以访问内网中的服务。由于内网设备通常位于防火墙或NAT(网络地址转换)设备之后,外部网络无法直接访问它们。因此,内网穿透技术旨在解决这一问题。本文将讨论如何使用C++实现......
  • 当代码遇上“意外”:Python中的异常引发艺术
    引言异常处理是软件开发不可或缺的一部分。良好的异常管理不仅能够提升程序的稳定性与可靠性,还能显著改善用户体验。在Python中,“异常的引发”是指主动抛出一个错误信息,以通知调用者当前操作出现了问题。掌握这一技巧,对于编写高效、可维护的代码至关重要。基础语法介绍在Python......