汇编语言程序的建立、运行与调试
实验一 汇编语言程序的建立、运行与调试
一、实验目的
- 熟悉汇编语言开发环境。
- 掌握EMU8086软件使用方法。
- 了解汇编语言的程序结构、调试一个简单的程序。
- 理解寻址方式的意义。
二、实验内容及要求
1.EMU8086的使用
(1)启动EMU8086程序,出现如下图所示的对话框,可选择new,建立新的汇编语言程序,也可打开code example读取示例程序。
图1.1 程序启动窗口
如点new建立新的汇编程序,弹出如下对话框,选择代码的模板。
图1.2 程序模板选择窗口
(2)选择EXE模板,点击ok,出现源代码编辑界面,如下图所示:
图1.3 模板创建的源程序编辑窗口
在底色为黑色的 ;add your code here文字下面输入自己的程序语句编辑源程序。
编辑完成后点save即可保存成以.asm为扩展名的汇编源文件。模板中给出的是完整段定义源程序格式,如果希望采用简化段定义格式,可在模板选择界面中按下图操作,建立空白模板。
图1.4 创建空白模板示意图
选择empty workspace,点击OK按钮,打开如下图所示的窗口。
图1.5 空白模板建立的源程序编辑窗口
在窗口中直接录入源程序代码,然后保存为扩展名为.asm的汇编语言源文件。
图1.6 在空白编辑窗口中录入源程序并保存
(3)程序的汇编与运行
源程序编辑完成并保存后,点击上图中的compile按钮,则自动完成对程序的汇编与链接,生成主文件名与源文件相同的扩展名为 .EXE的可执行文件。
图1.7 汇编状态窗口
图1.8 工作目录及生成的文件列表
点击assembler status窗口中的run按钮即可运行可执行文件。
图1.9 程序运行状态信息
图1.10 程序模拟输出窗口
(4)程序的调试
点击图1.6中的emulate按钮即可启动对程序的调试。具体调试方法请参阅“Emu8086仿真软件使用方法”(随软件压缩包一起提供)。
图1.11 仿真调试窗口
图1.12 源代码显示窗口
请自行在“Emu8086仿真软件使用方法”文件的指导下,理解图1.11仿真调试窗口中各菜单命令和功能按钮的功能和使用方法,学习调试工具的使用和汇编语言程序的调试方法。
2.实验要求
(1)认真学习Emu8086仿真程序的功能和使用方法;
(2)掌握8086汇编语言程序的建立过程和调试方法;
(3)掌握基本指令和伪指令语句的使用方法;
(4)理解寻址方式及逻辑地址和物理地址的变换。
(5)记录实验过程及结果,完成并提交实验报告。实验报告的格式请参见实验报告模板。
三、实验结果
输出结果:
寄存器数据:
将代码段的段地址存入DS和ES
将AX中的数据7777h和变量dvar中的数据1111h相加,结果存入ax
最后的寄存器数据
内存数据:
数据段的短地址从0710开始
四、实验总结
此次实验,我熟悉了汇编语言的开发环境,掌握了EMU8086的使用方法,怎么创建一个汇编语言程序,如何查看寄存器中的数据以及内存中的数据,单步操作以及设置断点。我根据教材写了一个简单的程序,程序中,定义了字节变量、字变量、双字变量还有常量,还在代码段中加入了mov、add、dec等指令。指令中也使用了直接寻址、立即寻址、寄存器相对寻址等多种寻址方式。
在实验中也遇到了各种各样的问题,如此软件无法识别’?’,当我在程序数据段中定义变量时,输入?时便会报错,只好将其代替为0。还有一个问题是array db 2 dup(2,3,2 dup(4)),这样定义变量时,正确的结果应该是定义8个字节空间,数据是02,03,04,04,02,03,04,04,但此软件运行的结果是02,03,02,02,03,02,没有识别出括号里的dup(4),此软件没法进行这样的嵌套定义。
这次实验让我对这门课的知识有了更深的理解,之前还很迷糊。但自己上手打这些代码时,立马就能理解了。这对于我学习后面的内容也有了很大的帮助。
附录
- 程序清单
; multi-segment executable file template.
data segment
; add your data here!
pkey db "press any key...$"
bvar1 db 100,01100100b,64h,'d'
minint=5
bvar2 db -1,minint,minint+5
db 0,2 dup(20h)
wvar1 dw 2010h,4*4
wvar2 dw 0
dvar dd 12347777h,87651111h,0 ;dvar[0]为12h,而不是12347777h
abc db 'a','b','c',0 ;可以当作一个数组,abc[0]的值是61h
maxint equ 0ah
string db 'ABCDEFGHIJ'
crlfs db 13,10,'$' ;这里的$不是结束符,'$'=24h
array1 dw maxint dup(0)
array db 2 dup(2,3,2 dup(4));8个字节内容依次是02,03,04,04,02,03,
;04,04,而此软件显示02,03,02,02,03,02,未能识
;别括号中的dup(4)
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
; add your code here
mov dl,bvar1 ;bvar1表示它的第一个数据100复制到DL
dec bvar2+1 ;bvar2+1表示它的第二个数据5自减
mov abc[3],dl ;abc[3]和abc+3等价
mov ax,word ptr dvar[0] ;表示取一个字,dvar[1]dvar[0],7777h
mov dx,word ptr dvar[2] ;dvar[2]为34h,dvar[3]为12h,1234h,取了双字
;到DX.AX
add ax,word ptr dvar[4] ;7777h+1111h
adc dx,word ptr dvar[6] ;1234h+8765h+CF,完成了双字的运算
mov word ptr dvar[8],ax ;
mov word ptr dvar[10],dx ;双字和保存到dvar的第三个双字单元
mov cx,maxint ;立即寻址
mov bx,0
again:add string[bx],3 ;寄存器相对寻址
inc bx
loop again
lea dx,abc ;取abc[0]地址,从abc字符串开始显示,到后面遇到'$'结束
mov ah,09h
int 21h
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.