Emu8086使用指南 联系客服

发布时间 : 星期日 文章Emu8086使用指南更新完毕开始阅读6780fc4e852458fb770b5651

事实上,上面程序是将字符直接写入显示内存。

通过上面的例子,你可以发现 MOV 指令是非常有用的。

变量

变量是一个内存地址。对于编程者来说,使用诸如名称为“var1”这样的 变量保存数据远远比使用5a73:235b这样的地址容易的多。特别是当你使用10个以上的变量的时侯。 编译器支持这两种变量 BYTE 和 WORD.(字节和字)

声明变量的方法: name DB value 名称 DB 值 name DW value 名称 DW 值 DB - stays for Define Byte. DW - stays for Define Word. name -可以是任何字母与数字构成,但是必须由字母开头。可以通过不命名来声明一个 没有名称的的变量(这个变量只有地址,没有名称) value - 可以是任何数值支持三种进制(十六进制,二进制和十进制),你可以使用\符号表示初始值没有确定。 你可能从第二章了解到, MOV 指令是将数值从源拷贝到目的。 让我们再看一个 MOV 指令的例子

#MAKE_COM# ORG 100h MOV AL, var1 MOV BX, var2 RET ; stops the program. VAR1 DB 7 var2 DW 1234h 将上面的代码拷贝到emu8086源程序编辑器中,按下F5键编译 并在模拟器中执行。你会看到如下画面

从画面可以看出,反编译后的代码同源程序很相似,不同的是变量被具体的内存地址取代。当编译器生成机器代码它会自动将变量名称用该变量的便宜量代替。默认情况下,DS 寄存器存放段偏移(当执行com文件的时侯,DS 寄存器的值同 CS 寄存器(代码段)的值一样)。内存第一列是偏移(offset),第二列是一个十六进制值(hexadecimal value),第三

列是十进制(decimal value),最后一列是 ASCII 字符。编译器是非大小写敏感的,所以 “VAR1” 同 “var1” 都是同一个变量。

VAR1变量的偏移是0108h,物理地址是0b56:0108 var2 变量的偏移是0109h,物理地址是 0b56:0109

这个变量是字,它占用2字节。这里假定低字节存放在低地址,所以34h位于12h前面。 你可以看到,在RET指令后面还有一些指令,这样是因为反编译工具无法判断数据从什么地方开始。同样,你可以写出直接使用DB的程序.

#MAKE_COM# ORG 100h DB 0A0h DB 08h DB 01h DB 8Bh DB 1Eh DB 09h DB 01h DB 0C3h DB 7 DB 34h DB 12h 将上面的代码拷贝到emu8086原代码编辑器,按下F5键编译,并在模拟器中运行,你可

以看到同样的反汇编结果,得到同样的功能。根据上面,你可以猜测,编译器将源程序转化为一些字节的集合,这个集合被称作机器代码(machine code),处理器懂得他们,并且执行它们。ORG 100是一个编译指令(它告诉编译器如何处理源代码)当你使用变量的时侯,这条指令特别重要。它通知编译器可执行程序将被调入偏移量是100h(256字节)的位置,有了它,编译器就可以计算出所有变量的正确地址,然后用这些地址(偏移量)来代替变量名称。上面的这些指令不会真正的编译为任何机器代码。为何可执行程序总是被装入偏移量100h?操作系统在CS寄存器(代码段)存储着程序信息,比如命令行方式下的参数等等。尽管上面只是一个COM文件的例子,EXE文件调入在偏移量0000的位置,他使用特定的段保存变量。我们在下面会学习到关于EXE文件的知识。

数组

数组可以看作是变量链。一个字符串是一个字节数组的例子,其中每一个字符都当作一个ASCII码的值(0....255)下面是一些定义数组的例子 a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h b DB 'Hello', 0

b是一个数组,当编译器发现引用了字符串值后,会自动将这些字符转化为对应的字节。下面图表表示的就是声明数组后在内存中的分布:

你可以使用方括号做下标直接访问到数组中的值,例如:

MOV AL, a[3] 同样,你还可以使用任意一个内存索引寄存器BX, SI, DI, BP,例如: MOV SI, 3