8086Assembly00——初学汇编语言
2021/5/4 1:25:35
本文主要是介绍8086Assembly00——初学汇编语言,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
镇楼图
Pixiv:_ LM7 _
==================
〇、引子
汇编语言是一种直接在硬件上工作的低级编程语言,再介绍这个语言之前我们需要了解一些最基本的知识,也是需要对硬件结构的问题进行一些简单的探讨,关于PC机、CPU结构后续你可以在《微机原理与接口》中学到,关于计算机的结构后续你可以在《组成原理》中学到。
在汇编语言你将学到如何去和底层打交道,也是作为后续学习的一个基础
请至少有C语言的基础再来看此blog
在写这篇blog时改了很多次,但最后内容衔接的依然不是很好,请见谅
==================
一、麻烦的机器语言
在以前所有编程都是用0101的方式编程的,比如你要实现s = 768+12288-1280;
在机器语言里可能会表示成
101100000000000000000011 000001010000000000110000 001011010000000000000101
光是看这个你可能就头疼了,如果写错那可能就更头疼了。因此除了一些专业人士已经没人去学习机器语言了。
因此引申出了一个新的语言"Assembly Language"
==================
二、汇编语言
汇编语言用一些英文单词的"缩写"来增强一个程序的可读性,让程序更接近人类语言。
比如你是愿意打
01010000
还是愿意打
PUSH AX
(寄存器有很多代号,比如AX、BX、SS、PSW等,在之后你将学到寄存器)
不仅提高了可读性也提高了编程效率
虽然说机器语言和汇编语言有很大区别,但汇编语言却和机器语言一一对应。
当你尝试破解一个游戏时,你是不可能得到C、Python的源代码的,你肯定要去反编译一下,得到汇编语言的代码。
我们知道一个C语言程序的生成当中有两个步骤叫做编译、汇编
编译正是将C代码翻译成汇编代码
而汇编正是将一个汇编代码翻译成机器语言。
因为是低级语言,所以汇编语言程序的生成没那么复杂
只有以下过程
【汇编指令】→【编译器】→【机器语言】
==================
三、汇编语言的组成
①汇编指令:是机器码的助记符,有对应的机器码
②伪指令 :由编译器运行,计算机不执行,无对应的机器码
③其他符号:由编译器识别,无对应的机器码
汇编语言的核心是汇编指令,它决定了汇编语言的特性
每一种CPU都有自己的汇编指令集,可能功能也不一样
==================
四、存储
Ⅰ、指令&数据
如果计算机想要工作,必须要用到它的核心部件——CPU,而CPU需要处理各种信息。
这种信息分为两类:一是指令,二是数据。
它们都是二进制信息,本质上没有什么区别,但在使用时可能会有所不同。
比如
1000100111011000 同样是这个二进制信息, 如果表示成数据,会表示成89D8H 如果表示成指令,会表示成mov ax,bx
下图是某程序(后面你会学习到)获取的信息,分别获取了同一二进制信息(只不过用十六进制表达了而已)对应了两种不同的信息:指令(ADD、JMP、PUSH等)和数据
具体同一信息是怎样被区分的,这暂时不用考虑。
这些汇编指令被存放在了内存里
Ⅱ、存储器&存储单元
用来存储指令和数据的被称为存储器,也就是我们平常所说的内存。
存储器被划分为很多个存储单元,每个存储单元都具有一定的编号.
微机的存储器的存储单元是以字节为最小单位来计算的
编号 |
---|
0 (1B) |
1 (1B) |
2 (1B) |
... (1B) |
127 (1B) |
Ⅲ、CPU对存储器的读写
若CPU想对存储器进行读写,需要通过三种不同类型的总线完成一次读写操作。
从上面图我们得知左边是一个存储单元的编号,中间是一个个汇编指令,右边则是一个谜之数据。
这也就是CPU对存储器进行一次读写所需要的三种信息
CPU需要索引到一个存储单元,每个存储单元都有一个编号,我们可以用其编号来表示我们要索引到的存储单元。
这个我们称为地址总线
,CPU交互的信息为地址信息
假如一个CPU存在7根地址总线,那么我们就可以表示2^7个存储单元的地址,就存储单元的的编号来看,最小为0,最大为127。
\[若存在n根地址总线, \\ 则可以索引到2^n个地址 \]其次CPU需要获取一个存储单元里的数据。我们依然可以仿照上面,用一个东西表示一个存储单元内的数据
这个我们称为数据总线
,CPU交互的信息为数据信息
数据总线的宽度决定了CPU与外界的数据传输速度,假如数据总线有8根,那就意味着我们一次可以传输8位的数据信息。
\[若存在n根数据总线, \\ 则一次可以传输n位的数据 \]最后CPU知道要操作什么,也就是执行什么指令,同样我们也能用一个东西表示要这个指令
这个我们称为控制总线
,CPU交互的信息为控制信息
\[若存在n根控制总线,
\\
则存在2^n种操作
\]因此我们可以总结为:
CPU想要对存储器进行读写操作,需要与地址信息、数据信息、控制信息进行交互。
我们用地址总线指定地址信息,其宽度决定了CPU的寻址能力,另外我们把可以操作的地址数量称为内存地址空间
我们用数据总线指定数据信息,其宽度就决定了数据传送时一次的数据传送量
我们用控制总线指定控制信息,其宽度决定CPU的控制能力
==================
五、工具准备
所使用的平台:Windows
Ⅰ、DOSBOX
去DOSBOX官网安装DOSBOX,这里我已经白嫖好了。
下载地址:https://pan.baidu.com/s/1e36VMhno988RUUQKtwJbkw
提取码:7h19
安装好后,在D槽创建一个名字为ASM的文件夹,将压缩包ASM内的内容解压至文件夹里,然后打开DOSBOX然后依次输入以下指令
mount c: d:\asm c: debug
当然你每次打开都需要输入这个指令多少有些麻烦,在C盘用户数据里去找到DOSBOX的数据,会发现有一个conf文件
用记事本打开在最后结尾处输入以下指令保存
mount c: d:\asm c:
这样每次打开就不必再输入指令了
Ⅱ、VIM
去官网上找到80-586版本下载或者到我的已经白嫖好的网盘里。
网盘地址:https://pan.baidu.com/s/1_wA6G4CCRyq-vvq70ppi1w
提取码:8u4e
不过VIM默认界面还是相当辣眼的,找到VIM的安装目录用记事本打开_vimrc软件
在一开始处添加以下代码
set number color evening
Ⅲ、搭建汇编环境
将我已经白嫖好的汇编语言环境解压至文件夹中,然后和Ⅰ一样在DOSBOX的conf文件最后输入以下指令
masm t1; link t1;
网盘地址:https://pan.baidu.com/s/1zR3Hk54PzOv6VvxCQEVV2w
提取码:k4pi
然后打开输入debug,再输入u和d。
u可以获取指令信息,输入d则可以获取数据信息。
==================
总结
至此感谢你能看完结构这么凌乱的blog。
这里简单介绍了汇编语言
介绍了软件DOSBOX去搭建一个编译环境以及两条最简单的指令(u、d)
简要说明了CPU如何对一个存储器进行操作
==================
参考书籍
《汇编语言 第四版》——王爽
参考网站
https://fishc.com.cn/forum-39-1.html
https://b23.tv/qUfphX
这篇关于8086Assembly00——初学汇编语言的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门