本系列博文将会系统地讲解汇编语言程序设计相关知识体系,包括微机原理、汇编语言程序设计等几个部分。本系列博文的案例都是基于8086系统的,使用的工具为软件emu8086
因学校开设的课程,对于汇编语言有一点点理解,希望通过本系列一起学习进步。通过学习汇编语言可以感知计算机程序的运行过程和运行原理汇编学得好对于高级语言是有一定的好处的。例如C语言中的指针就是令人头痛的部分,指针就是内存的地址,而汇编恰恰谈的是地址的形成和使用。如今,一系列智能芯片应用越来越广泛,他们都是采用汇编编写底层设备驱动程序和实时性好的应用程序。8086汇编语言是具有代表性的,先从16位计算机汇编入手,循序渐进,过渡到32位的混合编程。学好语言只有一个办法多练习。
本文适合对汇编感兴趣或者是正在学习的小白。
本文内容较多,且时间匆忙,难免会出现错误,还请观众们多多指正。编写整理不易,转载请注明出处。
以下是以后更新的内容。
基本上这是以后要更新的内容,后续可能有一定的修改。今天主要更新概述里面的工具使用。
说到工具,第一个离不开的肯定书籍,接下来列出一些可用的的书籍。
1.王爽 汇编语言 清华大学出版社 电子书1下载传送门
提取码:ppbm
2. 微机原理、汇编语言与接口技术 人民邮电出版社
电子书2下载传送门
== 提取码:0mxy ==
3.周明 汇编语言程序设计 科学出版社
1.DOS环境下的汇编
汇编语言可以通过Windows7附带的DOS系统进行命令编译,对于简单的且命令较少的可以采用DOS。对于指令和程序段多的还是要用集成环境。本系列都采用集成的开发环境emu8086。简单介绍一下DOS环境下的汇编开发。
需要说明的是,Windows7以后的计算机里面已经没有debug命令,需要自己下载安装配置环境才可以使用debug命令,在CSDN有相关的介绍和方法,这里不做过多介绍。没找到不要紧,只是感受一下就好,后面都是emu8086开发。
2.DOS下的汇编开发
DEBUG程序是DOS下输入、调试和运行汇编语言程序的工具软件。在DOS提示符下输入”DEBUG”,按回车。或者输入”DEBUG文件名”,再按回车都可启动DEBUG。DEBUG启动后屏幕上出现DEBUG提示符“-”,这时就可以输入DEBUG的各种命令了。出现提示符“-”后输入“?”并回车,屏幕上会显示DEBUG的所有命令及格式。 DEBUG命令都是一个字母后跟一个或多个参数。命令格式中放在[]中的参数是可选项,省略时用默认值。命令参数中,出现得最多的address(地址)和range(范围)。 address是内存中的地址,用逻辑地址“段值:偏移量”表示。range是命令所操作的内存范围,可以用“首地址:末地址”表示,末地址中的段值和首地址中的段值一样;也可以用“首地址L字节数”表示,L(Length)是长度的意思;或者只给出首地址,长度用默认值。 DEBUG中不允许用标识符;不区分大小写;数都是十六进制数,且不用H表示,可以以字母开头。DEBUG常用命令使用方法如下:
(1)寄存器命令R,格式为:R[ register]。用来检查或修改寄存器的内容。R命令后面若不给出寄存器名,则显示所有寄存器的内容;若给出寄存器名,则可以显示并修改该寄存器的内容。R命令后面只能跟16位寄存器名,若要修改,输入十六进制数;若不修改,回车即可。
(2)显示命令D(Dump),格式为:D[range],用于显示内存单元的内容,默认范围是接着上面显示完的继续显示128个字节。
(3)汇编命令A(Assemble),格式为:A [address]。用于输入、汇编或者修改目标程序。用于输入汇编语言的语句并将语句汇编成机器码存放在指定单元。
(4)反汇编命令U(Unassembled),格式为:U [Range]可以将某一段内存区域的内容反汇编显示该区域二进制机器代码对应的汇编指令。
(5)写命令W(Write),格式为:W [ address ][drive][first sector[number]用于把内存中段区域的数据写入到磁盘指定区域或写入到某文件中。[ address是数据在内存的起始地址;如果没有给出地址,则以CS:100H为起始地址。数据的字节数要放在BX和CX寄存器中。如果数据要写到磁盘中,则在W命令后要给出参数 [drive][ first sector][number]。如果数据写到文件中,在要先用N命令指定要保存数据的文件名,文件的扩展名可以为COM,文件也可以没有扩展名。
(6)装入命令L(Load),格式为:L [address ][drivel[first sector I[number]。用于将指定文件或指定磁盘区域中的数据装到内存。[ address]为内存区域的首地址,若没有规定则从CS:100H开始。drive][first sector ][number]参数是将磁盘的数据装入内存用的。若从文件装入数据,则需在L命令执行前用N命令指定要装载的文件名称。如果N命令指定的文件扩展名为COM,则数据或程序装入从CS:100H开始的内存区域。如果N命令指的文件扩展名为EXE,则装入从CS:0000开始的内存区域中。装入后在BX和CX中包含所装程序的字节数,而不是文件的大小。
(7)运行命令G(Go),格式为:G[= address ][addresses]参数 address规定执行的起始地址,如不给出,则以当前的CS:P为运行的起始地址;参数[ addresses为程序运行的断点地址,最多可以有10个断点,断点间以空格或逗号隔开;如果地址中没有给出段值,则以CS为段值。
(8)追踪命令T( Trace),格式是: TIaddressI value]参数[- address] G命令中的作用相同。参数[ value指明执行几条指令后停下来,若在T命令中没有给出值,则默认为1。T命令会进入到子程序、中断服务子程序等指令内部执行。如果不要看内部执行情况,可改用P命令执行。
(9)继续命令P( Proceed),格式是:P[= address]number]。P命令的用法与T命令类似,只是不会进入到子程序或中断服务子程序中执行。
(10)退出命令Q(Quit),退出 DEBUG时,只需在 DEBUG提示符“”后面输入“Q即可。
(11)修改内存单元内容,命令E( Enter),格式为: E address [list] 。 address为要修改内容的内存单元的地址,或内存区域的首地址;[list]为向这些内存单元输入的数据列表,每个单元一个字节,数之间用空格或逗号隔开。[list]是可选项,如果不给出则逐一输入,每输入一个按空格键就可接着输入下一个单元的数据,退出输入按回车键即可。
(12)填充命令F(Fl1),格式为: F range List。 range的用法与前面D命令中相同,List为要填入的数据列表,用法与E命令中相同。如果List所含的字节数比 range要求的少,则Lit被重复使用,如果Lit所含的字节数比 range要求的大,则多余的被略去。
(13)传送命令M(Move),格式为: M range address。 range指定要被拷贝的内存区域的地址范围, address指定要拷贝去的内存区域的首地址。
(14)比较命令C( Compare),格式为: C range address range指定要被比较的内存区域的地址范围, address指定要比较的另一内存区域的首地址。把不同的单元的内容显示出来。
(15)十六进制运算命令H(Hex),格式为: H Valuel value2。显示两个十六进制数相加的和以及第1个数减去第2个数的差,以补码形式显示。
(16)输入命令I(Input),格式为: I port。从指定端口读入一个字节数据并显示。
(17)输出命令O( Output),格式为: O port byte。将一字节数据送指定端口。
(18)搜索命令S( Search),格式为: S range list。在指定的地址范围内查找给定数据。
打开后界面如下:
试一下几个命令,例如演示立即寻址(在后面指令系统会提到,先做了解)
用·DOS来实现可以发现,对于指令较少的使用时可以的。但是对于指令较多时不易使用且命令格式较多。
1.简介
EMU8086-MicroprocessorEmulator是你学习汇编必不可少的工具。这套软件对于刚开始学习汇编语言的朋友非常有帮助。它能够编译源代码,并在模拟器上一步一步的执行。可视化界面令操作易如翻掌。可以在执行程序的同时观察寄存器,标志位和内存;算术和逻辑运算单元(ALU)显示中央处理器内部的工作情况。这个模拟器是在一台"虚拟"的电脑上运行程序的,它拥有自己独立的“硬件”,这样你程序就同诸如硬盘与内存这样的实际硬件完全隔离开,动态调试(DEBUG)时非常方便。8086的机器代码同INTEL下一代微处理器完全兼容,包括Pentium II 和 Pentium 4。这意味着8086代码具有很广泛的应用范围,它在老式的和最新的计算机系统上都能工作。
8086指令的另外一个优点是它的指令集非常小,这样学起来会容易得多。Emu8086同主流汇编程序相比,语法简单得多,但是它能生成在任何能兼容8086机器语言的代码。注意:如果你不使用Emu8086编译程序,那你无法在运行的时候单步跟踪。
打开的界面如下:
新建时会发现以下界面:
他们都是一些模板,下面一一介绍,仅做了解。
COM 模板
最古老的一个最简单的可执行文件格式。采用此格式,源代码应该在100H后加载(即:源代码之前应有ORG 100H)。从文件的第一个字节开始执行。 支持DOS和Windows命令提示符。
EXE模板
一种更先进的可执行文件格式。源程序代码的规模不限,源代码的分段也不限,但程序中必须包含堆栈段的定义。您可以选择从新建菜单中的EXE模板创建一个简单的EXE程序,有明确的数据段,堆栈段和代码段的定义。程序员在源代码中定义程序的入口点(即开始执行的位置),该格式支持DOS和Windows命令提示符。
COM文件和EXE文件的区别:
(1).COM文件一般比较小,其大小不能超过64KB,而.EXE文件一般比较大,可以超过64KB。
(2).COM文件装入内存较快,而.EXE文件较慢。
(3).COM文件一般比较简单,.EXE文件则比较复杂,编写的难度较大。
(4).COM文件在执行时段寄存器含有相同的值,即代码、数据等混合在一起,而.EXE文件在执行时段寄存器含有不同的值,即代码、数据等驻留在不同的段中。
(5)驻留在磁盘上的.COM文件既无文件头也没有任何其它的内部标识信息,而驻留在磁盘上的.EXE文件有一个文件头(也称作控制信息块)、一个重定位图以及DOS使用的其它信息。
(6)对.COM文件来说,DOS的装入程序不能为其执行段重定位,而对.EXE文件来说,其执行段可以被重定位。
(7).COM文件只能有一个段,而.EXE文件可以有一个以上的段。
(8).COM文件不能有段堆栈,.EXE文件则可以有。
看不懂不要紧,因为本系列不用这些模板,只讲基础的。一般选择empty即可。
然后就可以进入界面写代码,至于其他功能自己去探索吧!!!
2.写好的代码如何运行
(1)代码编写结束,点击菜单【文件】【另存为……】,将源代码换名保存。本例将源代码保存为001.asm。点击工具栏的【模拟】按钮,如果程序有错误不能编译,界面会提示。
(2)如果源程序无错误,则编译通过,出现如图所示的界面:
(3)点击【单步执行】,观察各寄存器的变化,程序将每执行一条指令便产生一次中断。点击【运行】,程序将从第一句直接运行到最后一句。界面的左侧可以观察程序运行过程中,各个寄存器的值的变化。
点击主控界面下面的screen可以显示模拟输出窗口
至于其他的功能以后的整理中会讲解(最好是自己去试一下)
编译通过后的界面
运行结果图
工具的讲解就说到这里,那么问题来了,这么好的东西在哪里可以下载买得到 呢
当然在这里呀------》下载链接:下载传送门
提取码:cb32
安装可以使用汉化也可以不用,破解方法在TXT文件里面有说明。安装方法不再赘述 (其实是因为懒)
本次的更新就到此结束,还有什么问题可以私信留言或评论。创作不易还请多多支持!!!