计算机系统基础-汇编指令学习

1.1 传送指令

  1. push %ebp
  2. mov %esp,%ebp
  3. and $0xfffffff0,%esp //边界对齐指令,16字节对齐
  4. sub $0x20,%esp
  5. movl $0xa,0x10(%esp) //立即数10赋值给偏移量为0x10的基址寄存器esp
  6. movl $0x9,0x14(%esp) //立即数9赋值
  7. mov 0x10(%esp),%eax 
  8. mov %eax,0x18(%esp) //立即数10赋值给0x18(%esp)
  9. mov 0x14(%esp),%eax
  10. mov %eax,0x1c(%esp) //立即数9赋值给0x1c(%esp)
  11. mov 0x1c(%esp),%eax
  12. mov %eax,0x8(%esp) //立即数9赋值给0x8(%esp)
  13. mov 0x18(%esp),%eax
  14. mov %eax,0x4(%esp) //立即数10赋值给0x4(%esp)
  15. movl $0x0,(%esp)
  16. call 41 <main+0x41>
  17. leave
  18. ret

参考代码:

#include"stdio.h"

int main(){

    int a,b,c,d;

    a=10,b=9;

    printf("评测结果:成功\n评测脚本:C\n返回结果:");//此行不在汇编代码中

    //**********Begin**********

    c=a;

    d=b;

    //**********End**********

    printf("%d,%d\n",c,d);

}

1.2 传送指令

  1. mov %esp,%ebp
  2. and $0xfffffff0,%esp
  3. sub $0x20,%esp
  4. movl $0xa,0x18(%esp) //立即数10赋值给偏移量为0x18的基址寄存器esp
  5. mov 0x18(%esp),%eax
  6. mov %eax,0x1c(%esp)
  7. mov 0x1c(%esp),%eax
  8. mov %eax,0x8(%esp) //立即数10赋值给0x8(%esp)
  9. mov 0x18(%esp),%eax
  10. mov %eax,0x4(%esp)
  11. movl $0x0,(%esp)
  12. call 31 <main+0x31>
  13. leave
  14. ret

参考代码: 

#include"stdio.h"

int main(){

    int a=10;

    int b;

    printf("评测结果:成功\n评测脚本:C\n返回结果:");//此行不在汇编代码中

    //**********Begin********

    b=a;

    printf("%d,%d\n",a,b);

    //**********End**********

}

2.1 加减运算指令

  1. push %ebp
  2. mov %esp,%ebp
  3. and $0xfffffff0,%esp
  4. sub $0x20,%esp movl
  5. movl $0x6,0x10(%esp) //立即数6赋值给偏移量为0x10的基址寄存器esp
  6. movl $0x64,0x14(%esp) //16进制 立即数为100
  7. mov 0x14(%esp),%eax 
  8. mov 0x10(%esp),%edx
  9. sub %eax,%edx //将edx-eax的值赋值给edx
  10. mov %edx,%eax
  11. mov %eax,0x18(%esp) //将edx的值赋值给c
  12. mov 0x14(%esp),%eax
  13. mov 0x10(%esp),%edx
  14. add %edx,%eax //将eax+edx的值赋值给edx
  15. mov %eax,0x1c(%esp)
  16. mov 0x1c(%esp),%eax
  17. mov %eax,0x8(%esp) //将eax的值赋值给c
  18. mov 0x18(%esp),%eax
  19. mov %eax,0x4(%esp)
  20. movl $0x0,(%esp)
  21. call 4f <main+0x4f>
  22. leave
  23. ret

参考代码 :

#include"stdio.h"

int main(){

    int a,b,c,d;

    a=6,b=100;

    printf("评测结果:成功\n评测脚本:C\n返回结果:");//此行不在汇编代码中

    //**********Begin**********

    c=a-b;

    d=a+b;

    //**********End**********

    printf("%d,%d\n",c,d);

}

3.1 整数的乘法指令

  1. push %ebp
  2. mov %esp,%ebp
  3. and $0xfffffff0,%esp
  4. sub $0x20,%esp
  5. movl $0x3,0x10(%esp) //立即数3赋值给偏移量为0x10的基址寄存器esp
  6. mov 0x10(%esp),%eax
  7. sub $0x1,%eax //将eax的值-1赋给eax
  8. imul 0x10(%esp),%eax //将eax与0x10(%esp)内的值相乘赋给eax
  9. mov %eax,0x14(%esp) //赋值给b
  10. mov 0x10(%esp),%eax 
  11. imul 0x14(%esp),%eax //将c与0x10(%esp)内的值相乘赋给eax
  12. mov %eax,0x18(%esp) //赋给c
  13. mov 0x18(%esp),%eax
  14. add $0x2,%eax //d+2的值赋给eax
  15. imul 0x10(%esp),%eax //eax与0x10(%esp)内的值相乘赋给eax
  16. mov %eax,0x1c(%esp) //赋给d
  17. mov 0x1c(%esp),%eax
  18. mov %eax,0x8(%esp)//赋给d
  19. mov 0x18(%esp),%eax
  20. mov %eax,0x4(%esp) 
  21. movl $0x0,(%esp)
  22. call 56 <main+0x56>
  23. leave
  24. ret

 参考代码:

#include"stdio.h"

int main(){

    int a,b,c,d;

    a=3;

    printf("评测结果:成功\n评测脚本:C\n返回结果:");//此行不在汇编代码中

    //**********Begin**********

    b=a*(a-1);

    c=a*b;

    d=a*(c+2);

    //**********End**********

    printf("%d,%d\n",c,d);

}

4.1 控制转移指令

  1. 00000000 <sum>:
  2. 0: 55              push %ebp
  3. 1: 89 e5            mov %esp,%ebp
  4. 3: 83 ec 10          sub $0x10,%esp //分配十字节空间
  5. 6: c7 45 fc 00 00 00 00  movl $0x0,-0x4(%ebp) //s =0
  6. d: c7 45 f8 00 00 00 00  movl $0x0,-0x8(%ebp) //i =0
  7. 14: eb 18           jmp 2e <sum+0x2e>
  8. 16: 8b 45 f8         mov -0x8(%ebp),%eax //
  9. 19: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx //a[i]的值赋给edx
  10. 20: 8b 45 08         mov 0x8(%ebp),%eax //
  11. 23: 01 d0           add %edx,%eax
  12. 25: 8b 00           mov (%eax),%eax
  13. 27: 01 45 fc         add %eax,-0x4(%ebp) //s的值+a[i]赋给s
  14. 2a: 83 45 f8 01       addl $0x1,-0x8(%ebp) //i的值+1赋给i
  15. 2e: 8b 45 f8         mov -0x8(%ebp),%eax //i的值赋给eax
  16. 31: 3b 45 0c         cmp 0xc(%ebp),%eax //比较i跟n的值;
  17. 34: 7c e0           jl 16 <sum+0x16>
  18. 36: 8b 45 fc         mov -0x4(%ebp),%eax
  19. 39: c9             leave
  20. 3a: c3 ret

 参考代码:

#include"stdio.h"

int sum(int a[],int n){

    //**********Begin**********

    int s = 0;

    for (int i = 0;i<n; i++) {

        s += a[i]; 

    }

   return s;

    //**********End**********

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DICOM 文件中,VR,VL,SQ,图像二进制的几个注意点

DICOM 文件的结构&#xff0c;在网上有很多的学习资料&#xff0c;这里只介绍些容易混淆的概念&#xff0c;作为回看笔记。 1. 传输语法 每个传输语法&#xff0c;起都是表达的三个概念&#xff1a;大小端、显隐式、压缩算法 DICOM Implicit VR Little Endian: 1.2.840.1000…

解决VSCode打开终端Terminal闪退的问题

一、背景 在新电脑上使用了VSCode&#xff0c;但是一打开Terminal&#xff0c;Terminal马上就消失了&#xff0c;在网上找了很久&#xff0c;都没有找到对应的分析 二、解决思路 首先&#xff0c;是从这个文档中找到了灵感&#xff0c;这个文档里面汇集了大部分的问题&#…

孩子都能学会的FPGA:第三十二课——用FPGA实现一个通用的SPI主机发送模块

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

二百一十五、Flume——Flume拓扑结构之复制和多路复用的开发案例(亲测,附截图)

一、目的 对于Flume的复制和多路复用拓扑结构&#xff0c;进行一个小的开发测试 二、复制和多路复用拓扑结构 &#xff08;一&#xff09;结构含义 Flume 支持将事件流向一个或者多个目的地。 &#xff08;二&#xff09;结构特征 这种模式可以将相同数据复制到多个channe…

使用python向neo4j中批量导入txt和csv三元组数据

1.导入txt文件 数据示例&#xff1a; &#xff08;头实体&#xff0c;关系&#xff0c;尾实体&#xff09; &#xff08;头实体&#xff0c;关系&#xff0c;尾实体&#xff09; 。。。。。。在执行python代码之前在neo4j中执行这个命令&#xff0c;清空所有节点 match (n) d…

微信生态下的私域流量载体有哪些?

私域流量的本质就是&#xff1a;降低我的获客成本&#xff0c;提高我产品服务的复购率&#xff0c;增加我和用户之间的粘性&#xff0c;挖掘用户的终身价值。 私域流量一般我们特指微信体系的个人号、公众号、社群和小程序&#xff0c;现在朋友圈和视频号也成为了打造微信私域…

HubSpot和AI的完美结合:解锁业务增长密码

随着数字化时代的发展&#xff0c;智能营销已经成为企业走向成功的关键之一。在这个领域的领先者之一&#xff0c;HubSpot积极整合人工智能&#xff08;AI&#xff09;技术&#xff0c;为数字营销、销售和服务带来了新的可能性。今天运营坛将带领大家深入探讨HubSpot和人工智能…

活动预告 | 微盟技术沙龙 - Elasticsearch 在微盟的实践 12/21/2023

微盟技术沙龙 「微盟技术沙龙」是由微盟研发中心发起并联合各方小伙伴为开发者举办的系列技术沙龙&#xff0c;从用户&#xff0c;产品&#xff0c;技术等方面与开发者进行交流。 微盟技术沙龙关注开发者在实际应用中遇到的问题。提供最真实的干货&#xff0c;以技术会友&…

GPU 性能测试软件:GPU-Z,2023 年 9 月 12 日更新

GPU-Z是一款用于Windows操作系统的免费工具&#xff0c;它用于查看和监控计算机的图形处理单元&#xff08;GPU&#xff09;信息。这个工具是专为计算机硬件爱好者、游戏玩家、系统管理员和技术支持人员设计的 GPU-Z 的特点 GPU信息&#xff1a;GPU-Z能够显示关于您计算机中G…

命令执行 [BUUCTF 2018]Online Tool1

打开题目 我们代码审计一下 if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) { $_SERVER[REMOTE_ADDR] $_SERVER[HTTP_X_FORWARDED_FOR]; } 如果存在xxf头且不为空&#xff0c;则将xxf头内容&#xff08;真实的客户端ip&#xff09;赋给ROMOTE_ADDR&#xff08;代理服务器传过…

如何使用蜘蛛池蚂蚁SEO

​蜘蛛池是一种利用搜索引擎爬虫进行推广营销的方式。它的核心是建立一个能够吸引搜索引擎爬虫的网站群&#xff0c;这些网站能够产生大量的优质内容&#xff0c;并形成一个巨大的网站群&#xff0c;从而吸引更多的搜索引擎爬虫。 如何联系蚂蚁seo&#xff1f; baidu搜索&…

【C语言(十二)】

数据在内存中的存储 一、整数在内存中的存储 整数的2进制表示方法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表示方法均有符号位和数值位两部分&#xff0c;符号位都是用0表示“正”&#xff0c;用1表示“负”&#xff0c;最高位的⼀位是被当做符号…

赠与婚外情人1百余万,主张全额返还获支持

丈夫婚内出轨&#xff0c;并瞒着妻子给情人转账177万余元&#xff0c;最终被妻子发现诉至法院。近日&#xff0c;湖南省湘阴县人民法院审理了一起不当得利案件&#xff0c;认定丈夫的赠与行为无效&#xff0c;支持了妻子全额返还的诉讼请求。   男子钱某与女子赵某于2020年6月…

无参数RCE知识点

什么是无参数RCE&#xff1f; 无参rce&#xff0c;就是说在无法传入参数的情况下&#xff0c;仅仅依靠传入没有参数的函数套娃就可以达到命令执行的效果 核心代码 if(; preg_replace(/[^\W]\((?R)?\)/, , $_GET[code])) { eval($_GET[code]); } 这段代码的核心就是只…

西工大计院计算机系统基础实验二(配置gdb插件)

第二次实验是二进制炸弹实验&#xff0c;为了简化操作&#xff0c;并且让大家接下来能够按照作者之前已经为网安院写好的博客西工大网络空间安全学院计算机系统基础实验二&#xff08;清楚实验框架及phase_1&#xff09;-CSDN博客来走&#xff0c;大家需要下载一款好用的gdb插件…

java基础进阶之List和Set和Map

1、list List本身是一个接口&#xff0c;该接口继承自Collection接口&#xff0c;它有两个常用的实现子类ArrayList和LinkedList。从功能特性上来看&#xff0c;List是有序、可重复的单列集合&#xff0c;集合中的每个元素都有对应的顺序索引&#xff0c;我们可以通过该索引来访…

canvas基本绘制对象

目录 绘制画布 设置画布 绘制圆形 绘制矩形填充渐变色 绘制文字及文字样式 绘制画布 <canvas id"canvas" width"800" height"600"></canvas> 设置画布 //获得画布元素var canvasdocument.getElementById(canvas);var ctxca…

基于Java (spring-boot)的二手物品交易平台

​ 一、项目介绍 1、管理员功能 &#xff08;1&#xff09;登录&#xff1a;管理员能够根据账号访问系统。 &#xff08;2&#xff09;用户管理&#xff1a;管理员可以添加、删除、修改用户信息&#xff0c;查看用户列表&#xff0c;对用户进行管理和控制。例如&#xff0c…

Python将Labelme文件的标注信息绘制到图片上

Python将Labelme文件的标注信息绘制到图片上 前言前提条件相关介绍实验环境Python将Labelme文件的标注信息绘制到图片上代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、O…