如何使用宏汇编程序MASM
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何使用宏汇编程序MASM.EXE和连接程序LINK.EXE
1、首先在硬盘上建立一个文件夹,例如:D:\MASM.
2、下载MASM.EXE和LINK.EXE到D:\MASM文件夹里.
3、经过以上两步,我们已经做好了准备工作,接下来书写程序。
我们的程序要求为,计算 y = a × b + c - 18,a、b、c 均为带符号的8位二进制数据,为了实验观看实验结果,我们假设 a = 34H、b = 56H、c = E7H。
程序原代码如下(分号后面内容为注释内容,可以不输入):
CC EQU 18 ;伪指令定义CC
STACK SEGMENT ;堆栈段起始
DW 256 DUP(?) ;在堆栈段中预留了256个字的内容
TOP LABEL WORD ;TOP为栈顶偏移地址
STACK ENDS ;堆栈段结束
DATA SEGMENT ;数据段起始
DAT1 DB 34H ;DAT1即为题中操作数a,为字节,存于数据段中
DAT2 DB 56H ;DAT2即为题中操作数b,为字节,存于数据段中
DAT3 DB 0E7H ;DAT3即为题中操作数c,为字节,存于数据段中
DATY DW ? ;DATY即为题中计算结果的预留空间为字,存于数据段中
DATA ENDS ;数据段结束
CODE SEGMENT ;代码段起始
ASSUME CS:CODE,DS:DATA,SS:STACK ;分配段地址对应关系
START: MOV AX,DATA ;START为标号,MOV语句完成DATA数据段地址送入AX
MOV DS,AX ;将AX内容送入DS,即赋予DS数据段DATA的段地址
MOV AX,STACK ;将STACK堆栈段地址送入AX
MOV SS,AX ;将AX内容送入SS,即赋予SS堆栈段STACK的段地址
MOV SP,OFFSET TOP ;SP设初值
MOV AL,DAT1 ;取a,直接寻址方式
MOV BL,DAT2 ;取b,直接寻址方式
IMUL BL ;AX <- AL * BL,即将a * b的值存入AX
MOV BX,AX ;将AX内容保存至BX
MOV AL,DAT3 ;取c,直接寻址方式
CBW ;由于c是8位有符号数,所以做符号扩展至AH
ADD AX,BX ;AX <- AX + BX,即完成的操作为将a*b+c结果存入AX
SUB AX,CC ;AX <- AX - 18
MOV DATY,AX ;将a*b+c-18的内容存放至数据段中偏移地址DATY的内存中
MOV AH,4CH ;将4CH存入AH,为了下句调用DOS 21号中断
INT 21H ;调用DOS 21中断,由AH=4CH决定返回DOS操作系统
CODE ENDS ;代码段结束
END START ;程序结束
在D:\MASM目录下新建文件名为“Sample.asm”(一定要注意扩展名必须为.asm或.ASM,大小写无所谓)的文件,将以上代码输入后保存。
4、这时候D:\MASM文件夹下就有3个文件了,分别为“MASM.EXE”、“LINK.EXE”和“SAMPLE.ASM”。我们将 sample.asm 文件汇编为扩展名为 .obj 的文件,如下图,首先进入DOS环境下的D:\MASM目录,然后使用 MASM SAMPLE.ASM 命令。
使用DOS的DIR命令查看当前目录下的文件,已经变为4个,多了一个sample.obj文件。
然后,使用LINK.EXE,将SAMPLE.OBJ文件链接生成可执行文件SAMPLE.EXE。
使用DOS的DIR命令,可以查看到,又多了一个名为sample.exe文件。
5、这时候,我们可以执行sample.exe,可以看到执行正常,但是没有任何输出,这是因为,我们只是改变了内存单元和寄存器的数据,并没有输出,所以,我们需要使用debug来调试程序,观察程序的执行过程,和对寄存器和内存单元的影响。
至此为止,我们的任务已经圆满完成,计算出了a*b+c-18的内容(114DH),并存入了相应的内存单元中。
PS:在Debug过程中,自己可以通过e指令修改内存单元内容,使得程序完成a、b、c不是我们预定内容(34H、56H、E7H)的求解过程。