汇编语言程序设计-实验
3.用连接程序生成可执行程序文件 .
在DOS状态下键入以下命令: D:\MASM> LINK EG1 经汇编以后产生的目标程序文件(.OBJ文件) 并不是可执行程序文件,必须经过连接以后,才能 成为可执行文件(即扩展名为.EXE)。
连接过程如下图所示
提示将要产生的可执行文件名,通 提示将要产生的可执行文件名, 常直接按回车键表示使用默认文件 名 内存映象文件的提示,直接按回车键 内存映象文件的提示, 表示不产生此文件。 表示不产生此文件。 内存映象文件的提示,直接按回车键 内存映象文件的提示, 表示不产生此文件。 表示不产生此文件。
汇编语言程序设计 实验
汇编程序开发过程
建立汇编源程序(即:建立 文件名.asm) 使用EDIT.EXE文本编辑器进行输入 编译目标文件(即:编译为.obj 文件) 使用MASM进行汇编 编译不通过,重新修改(错误类型:源程序语句不合法) 依据MASM汇编过程中给出的行号进行修改 连接为可执行文件(即:连接为.exe 文件) 使用LINK进行连接 运行编译好的可执行文件 用调试工具调试,重新修改(逻辑错误)
参考程序:
要显示字符串必须以“$”为结束符 DATA SEGMENT 数据段定义 BUF DB 'Hello, world !$' 堆栈段的定义最后一定要加上STACK DATA ENDS STACK SEGMENT STACK DW 36 DUP(?) 堆栈段定义 STACK ENDS CODE SEGMENT ;段寄存器声明 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ;主程序开始 MOV DS,AX MOV DX,OFFSET BUF MOV AH,9 显示字符串的9号DOS功能调用 INT 21H MOV AH,4CH 结束程序的运行,返回DOS INT 21H CODE ENDS ;结束主程序 END START
源程序建立以后,在DOS状态下,采用宏汇编程 序MASM对源程序文件进行汇编,其操作过程如 下图所示。
要求输入目标文件名,[ ]中 要求输入目标文件名, ]中 已经有默认文件名, 已经有默认文件名,通常直 接按回车键予以确认即可, 接按回车键予以确认即可, 其扩展名是.OBJ 其扩展名是.OBJ 默认产生的列表文件名 为空, 为空,直接按回车键即 可。 要求输入交叉引用文件名, 要求输入交叉引用文件名, 默认情况下不产生这个文件, 默认情况下不产生这个文件, 所以直接回车确认即可。 所以直接回车确认即可。
2. 将源程序文件汇编成目标程序文件 .
在DOS状态下键入以下命令: D:\MASM> MASM EG1.ASM MASM宏汇编程序的主要功能有以下3点:
检查源程序中存在的语法错误,并给出错误信息。 若源程序经汇编后没有语法错误,则产生扩展名 为.OBJ的目标程序文件。 若源程序中使用了宏指令,则汇编程序将展开宏指令。
执行过程
在DOS状态下键入以下命令: D:\MASM> EDIT EG1.ASM 此时屏幕的显示状态如下图所示。
EDIT环境操作 环境操作 进入EDIT后,屏幕的第一行是菜单栏。 可以用鼠标激活菜单,在弹出下拉菜单中 选择所需功能,用File主菜单下的“Save” File Save” 存盘功能保存文件。最后通过选择File菜单 下的Exit项退出EDIT编辑环境。
说明
当程序中没有定义堆栈段或虽然定义但不符合要求时, LINK在最后一行会给出类似 “LINK : warning L4021: no stack segment”的警告信息,表示用户程序没有定义堆栈 段。该警告信息不影响可执行程序的生成和正常运行,因 为若用户程序没有定义堆栈段,程序运行时会自动使用系 统提供的默认堆栈。 在连接过程中,如果想让程序使用默认参数,则可以使用 含“;”格式: D:\MASM> LINK EG1;
4.程序的执行 .
当我们建立了正确的可执行文件以后,就可以直 接在DOS状态下执行该程序。 D:\MASM> EG1.EXE
说明
如果使用测试数据均可运行并能看到正确 结果,则说明该程序编写正确。但若得不 到正确结果或结果无法看到(没有结果输 出的情况下),则需要使用调试工具 DEBUG来调试程序了。
使用DEBUG进行反汇编
在DOS状态下键入以下命令: D:\MASM> DEBUG EG1.EXE 在DEBUG环境下输入 u 命令进行反汇编
使用DEBUG的D命令查看内容
实验二
DEBUG主要命令
常用命令
-? 显示 Debug 命令列表 -a 汇编器,从100H开始写程序 -r 显示所有寄存器内容 -g 执行,-g[地址断点],执行到[地址断点]结束 -e101 改101H地址处的内容 -d100 显示内存中的内容;显示机器指令 -u100 机器指令 〉汇编指令 -t 执行一条语句 -q 退出
所有ASCII码的显示
R命令---显示和修改所有寄存器内容 显 示 修 改
G命令---执行
E命令---改内容
D命令---显示内容
U命令---反汇编
U命令将十六进制的机器码反汇编成汇编 指令。每一行右边的汇编指令就被汇编成 相应的机器码。
T命令---跟踪执行
逐条执行 -T [地址] 从指定地址执行一条 未指定,则从当前CS:IP开始执行一条 多条执行
说明
如果汇编过程中有错误产生,则汇编程序将显 示出错行号和错误信息。最后显示的部分是警告 错误及严重错误数。 若汇编过程中,想让汇编程序使用默认参数, 则可以使用带有“;”的格式: D:\MASM> MASM EG1; 此方法,系统将不再提示用户输入文件名等信 息,而是直接编译生成目标文件。
常见出错信息
-T[地址][指令条数n] 从指定地址执行n条
Q命令---退出DEBUG
退出debug,返回DOS环境
作业
练习eg1的汇编程序开发过程,将生成的源程 序、目标程序、可执行程序压缩到一个文 件夹中,文件夹命名为08计应X班-XXX 练习 DEBUG环境下的 ? A R G E D U T 命令,将练习成功时出现的画面保存在 word中,命名为08计应X班-XXX
使用DEBUG的A命令汇编
例1:可以将所有ASCII码显示出来的程序
1. 2. 3.
ቤተ መጻሕፍቲ ባይዱ
4.
输入 DEBUG 输入 A100 输入 MOV CX,0100 ;装入循环次数 MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码 MOV AH,02 INT 21 INC DL ;递增指令,每次将数据寄存器 DL 内的数值加 1 LOOP 0105 ;循环指令,每执行一次LOOP,CX值减1,并跳到 ;循环的起始地址105,直到CX为0,循环停止 INT 20 输入 G即可显示所有ASCII码
1、Register already defined 汇编内部出现逻辑错误 2、Unknown symbol type 在符号语句的类型中,有些不能识别的东西 3、Symbol is multi-defined 重复定义一个符号 4、Symbol not defined 符号没有定义 5、Syntax error 语句的语法与任何可识别的语法不匹配 6、Symbol is reserved word 企图非法使用一个编程序的保留字 7、Not proper align/combine type SEGMENT参数不正确 8、One operand must be const 这是加法指令的非法使用 9、Operands must be same or 1 abs 这是减法指令的非法使用 10、Already have base register 试图重复基地址 11、Illegal size for item 引用的项的长度是非法的,(如:双字移位) 12、Illegal register value 指定的寄存器值不能放入“reg” 字段 13、Must be AX or AL 某些指令只能用AX或AL 14、Improper use of segment reg 段寄存器使用不合法(如:mov ds,0) 15、Division by 0 or overflow 给出一个用0作除数的表达式 16、value is out of range 数值大于需要使用的 17、CS register illeal usage 试图非法使用CS寄存器 18、DUP is too large for linker DUP嵌套太长,以至于从连接程序不能得到所要的记录
实验准备
将MASM软件存储在D盘的根目录下 打开“开始”菜单,在“附件”中找到 “命令提示符”,单击,进入DOS环境 输入 D: 回车,进入D盘 输入 cd masm 回车,进入masm文件夹
实验一
熟悉上机程序
1.汇编语言源程序的建立 .
程序要求 在屏幕上显示“Hello, world !”。设定 源程序的文件名为EG1.ASM。
?命令--- 显示Debug 命令列表
A命令可以汇编出简单的COM文件
1. 2. 3. 4. 5. 6. 7. 8.
输入 A100 ; 从DS:100开始汇编 输入 MOV DL,1 ; 将数值 01h 装入 DL 寄存器 输入 MOV AH,2 ; 将数值 02h 装入 DL 寄存器 输入 INT 21 ; 调用DOS 21号中断2号功能,用来逐个 显示装入DL的字符 输入 INT 20 ; 调用DOS 20号中断,终止程序,将控制 权交回给 DEBUG 请按 Enter 键 现在已将汇编语言程序放入内存中了,输入 G(运行) 出现结果:输出一个符号。
作业
编写程序,计算多项式x2 + y - 5 的值。
说明:x、y是8位带符号数
编写程序,计算多项式(x*y + y)/4 的值。
说明:x、y是8位带符号数