热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

05计算机指令:使用纸带编程

05计算机指令:使用纸带编程一、编译成汇编补充:生成Linux汇编二、解析指令和机器码2.1MIPS指令集三、举个栗子一、编译成汇编test.cte


05 计算机指令:使用纸带编程

    • 一、编译成汇编
      • 补充:生成 Linux 汇编
    • 二、解析指令和机器码
      • 2.1 MIPS 指令集
    • 三、举个栗子


一、编译成汇编

test.c

// test.c
int main()
{int a = 1;int b = 2;a = a + b;
}

程序想要在 Linux 操作系统上运行,需要将整个程序翻译成一个汇编代码的程序,这个过程叫编译成汇编代码
对于汇编代码,可以再使用汇编器翻译成机器码。机器码由 0 和 1 组成的机器语言表示。一条条机器码就是一条条的计算机指令

使用 gcc 和 objdump 两个命令,打印出程序对应的汇编代码和机器码

gcc -g -c test.c
// -M:指定了指令集的类型为 intel
objdump -d -M intel -S test.o

命令执行结果

test.o&#xff1a; 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:
int main()
{0: 55 push rbp1: 48 89 e5 mov rbp,rspint a &#61; 1;4: c7 45 f8 01 00 00 00 mov DWORD PTR [rbp-0x8],0x1int b &#61; 2;b: c7 45 fc 02 00 00 00 mov DWORD PTR [rbp-0x4],0x2a &#61; a &#43; b;12: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]15: 01 45 f8 add DWORD PTR [rbp-0x8],eax18: b8 00 00 00 00 mov eax,0x0
}1d: 5d pop rbp1e: c3 ret

  • 8 行&#xff1a;push rbp&#xff0c;将 rbp 基址指针寄存器 push 入栈
  • 9 行&#xff1a;mov rbp,rsp&#xff0c;将 rsp 栈指针寄存器指向地址赋给 rbp 基址指针寄存器
  • 11 行&#xff1a;mov DWORD PTR [rbp-0x8],0x1
    DWORD 双字&#xff08;四个字节&#xff09;、PTR 即指针&#xff0c;pointer 的缩写
    [] 里的值对应一个地址值&#xff0c;地址指向一个双字型数据
    mov DWORD PTR [rbp-0x8],0x1 意思是将 16 进制的 1 赋值给基址指针寄存器偏移 8 位的位置
  • 13 行&#xff1a;mov DWORD PTR [rbp-0x4],0x2&#xff0c;同 11 行&#xff0c;意思是将 16 进制的 2 赋值给基址指针寄存器偏移 4 位的位置
  • 15 行&#xff1a;mov eax,DWORD PTR [rbp-0x4]&#xff0c;将基址指针寄存器偏移 4 位的位置的指向赋给 eax 寄存器
  • 16 行&#xff1a;add DWORD PTR [rbp-0x8],eax&#xff0c;将 eax 和基址指针寄存器偏移 8 位的位置指向的值相加&#xff0c;结果赋给基址指针寄存器偏移 8 位的位置&#xff0c;即 eax&#xff08;2&#xff09;&#43; rbp-8&#xff08;1&#xff09;&#61; 3&#xff0c;结果 3 赋给基址指针寄存器偏移 8 位的位置
  • 17 行&#xff1a;mov eax,0x0&#xff0c;将 eax 寄存器清零
  • 19 行&#xff1a;pop rbp&#xff0c;将 rbp 基址指针寄存器 pop 弹出
  • 20 行&#xff1a;ret&#xff0c;函数返回

补充&#xff1a;生成 Linux 汇编

Linux 和 Windows 生成的汇编参数的顺序是反的&#xff0c;Linux 是正序&#xff0c;Windows 是逆序
生成汇编


二、解析指令和机器码


  • 第一类&#xff1a;算术类指令
    加减乘除&#xff0c;在 CPU 层面&#xff0c;都会变成一条条算数指令
  • 第二类&#xff1a;数据传输类指令
    给变量赋值、在内存里读写数据
  • 第三类&#xff1a;逻辑类指令
    逻辑上的与或非
  • 第四类&#xff1a;条件分支类指令
    if-else 等
  • 第五类&#xff1a;无条件跳转指令
    在调用函数时&#xff0c;其实就是发起了一个无条件跳转指令

指令示例


2.1 MIPS 指令集

MIPS 指令集
操作码&#xff08;Opcode&#xff09;&#xff1a;高 6 位&#xff0c;代表这条指令具体是什么样的指令
R 指令&#xff1a;一般用来做算数和逻辑操作&#xff0c;里面有读取和写入寄存器的地址&#xff0c;如果是逻辑位移&#xff0c;后面还有位移操作的偏移量&#xff0c;功能码是在前面的操作码不够的时候&#xff0c;扩展操作码来表示对应的具体指令
I 指令&#xff1a;通常用在数据传输、条件分支&#xff0c;以及运算时使用的是常数的时候&#xff0c;因为没有位移量和操作码&#xff0c;也没有了第三个寄存器&#xff08;rd&#xff09;&#xff0c;而是把直接把这三部分合并成一个地址值或者一个常数
J 指令&#xff1a;是一个跳转指令&#xff0c;高 6 位之外的 26 位都是一个跳转后的地址


三、举个栗子

add $t0,$s1,$s2

这是一个加法算数指令&#xff0c;解释一下具体操作

add&#xff1a;表示这是一个加法操作&#xff0c;对应 MIPS 指令里的 opcode 是 0&#xff0c;5 位二进制&#xff1a;000000
rs&#xff1a;代表第一个寄存器&#xff0c;对应 s1 的地址是 17&#xff1f;&#xff1f;&#xff1f;&#xff0c;5 位二进制&#xff1a;10001
rt&#xff1a;代表第二个寄存器&#xff0c;对应 s2 的地址是 18&#xff1f;&#xff1f;&#xff1f;&#xff0c;二进制&#xff1a;10010
rd&#xff1a;代表目标的临时寄存器&#xff0c;对应 t0 的地址是 8&#xff1f;&#xff1f;&#xff1f;&#xff0c;二进制&#xff1a;01000
不是位移操作&#xff0c;位移量是 0&#xff0c;二进制&#xff1a;00000
功能码是 32&#xff1f;&#xff1f;&#xff1f;&#xff0c;二进制&#xff1a;100000
000000 10001 10010 01000 00000 100000 &#61; 000000 0010 0011 0010 0100 0000 0010 0000 &#61; 0 2 3 2 4 0 2 0 &#61; 0x02324020

打在纸带上&#xff0c;就是这样
加法指令纸带打孔

加法指令执行的过程&#xff0c;以及 CPU 怎么和 ALU 算数逻辑单元串联起来&#xff0c;待续…


推荐阅读
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
camera98
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有