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

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