当前位置: 首页 > news >正文

汇编程序入门指南

什么是机器语言?
在这里插入图片描述
机器语言就是由二进制数字构成的程序,CPU 可以直接对其解释、执行。

汇编语言、C 语言、Java、BASIC 等编程语言编写的程序,也都需要先转换成机器语言才能被执行。机器语言有时也叫作“原生代码”(Native Code)。
在这里插入图片描述

本篇文章我们就来学习一下如何编写汇编语言,汇编语言是低级语言,所以它是最接近机器语言的编程语言。
在这里插入图片描述
学习汇编语言,能让你更深刻的理解计算机的运行机制和原理,使你犹如拨云见日, 找到长期困惑着自己的问题的答案,不仅能因“我能看懂程序了”而获得成就感,更能因发现“计算机原来很简单啊”而信心倍增。

使用汇编语言编写一段程序然后让计算机运行你编写的程序,你就知道计算机是如何把汇编语言转换成机器语言执行的。

你可能会问,我们为什么不直接使用机器语言编写程序呢?原因就是机器语言是一堆的0和1的组合,但是每个组合都是有特定的含义的指令或数据,所以对人来说,如果只看0和1的话很难判断出各个组合都表示什么。

简单地说,就是机器语言不适合人类书写和阅读。

于是就有人发明了汇编语言,可以用一些英文单词或者英文简写来表示指令功能,这种类似的英语单词叫作“助记符”,使用助记符的编程语言叫作“汇编语言”。
在这里插入图片描述

无论是使用机器语言还是汇编语言,所实现的功能都是一样的, 区别只在于程序是用数字表示,还是用助记符表示。

也就是说,如果理解了汇编语言,也就理解了机器语言,更进一步也就理解了计算机 的原始的工作方式。

汇编语言的语法十分简单,以至于语法只有一个,即把“标签” “操作码(指令)”和“操作数(指令的对象)”并排写在一行上,仅此而已。

如下是一段汇编语言:
在这里插入图片描述

标签的作用是为该行代码对应的内存地址起一个名字。

编程时如果总要考虑这一行的内存地址是什么?就会很不方便,所以在汇编语言中用标签来代替地址。用汇编语言编程时可以在任何需要标签的地方贴上名称任意的标签。

在上述代码程序中,使用了名称为“LOOP:”的标签,操作码就是表示“做什么”的指令。

因为用助记符表示的指令是英语单词的缩写,比如 LD 是 Load(加载)的缩写,所以多多少少能猜出其中的含义。汇编语言中提供了多少种助记符,CPU 就有多少种功能。

比如Z80 CPU 的指令全部加起来有 70 条左右。

CPU 的寄存器、内存地址、I/O 地址或者直接给出的数字都可以作为操作数。

如果某条指令需要多个操作数,那么它们之间就要用逗号分隔。操作数的个数取决于指令的种类。也有不需要操作数的指令,比如用于停止 CPU 运转的 HALT 指令。
在这里插入图片描述

汇编语言的语法和英语祈使句的语法很像。对比英语的祈使句 Give me money 和汇编语言的语句,就可以看出在英语的祈使句中,一 开头放置了一个表示“做什么”的动词,这个动词就相当于汇编语言中的操作码。

在动词后面放置了一个表示“动作作用到什么上”的宾语, 这个宾语就相当于汇编语言中的操作数。

因为程序的作用是向 CPU 发出指令,而且编程语言又是由说英语的人发明的,所以编程语言与英语祈使句类似也就不足为奇了。

构成机器语言的是二进制数,而在汇编语言中,则使用十进制数和十六进制数记录数据。若仅仅写出123这样的数字,表示的就是十进制数;而像123H这样在数字末尾加上了一个H(H 表示 Hexadecimal, 即十六进制数),表示的就是十六进制数。

这里先把主要的指令列在如下表中,请大家粗略地浏览一下。

在浏览的过程中请注意这些指令的分类,按功能这些指令可以分成运算、与内存的输入输出和 与 I/O 的输入输出三类。

这是因为计算机能做的事也只有输入、运算、输出这三种了。 操作数表示的是指令执行的对象。
在这里插入图片描述

相关文章:

  • vue脚手架 vuex模块化和四大辅助函数的结合使用
  • kafka学习笔记07
  • 【CSS】background-origin作用是什么,怎么使用
  • DAY 45 企业级虚拟化技术KVM
  • Web爬虫-edu_SRC-目标列表爬取
  • 精华版 | 2024 Q1全球威胁报告一览
  • 现实网络中排障经验
  • 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面
  • 信息论与大数据安全知识点
  • 「ClickHouse 极简教程」分布式下的 IN/JOIN 及 GLOBAL关键字
  • jQuery 样式操作
  • leetCode-hot100-链表专题
  • 怎么开启22端口访问权限,让别的机器通过ssh或者向日葵等远程控制工具链接
  • 计算机网络实验(鲁东大学)-cisco-逃课
  • 类Copy方法:BeanUtils.copyProperties
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Javascript编码规范
  • k个最大的数及变种小结
  • Nacos系列:Nacos的Java SDK使用
  • 机器学习中为什么要做归一化normalization
  • 什么软件可以剪辑音乐?
  • 微服务入门【系列视频课程】
  • 白色的风信子
  • ​ArcGIS Pro 如何批量删除字段
  • !!Dom4j 学习笔记
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $(function(){})与(function($){....})(jQuery)的区别
  • (Note)C++中的继承方式
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (十)Flink Table API 和 SQL 基本概念
  • (四)opengl函数加载和错误处理
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)shell调试方法
  • ***检测工具之RKHunter AIDE
  • .Net 6.0--通用帮助类--FileHelper
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 项目指定SDK版本
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET Standard 的管理策略
  • .NET 给NuGet包添加Readme
  • .NET 回调、接口回调、 委托
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net(C#)常用转换byte转uint32、byte转float等
  • @synthesize和@dynamic分别有什么作用?
  • [ C++ ] STL---string类的使用指南
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [BZOJ2850]巧克力王国
  • [C++]:for循环for(int num : nums)
  • [Django 0-1] Core.Checks 模块