您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 汇编语言助手Emu8086使用指南
Emu8086集源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器)于一身,它优于一般编译器的地方在于提供了一个虚拟的80x86环境,拥有自己一套独立的“硬件”,可以完成一些纯软件编译器无法完成的功能例如Led显示,交通灯,步进电机等等,而且动态调试(DEBUG)时非常方便。简单的例子:安装完成后选择菜单栏中的文件examplessteppermotor在编辑框出现了相应的源码。点击compile编译选择一个文件保存保存完之后会弹出一个对话框点击run按钮则程序开始运行调试时主控界面如下:再次点击run可以停止运行单击reload可以从头开始执行程序单击singlestep可以单步调试。单击stepback可以返回到上一条指令(这个功能也是一般调试器没有的)。界面左边是寄存器栏,这里可以动态的观察每一步的执行结果点击主控界面下面的screen可以显示模拟输出窗口单击source可以查看源码窗口Reset相当于上面的reload键。单击aux会出现一个菜单选择第一项memory可以观察程序内存区数值的变化。选择stoponcondition可以设置条件断点:上面的设定当ax的值是0x0006是断下来单击run按钮可以看到断下来的时候ax值正好等于6单击vars可以查看运行过程中变量的变化。Debug可以更详细的显示每一步的调试结果通过Stack(堆栈)可以观察函数调用的过程Flags显示标志寄存器的值。如果刚刚执行的那一条指令修改了哪个标志位的值则以红色显示。可以到这个网址去下载:目前网上很多人找这个软件的破解版。。其实根本不用破解。。只要在用户名一栏输入任意的字符注册码的前三位输入“112”就可以绕过注册认证了。。至于为什么我就不多说了有兴趣的可以看一下我在看雪论坛发表的一篇文章:=119741下面是在百度文库下载的一篇基础教程希望能对大家有所帮助。。。。如何运行?1.在开始菜单选在它的图标,或者直接运行Emu8086.EXE2.在"FILE"菜单中选择"SAMPLE"3.点击"CompileandEmulate"按纽(或者按快捷键F5)4.点击"SingleStep"按纽(或者按快捷键F8),可以查看代码如何运行.十进制系统目前使用最多的是十进制.十进制系统有10个数字0,1,2,3,4,5,6,7,8,9利用这些数字能表示任何数值,例如754这些数字是由每一位数字乘以“基数”的幂累加而成的(上一个例子中基数是10因为十进制中有十个数字)。位置对于每一个数字是很重要的。例如,你将上一个例子中的“7”放到结尾:547数值就成为:特别提醒:任何数字的0次幂都是1,0的0次幂也是1二进制计算机没有人类聪明(至少现在是这样),制造一个只有开关或者称为0,1两种状态的电子机器很容易。计算机使用二进制系统,只有两个数字0,1基地为2每一位二进制数称作一位(BIT),4BIT组成一个半字节(NIBBLE),8BIT组成一个字节(BYTE),两个字节组成一个字(WORD),两个字组成一个双字(DOUBLEWORD)(很少使用):习惯上在一串二进制后面加上“b”,这样,我们可以知道101b是二进制表示十进制的5。二进制10100101b表示十进制的165,计算方法如下:十六进制系统十六进制系统使用16个数字0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F基底是16.十六进制非常紧凑,便于阅读。将二进制转换为十六进制很容易,半字节(4bits)对应一位十六进制如下表Decimal(base10)Binary(base2)Hexadecimal(base16)000000100011200102300113401004501015601106701117810008910019101010A111011B121100C131101D141110E151111F习惯上我们在一个十六进制数的后面加上H,以便和其他进制区别,这样我们就知道5Fh是一个十六进制数表示十进制的95。习惯上,我们也在以字母开头(从A到F)的十六进制数前面加上0例如:0E120h.十六进制1234h等于4660:十进制到另外进制的换算在换算中,将十进制数不断除以目标进制的基底,每一次都要记录下商和余数,直到商0。余数用来表示结果。下面是一个十进制39(基底是10)到十六进制(基底是16)的换算:结果为27H上例中所有的余数都小于10,不必使用字母。再举一个更复杂的例子:十进制43868换算为十六进制:结果是0AB5Ch,使用上面提到的表将大于9的数字替换成字母。运用同样的原理,我们可以换算为二进制(用2作除数),或者是先换算成十六进制,再用上面的表换算成二进制:于是,得到二进制:1010101101011100b有符号数对于十六进制数0FFh无法确定它是正数还是负数,因为它可以表示十进制的255或者-1。8位可以表示256个状态,于是,我们可以假定前128个表示正数(从0到127),接下来的128个数(从128到256)表示负数。如果想表示-5,我们从256中减去5,即256-5=251。用这种复杂的方法表示一个负数有着数学依据的,数学上-5加上5等于0。当我们将两个8位的数字5和251相加时,结果超过255,溢出处理为0!128到256高位始终是1,这个可以作为数字符号的标记对于字(16位),16位有65536个状态,头32768个状态(从0到32767)用来表示正数,下面的32768个状态(从32767到65535)表示负数Emu8086带有数制转换工具,也可以计算各种数值表达式。选择菜单Math项:NumberConvertor(数制转换)可以实现任意数制之间的转换。在文本框中填写源数值,将自动转换到任意的数制。可以作8位或者16位转换。ExpressionEvaluator(表达式计算)可以用来计算不同数制的计算以及从一个进制到另一个进制的转换。输入表达式,按下回车,结果就会以你选定的进制表示。最长可以进行32位的计算。当在Signed打钩选中时(除了八进制和双字),最前面的一位将被认作是符号位。这样以来,0FFFFFFFFh将被认为是十进制的-1。例如,你计算0FFFFh*10h+0FFFFh(8086CPU所能访问的最大内存地址)。如果你选中Signed和Word选项,结果是-17(因为表达式被认为是(-1)*16+(-1))。如果想按照无符号数计算,请不要选择Signed表达式为65535*16+65535计算结果将是1114095同样你可以使用NumberConvertor将非十进制换算为有符号的十进制,然后根据十进制计算。支持如下运算:~not(invertsallbits).*multiply./divide.%modulus.+sum.-subtract(andunary-).shiftleft.shiftright.&bitwiseAND.^bitwiseXOR.|bitwiseOR.二进制必须有“b”作结尾,例如00011011b十六进制必须有h作结尾,另外,当地一位是字母时,最前面必须加上0,例如:0ABCDh八进制必须有o作结尾,例如:77o什么是汇编语言?汇编语言是底层编程语言。为了学习这门语言,你需要对于计算机结构有所了解。计算机系统模型如下:系统总线systembus(图中黄色部分)是将计算机各个部分连接到一起的部件。CPU是计算机的心脏,大部分的运算都是在CPU中完成的。RAM是读取并且存放将要执行的程序的地方。CPU内部通用寄存器8086CPU有8个通用寄存器,每一个寄存器都有自己的名称:AX累加寄存器accumulatorregister(分为AH/AL).BX基址寄存器baseaddressregister(分为BH/BL).CX计数寄存器countregister(分为CH/CL).DX数据寄存器dataregister(分为DH/DL).SI源变址寄存器sourceindexregister.DI目的变址寄存器destinationindexregister.BP基址指针寄存器basepointer.SP堆栈寄存器stackpointer.编程中,由程序员决定通用寄存器的具体用途。寄存器的主要目的是保存数值(变量)。上面提到的寄存器是16位的,意思是:0011000000111001b(二进制),或者12345(十进制形式)。4个通用寄存器(AX,BX,CX,DX)在使用时分为两个8位寄存器,例如假设AX=0011000000111001b,AH=00110000bAL=00111001b。当你修改其中任意8位值,整个16位寄存器的值同样改变。同样对于其他的3个寄存器,“H”表示高8位,“L”表示低8位。寄存器在CPU内部,访问中它们速度远远超过内存。因为,访问内存需要经过系统总线,所以时间要长一些。而访问寄存器中的数据几乎不需要时间。于是,编程中,应当尽量在寄存器中保存数据。虽然寄存器很小,并且这些寄存器都有具体用途,但他们依然是存放计算中临时数据的好地方。段寄存器CS代码段寄存器,用来存放当前正在运行的指令DS数据段寄存器,用来存放当前运行程序所用的数据ES附加段寄存器,由程序员决定用途SS堆栈段寄存器,指出堆栈所在区域尽管容许在段寄存器中存放任何数据,但是这决不是一个好主意。段寄存器有着非常特别的目的--指出可以访问内存块的地址。段寄存器与通用寄存器协同工作就可以访问任意的内存区域。例如,如果我们打算访问物理地址是12345h(十六进制)的内存单元,我们应设置DS=1230hSI=0045h这样以来,我们便能访问超过一个寄存器(16位)所能表示的内存地址的范围。CPU计算物理地址的方法是将段寄存器乘以10H在加上一个特定的通用寄存器。(1230h*10h+45h=12345h):这种,由两个寄存器生成的地址被称为有效地址(effectiveaddress)默认下,BX,SI及DI与DS协同工作,BPSP与SS寄存器协同工作。其余的通用寄存器不能形成有效地址!同样,尽管BX可以形成有效地址,但是BHBL不能!控制寄存IP指令指针寄存器instructionpointer、FlagsRegister状态标志寄存器IP始终同CS协同工作,指出当前执行的指令。FlagsRegister完成一次数学运算后,由CPU自动修改,通过它可以得到当前结果类型,也可以作为跳转语句条件。通常你无法直接访问它们。寻址方式我们可以通过下面的四个寄存器来寻址BX,SI,DI,BP.通过计算[]符号中的值,我们可以访问到不同内存单元的值。具体组合请看下表:[BX+SI][BX+DI][BP+SI][BP+DI][SI][DI]d16(variableoffsetonly)[BX][BX+SI]+d8[BX+DI]+d8[BP+SI]+d8[BP+DI]+d8[SI]+d8[DI]+d8[BP]+d8[BX]+d8[BX+SI]+d16[BX+DI]+d16[BP+SI]+d16[BP+DI]+d16[SI]+d16[DI]+d16[BP]+d16[BX]+d16d8-表示8位偏移量d16-表示16位偏移量偏移量可以是一个立即数或者是一个变量的偏移,或者二者兼备。这取决于编译器如何计算单独的立即数。偏移量可以在[]符号里面或者外面,这不影响编译器生成相同的机器码。偏移量是一个有符号数,可以是正数或者负数。一般说来,8位或者16位,对于编译后的结果是有影响的。例如,假定DS=100,BX=30,SI=70。如下寻址方式[BX+SI]+25计算物理地址为100*16+30+70+25=1725默认下,DS寄存器应用在除了BP寄存器之外的所有物理地址计算中,寄存器是和SS寄存器一起工作的。用过下面的表,你可以和轻松记住谁和谁是关联在一起
本文标题:汇编语言助手Emu8086使用指南
链接地址:https://www.777doc.com/doc-4094434 .html