emu8086使用指南(炒鸡新手友好向)

在计组课程中学习8086汇编语言时,masm,emu8086等在实践编写代码时是必须的工具。在这里介绍一下emu8086的使用。

       emu8086是一个比较新手友好且方便、轻巧的工具。它结合了源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器),该软件包含了学习汇编语言的全部内容。

使用介绍:

       双击emu8086.exe,打开后选择新建来编写代码,或者选择程序示例查看自带的例程代码。中间的区域用来编写代码。

       点击新建可以选择4个模板:

/*这里可以不看,看了也用不上  

       第一个:COM模板。适用于简单且不需分段的程序,所有内容均放在代码段中,程序代码默认从 ORG 0100H 开始。

       第二个:EXE模板。适用于需分段的复杂程序,内容按代码段、数据段、堆栈段划分。需要注意的是,采用该模板时,用户不可将代码段人为地设置为ORG 0100H,而应由编译器自动完成空间分配。

       第三个:BIN模板。二进制文件,适用于所有用户定义结构类型。

       第四个:BOOT模板。适用于在软盘中创建文件。

下面这句话才有用:)   */

       此外,若用户希望打开一个完全空的文档,可选择 empty workspace 选项。一般直接点击关闭按钮可直接进入源程序编辑状态。

实例1:熟悉主控界面

;在CPU各内部寄存器之间传送数据(除代码段寄存器CS和指令指针IP外)

MOV BL,1
MOV AL,BL
MOV CX,BX
MOV DX,ES
MOV SI,BP

将代码输入后,点击“编译”或者“模拟”弹出主控界面:


点击 run 按钮程序开始进行。再次点击 run 可以停止运行。

点击 重载 可以从头开始执行程序。

点击 单步运行 可以单步调试。

点击 后退一步 可以返回到上一条指令(这个功能是一般调试器没有的)

界面左边是寄存器栏,这里可以动态地观察每一步地执行结果。

点击主控界面的菜单栏中的 查看->内存,或者主控界面下方的 附加->内存,可以观察程序内存区数值的变化。

点击主控界面下方的附加->有条件终止,可以设置条件断点。

点击主控界面下方的 调试 可以更详细的显示每一步的调试结果(这个功能类似Dos中debug功能)

点击主控界面下方的 标志 可以显示标志寄存器的值。如果刚刚执行的某一条指令修改了某个标志位的值则以红色显示。

实例2:寄存器栏

MOV AX,1200H
MOV DS,AX 
MOV BX,AX
MOV CX,2
MOV DX,09H

       点击编译或者模拟,弹出主控界面。尝试单步调试,观察寄存器栏中的各个寄存器的数值变化。

关于中间那个框的解释:

       中间那个框第一列指的是地址,它的值等于 CS*16+IP ,即物理地址=段地址*16+偏移地址。图中此时CS的值为0100H,IP指向000AH,所以物理地址为0100AH。

       第二列指的是指令对应的机器码,例如图中:        汇编指令MOV DX,09H的机器码是 BA 09 00

实例3:观察内存的变化

实例代码功能:将4行小写字母使用2层循环变成大写

;原理:因为小写字母比大写字母的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开始的内存情况。

然后点击单步调试或者run观察内存中的数据变化。

(注意观察红圈中的变化)

注:这里可以输入的地址格式包括但不限于:

              ax:1200

              ds:0000

              1200

              1200:0100 等

实例4:使用有条件终止调试代码

实例代码:

MOV AX,1                     
MOV CX,5

text:
    ADD AX,1
    
LOOP text

点击编译或模拟,打开有条件终止窗口,将条件断点设置为 ax = 3时停止。

然后点击主控界面的run,让代码自动运行。

可以观察到程序到了ax=3时停止。

其他例如调试、堆栈、标志等功能可以自己尝试使用,这里不多做演示。

以上代码选自《计算机组成与设计》李伯成,顾新著 和 《汇编语言》第三版 王爽著


Add a Comment

电子邮件地址不会被公开。 必填项已用*标注