赞
踩
汇编语言上机的4个步骤
1.点击命令提示符图标 进入DOS
C:\Documents and Settings\Administrator>CD… (两个点)按Enter键
C:\Documents and Settings> CD…(两个点) 按Enter键
C:\ cd MASM按Enter键
C:\ MASM> EDIT XXX.ASM”并按Enter键,
进入全屏幕编辑状态,输入程序,然后将编辑好的源程序保存(File下拉菜单选SAVE),或用后缀为.ASM的文件名存入U盘。重新启动计算机时文件丢失。
注意:源文件扩展名必须为.ASM。
2.利用汇编程序MASM将XXX .ASM文件转换成 XXX.OBJ文件
汇编程序MASM的作用:将源文件转换成二进制代码表示的目标文件(称为.OBJ文件),汇编结束后,汇编程序将指出源程序中的语法错误。
汇编命令格式如下。
C:\MASM>MASM XXX;(分号)
0 Warning Errors
0 severe Errors后执行下一步
3.利用连接程序LINK把XXX.OBJ程序转换成可执行程序XXX.EXE程序
.
连接命令为如下
C:\MASM>LINK XXX;(分号)
4.程序的运行
常用调试方法(1)利用DEBUG调试程序(参考附录有关DEBUG的命令)。
C:\MASM>DEBUG XXX .EXE
带显示功能的程序(2)直接输入文件名就可以执行该程序。
C:\MASM>XXX .EXE
注意:要根据程序的特点选择程序的运行方式。
出现提示符“-”,表示已进入DEBUG状态,可以使用DEBUG命令。
①用U命令查看程序是否进入内存。
-U回车
代码段 偏移量 机器码 源程序
18F4: 2000 1E PUSH DS
18F4: 2001 2BC0 SUB AX,AX
18F4: 2003 50 PUSH AX
18F4: 2004 B8F618 MOV AX,18F6H
18F4: 2007 8ED8 MOV DS,AX
……
……
18F4: xxxx xxxx RET
上面从左到右依次给出了程序所在的段地址、偏移地址、机器语言指令和汇编语言指令。系统自动给程序分配了数据段(址为18F6H,说明程序的数据都在这个18F6H段的相关内存单元内存单元。
②利用T命令执行程序,
T为单步执行命令,既每一个T执行一条指令,观察寄存器存储单元的值及各标志的变化。
③检查程序的运行结果。
利用D命令检查该内存单元是否为这个结果。
-D数据段段基址 : 偏移地址(要查看的存储单元的偏移地址)
本例中D 18F6:1000
④运行命令G(GO)
运行命令G的格式如下。
—G
其中,ADDRESS1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示所有寄存器和标志位的内容,以及下一条将要执行的指令。
(5)退出DEBUG命令Q(QUIT)
退出DEBUG命令Q的格式如下
-Q
该命令将退出DEBUG,并返回DOS。
最终显示“C:> MASM>”。
除上述命令外,DEBUG的常用命令R可以显示和修改寄存器的内容,命令E可以显示和修改内存单元的内容,命令G可以连续执行指令。
2、使用DOSBOX软件搭建汇编环境,调用masm和link程序,将源代码编译链接成可执行程序(maxmin.exe)。如图
3、运行maxmin.exe,查看程序运行情况及结果检验
在DOS环境中运行debug maxmin.exe,运用debug的u,g,d,r,t调用功能,即可查看检验程序运行状况。
首先调用反汇编指令u查看每条代码的代码段偏移地址
找到已初始化完成语句MOV AX,SEG AREA,该语句对应的偏移地址为0005,
再调用运行命令g,执行g5 ,并调用显示内存单元内容的命令D (d0)查看内存单元内容
绿框中为待处理10个无符号数100,3,654,54,898,3,125,6666,545,781对应的16进制存储单元,每4位16进制对应一个0~65535无符号数,共20个存储单元。两红框中为表示最大值和最小值的变量MAX和MIN的存储单元,预设值分别为65535和0,即16进制数FFFF和0000。
再次调用反汇编指令u查看后续代码的代码段偏移地址,找到主程序已运行完毕的语句MOV AH,4CH,该语句对应的偏移地址为0046
再调用运行命令g,执行g0046,并调用显示内存单元内容的命令D (d46)查看内存单元内容
变量MAX中为十六进制数1A0A,刚好对应十个数中最大数6666,
变量MIN中为十六进制数0003,刚好对应十个数中最小数3,运行结果正确。
实验过程原始记录及计算结果(数据、表格、计算、曲线等)
在完成求取最小值程序编写后,我尚未继续编写求取最大值程序,以便于检验最小值程序和整体框架的正确性,经运行调试后,得到正确的求取最小值程序,但之后我本打算将最小值程序稍作修改得到最大值程序,编写后进行调试发现如下错误结果
经检查发现,是我在求取最小值程序后尚未将变址寄存器SI赋值回数组AREA的首地址,使得求取最大值程序发生错误。改正方法:求取最大值程序前应重新初始化,将SI赋回数组AREA的首地址,修改程序,加上 MOV SI,OFFSET AREA命令,之后运行调试正确。
附录2 常用DOS功能调用一览表
功能号在AH中,并设好其他入口参数,向DOS发出INT 21H命令,最后获得出口参数,如表7所示。
表7
调 用 号 功 能 入口参数 出口参数
00H 程序终止 CS=PSP段地址 —
01H 键盘输入字符 — AL=输入的字符
02H 显示输出 DL=显示的字符 —
03H 串行设备输入 — AL=输入的字符
04H 串行设备输出 DL=输出的字符 —
05H 打印输出 DL=输出的字符 —
06H 直接控制台I/O DL=0FFH(输入请求);
DL=字符(输出请求) AL=输入的字符
07H 直接控制台I/O
(不显示输入) — AL=输入的字符
08H 键盘输入字符(无回显) — AL=输入的字符
09H 显示字符串 DS:DX=缓冲区首址 —
0AH 输入字符串 DS:DX=缓冲区首址 —
0BH 检查标准输入状态
—
AL=00无按键;
AL=0FFH有按键
0CH 清除输入缓冲区并执行指定的标准输入功能 AL=功能号(01/06/07/08/0AH);
DS:DX=缓冲区(0AH功能) AL=输入的数据(功能01/06/07/08)
0DH 初始化磁盘状态 — —
0EH 选择默认的驱动器 DL=驱动器号(0=A,1=B…) AL=逻辑驱动器数
0FH 打开文件 DS:DX=未打开的FCB首址 AL=00成功;
AL=0FFH失败
10H 关闭文件 DS:DX=打开的FCB首址 AL=00成功;
AL=0FFH失败
11H 查找第一匹配目录 DS:DX=未打开的FCB首址 AL=00成功;
AL=0FFH失败
12H 查找下一匹配目录 DS:DX=未打开的FCB首址 AL=00成功;
AL=0FFH失败
13H 删除文件 DS:DX=未打开的FCB首址 AL=00成功;
AL=0FFH失败
14H 顺序读 DS:DX=打开的FCB首址 AL=00成功;
AL=01文件结束;
AL=02缓冲区太小;
AL=03缓冲区不满
15H 顺序写 DS:DX=打开的FCB首址 AL=00成功;
AL=01盘满;
AL=02缓冲区太小
16H 创建文件 DS:DX=未打开的FCB首址 AL=00成功,AL=0FFH目录区满
17H 文件换名 DS:DX=被修改的FCB首址 AL=00成功,AL=0FFH未找到目录项或文件重名
*18H 保留未用 — —
19H 获取默认驱动器号 — AL=驱动器号(0=A,1=B…)
1AH 设置磁盘缓冲区DTA DS:DX=磁盘缓冲区首址 —
*1BH 获取默认驱动器的磁盘格式信息 — AL=每簇的扇区数;
CX=每扇区的字节数;
DX=数据区总簇数-1;
DS:BX=介质描述字节
*1CH 获取指定驱动器的磁盘格式信息 DL=驱动器号(0=默认,1=A…) AL=每簇的扇区数;
CX=每扇区的字节数;
DX=数据区总簇数-1;
DS:BX=介质描述字节
*1DH 保留未用 — —
*1EH 保留未用 — —
*1FH 获取默认驱动器的DPB — DS:BX=DPB首址
*20H 保留未用 — —
21H 随机读一个记录 DS:DX=打开的FCB首址 AL=00成功;
AL=01文件结束;
AL=02缓冲区太小;
AL=03缓冲区不满
22H 随机写一个记录 DS:DX=打开的FCB首址 AL=00成功;
AL=01盘满;
AL=02缓冲区太小
23H 获取文件大小 DS:DX=未打开的FCB首址 AL=00成功;
AL=0FFH失败
24H 设置随机记录号 DS:DX=打开的FCB首址 —
25H 设置中断向量 AL=中断号
DS:DX=中断程序入口 —
*26H 创建新的PSP DS:DX=新的PSP段地址 —
27H 随机读若干记录 DS:DX=打开的FCB首址
CX=要读入的记录数 AL=00成功, AL=01文件结束,AL=02缓冲区太小,AL=03缓冲区不满;
CX=读入的块数
28H 随机写若干记录 DS:DX=打开的FCB首址
CX=要写入的记录数 AL=00成功, AL=01盘满,AL=02缓冲区太小,AL=03缓冲区不满;
CX=已写的块数
29H 分析文件名 AL=分析控制标记
DS:SI=要分析的字符串
ES:DI=未打开的FCB首址 AL=00未通配符,AL=01有通配符,AL=0FFH驱动器字母无效;
ES:DI=未打开的FCB
2AH 获取系统日期
— CX=年(1980~2099),DH=月,DL=日,AL=星期(0=星期日)
2BH 设置系统日期 CX=年,DH=月,DL=日 AL=00成功, AL=0FFH失败
2CH 获取系统时间 — CH=时(0~23),CL=分,DH=秒,DL=百分之几秒
2DH 设置系统时间 CX=时,分DX=秒,百分秒 AL=00成功,AL=0FFH失败
2EH 设置/复位校验开关 AL=0关闭,1打开 —
2FH 获取磁盘传输地址DTA — ES:BX=DTA首地址
30H 获取DOS版本 — AL,AH=DOS的主、次版本
31H 结束并驻留 AL=返回码,DX=内存大小 —
*32H 获取指定驱动器的DPB — DS:BX=DPB首址
33H 获取或设置Ctrl+Break标志 AL=0:取,1:置,DL=标志 DL=标志(取功能)
0:关
1:开
*34H 获取DOS中断标志 — ES:BX=DOS中断标志
35H 获取中断向量地址 AL=中断号 ES:BX=中断程序入口
36H 获取磁盘的自由空间 DL=驱动器号(0=缺省,1=A AX=FF驱动器无效,其他每簇扇区数
BX=自由簇数;
CX=每扇区字节数;
BX=文件区所占簇数
*37H 获取/设置参数分隔符;
获取/设置设备名许可标记 AL=0:取分隔符,
1:置分隔符,DL=分隔符
2:取许可标记
3:置许可标记,DL=许可标记 DL=分隔符(功能0);
DL=许可标记(功能2)
38H 获取国家信息 AL=0,DS:DX=缓冲区首址 —
39H 创建子目录 DS:DX=路径字符串 CF=0成功, CF=1失败;AX=错误码
3AH 删除子目录 DS:DX=路径字符串 CF=0成功, CF=1失败;AX=错误码
3BH 设置子目录 DS:DX=路径字符串 CF=0成功, CF=1失败;AX=错误码
3CH 创建文件 DS:DX=带路径的文件名
CX=属性1(只读),CX=属性2(隐蔽),CX=属性4(系统) CF=0成功,AX=文件号;
CF=1失败,AX=错误码
3DH 打开文件 DS:DX=带路径的文件名;
AL=方式0(读);
AL=方式1(写);
AL=方式2(读写) CF=0成功,AX=文件号;
CF=1失败,AX=错误码
3EH 关闭文件 BX=文件号 CF=0成功;
CF=1失败,AX=错误码
3FH 读文件或设备 BX=文件号;
CX=字节数 CF=0成功;
DX:AX=新的指针位置
40H 写文件或设备 DS:DX=缓冲区首址 CF=1失败,AX=错误码
41H 删除文件 DS:DX=带路径的文件名 CF=0成功, CF=1失败,
AX=错误码
42H 移动文件指针 AL=方式0(正向);
AL=方式1(相对);
AL=方式2(反向);
BX=文件号;
CX:DX=移动的位移量 CF=0成功,DX:AX=新的文件指针;
CF=1失败,AX=错误码
43H 获取/设置文件属性 AL=0(获取);
AL=1(设置);
CX=新属性;
DS:DX=带路径的文件名 CX=属性(功能0)
1-只读
2-隐蔽4-系统20H-归档
44H 设备输入/输出控制:获取/设置与打开设备的句柄相关联的信息,或
发送/接收控制字符串至设备句柄 AL=0/1(获取/设置设备信息);
AL=2/3(读/写设备控制通道);
AL=4/5(同功能2/3);
AL=6/7(取输入/输出状态);
BX=句柄(功能03,67);
BL=驱动器号(功能4~5);
CX=字节数(功能2~5);
DS:DX=缓冲区(功能2~5) CF=0成功;
DX=设备信息(功能0);
AL=状态(功能6/7),0表示未准备,1表示准备;
AX=传送的字节数(功能2-5)
45H 复制文件号(对于打开的文件返回一个文件号) BX=文件号 CF=0成功,AX=新文件号;
CF=1失败,AX=错误码
46H 强行复制文件号 BX=现存的文件号;
CX=第2文件号 CF=0成功,CF=1失败;
AX=错误码
47H 获取当前目录 DL=驱动器号;
DS:SI=缓冲区首址 CF=0成功, CF=1失败;
AX=错误码
48H 分配内存 BX=所需的内存节数 CF=0成功,AX=分配的段数;
CF=1失败,AX=错误码;
BX=最大可用块大小
49H 释放内存 ES=释放块的段值 CF=1失败,AX=错误码
4AH 修改分配内存 ES=修改块的段值;
BX=新长度(以节为单位) CF=1失败;AX=错误码;
BX=最大可用块大小
4BH 装载程序;运行程序 AL=0装载并运行;
AL=1获得执行信息;
AL=3装载但不运行;
DS:DX=带路径的文件名;
ES:BX=装载用的参数块 CF=1失败;AX=错误码
4CH 带返回码的结束 AL=进程返回码 —
4DH 获取由31H/4CH返回的返回码
— AL=进程返回码;
AH= 0表示正常结束,AH= 1表示由Ctrl+Break结束,AH= 2表示由严重设备错误而结束,AH= 3表示由调用31H而结束
4EH 查找第一个匹配项 DS:DX=带路径的文件名;
CX=属性 CF=1失败;AX=错误码
4FH 查找下一个匹配项 CF=1失败,AX=错误码
*50H 建立当前的PSP段地址 BX=PSP段地址 —
*51H 读当前的PSP段地址 — BX=PSP段地址
*52H 获取DOS系统数据区首址 — ES:BX=DOS数据区首址
*53H 为块设备建立DPB DS:SI=BPB,ES:DI=DPB —
54H 获取校验开关设定值 — AL=标志值(0:关,1:开)
*55H 由当前PSP建立新PSP DX=PSP段地址 —
56H 文件换名 DS:DX=带路径的旧文件名
ES:DI=带路径的新文件名 CF=1失败,AX=错误码
57H 获取/置文件时间及日期
AL=0/1取/置,BX=文件号
CX=时间,DX=日期 CF=0成功,CX=时间,DX=
日期
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。