Java教程

8086Assembly00——初学汇编语言

本文主要是介绍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——初学汇编语言的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!