2019年5月24日
emu8086使用指南(炒鸡新手友好向)
在计组课程中学习8086汇编语言时,masm,emu8086等在实践编写代码时是必须的工具。在这里介绍一下emu8086的使用。
emu8086是一个比较新手友好且方便、轻巧的工具。它结合了源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器),该软件包含了学习汇编语言的全部内容。
使用介绍:
双击emu8086.exe,打开后选择新建来编写代码,或者选择程序示例查看自带的例程代码。中间的区域用来编写代码。
点击新建可以选择4个模板:
/*这里可以不看,看了也用不上
第一个:COM模板。适用于简单且不需分段的程序,所有内容均放在代码段中,程序代码默认从 ORG 0100H 开始。
第二个:EXE模板。适用于需分段的复杂程序,内容按代码段、数据段、堆栈段划分。需要注意的是,采用该模板时,用户不可将代码段人为地设置为ORG 0100H,而应由编译器自动完成空间分配。
第三个:BIN模板。二进制文件,适用于所有用户定义结构类型。
第四个:BOOT模板。适用于在软盘中创建文件。
下面这句话才有用:) */
此外,若用户希望打开一个完全空的文档,可选择 empty workspace 选项。一般直接点击关闭按钮可直接进入源程序编辑状态。
实例1:熟悉主控界面
;在CPU各内部寄存器之间传送数据(除代码段寄存器CS和指令指针IP外)
![](http://www.xdusund.com/wp-content/uploads/2019/05/image.png)
点击 run 按钮程序开始进行。再次点击 run 可以停止运行。
点击 重载 可以从头开始执行程序。
点击 单步运行 可以单步调试。
点击 后退一步 可以返回到上一条指令(这个功能是一般调试器没有的)
界面左边是寄存器栏,这里可以动态地观察每一步地执行结果。
点击主控界面的菜单栏中的 查看->内存,或者主控界面下方的
附加->内存,可以观察程序内存区数值的变化。
点击主控界面下方的附加->有条件终止,可以设置条件断点。
点击主控界面下方的 调试 可以更详细的显示每一步的调试结果(这个功能类似Dos中debug功能)
点击主控界面下方的 标志 可以显示标志寄存器的值。如果刚刚执行的某一条指令修改了某个标志位的值则以红色显示。
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-1.png)
实例2:寄存器栏
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-2.png)
关于中间那个框的解释:
中间那个框第一列指的是地址,它的值等于 CS*16+IP ,即物理地址=段地址*16+偏移地址。图中此时CS的值为0100H,IP指向000AH,所以物理地址为0100AH。
第二列指的是指令对应的机器码,例如图中: 汇编指令MOV DX,09H的机器码是 BA 09 00
实例3:观察内存的变化
实例代码功能:将4行小写字母使用2层循环变成大写
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-3.png)
然后点击单步调试或者run观察内存中的数据变化。
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-4.png)
(注意观察红圈中的变化)
注:这里可以输入的地址格式包括但不限于:
ax:1200
ds:0000
1200
1200:0100 等
实例4:使用有条件终止调试代码
实例代码:
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-5.png)
然后点击主控界面的run,让代码自动运行。
可以观察到程序到了ax=3时停止。
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-6.png)
其他例如调试、堆栈、标志等功能可以自己尝试使用,这里不多做演示。
以上代码选自《计算机组成与设计》李伯成,顾新著 和 《汇编语言》第三版 王爽著
MOV BL,1
MOV AL,BL
MOV CX,BX
MOV DX,ES
MOV SI,BP
将代码输入后,点击“编译”或者“模拟”弹出主控界面:
![](http://www.xdusund.com/wp-content/uploads/2019/05/image.png)
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-1.png)
MOV AX,1200H
MOV DS,AX
MOV BX,AX
MOV CX,2
MOV DX,09H
点击编译或者模拟,弹出主控界面。尝试单步调试,观察寄存器栏中的各个寄存器的数值变化。
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-2.png)
;原理:因为小写字母比大写字母的ASCII值大32,32是2的5次方,即00100000b,
;那么我们就可以将小写字母和11011111b进行and操作,实现小写字母转换成大写。
assume cd:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
dw 0 ;定义一个字,用来暂存cx
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:
mov ds:[40h],cx ;将外层循环的cx值保存在datasg:40h单元中
mov si,0
mov cx,3 ;cx设置为内层循环的次数
s:
mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
mov cx,ds:[40h] ;用datasg:40h单元中的值恢复cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
点击编译或者模拟,打开内存查看,在内存地址栏里输入 ds:0000 ,点击刷新或者按回车,此时显示从ds:0000开始的内存情况。
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-3.png)
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-4.png)
MOV AX,1
MOV CX,5
text:
ADD AX,1
LOOP text
点击编译或模拟,打开有条件终止窗口,将条件断点设置为 ax = 3时停止。
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-5.png)
![](http://www.xdusund.com/wp-content/uploads/2019/05/image-6.png)