汇编语言计算机流程 1. 用汇编语言编写的源程序必须经过以下步骤才能使其运行: 1. 使用编辑程序创建扩展名。 ASM 汇编语言源程序文件。 2. 调整汇编器(MASM),对源程序进行汇编,生成扩展名为 . 对象。 3. 链接(LINK)目标文件,生成扩展名为 . EXE文件。 4. 运行可执行文件。 5、如果程序运行出现错误,可以调用DEBUG程序。 用于调试的 EXE 文件。 2. 编辑汇编语言源程序。 可以使用各种编辑软件来创建汇编语言源程序,例如记事本。 首先另存为。 TXT 文件,然后将其更改为 . ASM文件,方法是去掉界面中的“隐藏已知文件扩展名的扩展名”选项:工具-文件夹选项-查看-然后添加扩展名。 TXT直接改成.txt ASM,汇编文件的名称由用户自定义(只能使用英文字母、数字和下划线)。 3. 编译汇编语言源程序。 使用MASM程序对源程序进行汇编,生成浮动目标程序(即扩展名为.OBJ的文件)。 这里生成的是一个浮动目标模块,它是一个不可执行的程序。 “开始”菜单->运行->输入“cmd”->确定打开DOS命令行窗口。 汇编前,在DOS状态下使用以下命令打开源程序。 例如,打开z1.asm 的方法为: >输入z1.asm <CR>,则屏幕上将显示z1.asm 的源程序。
z1.asm 文件编译过程的屏幕操作和显示如下: >masm z1.asm<CR>屏幕显示以下几行(一次一行),提示用户应输入的信息输入:[Z1。 OBJ]<CR>[NUL。 LST]:<CR>交叉[NUL。 CRF]: <CR> 生成目标文件(.OBJ)是汇编的主要目的。 通常用户可以直接按 Enter 键使用默认文件名。 (.LST) 文件是提供所有编译信息的列表文件。 如果用户不需要这些信息,可以直接按 Enter 键。 (.CRF) 文件是交叉引用文件。 要创建交叉引用文件,请输入文件名。 MASM 将为用户创建一个扩展名为 (.CRF) 的交叉引用文件。 这里获得的交叉引用文件必须通过调用CREF程序进行处理,以创建可以显示或打印的字母顺序源程序。 符号表(包括变量)。 使用它,用户可以快速找到符号的相对地址和类型,这对于调试较大的程序非常有用。 因此,CREF.EXE 文件也应该复制到用户的磁盘上。 如果用户不需要这些信息,可以直接按 Enter 键。 至此,组装过程已经完成。
MASM在汇编源程序时,如果发现源程序中有语法错误,会列出错误语句、错误代码和错误类型,最后列出错误总数。 此时,可以分析错误并调用编辑程序来纠正错误,直到装配无错误为止。 4.链接汇编器LINK. EXE 文件用于将 (.OBJ) 文件连接成扩展名为 (.EXE) 的可执行文件。 连接过程如下:在DOS下,输入>LINK z1 <CR>,先显示版本号,然后相应询问如下问题: RUN FILE [Z1. EXE]:<CR>列表文件[NUL。 地图]:<CR>[。 LIB]: <CR> 第一个提示询问要生成的可执行文件 (.EXE) 的文件名。 一般情况下,按 Enter 键表示默认括号中指定的文件名。 第二个提示询问是否创建内存分配映射文件(.MAP)。 按回车即可表示不创建。 最后询问是否使用库文件(.LIB)。 如果没有,只需按 Enter 键。 然后连接程序开始连接。 如果连接过程中出现错误,则会显示错误消息。 如果有错误,修改源文件,重新组装并连接,直到没有错误为止。 如果用户程序直接使用系统堆栈,请忽略“NO STACK”警告。
5、汇编语言程序的运行 汇编、连接后生成汇编语言源程序。 EXE文件在DOS下直接输入文件名即可运行。 例如:> z1 <CR>。 然后z1。 EXE文件被加载到内存中并从程序的起始地址运行。 如果程序正确,执行后控制权将正常返回到DOS操作系统。 如果运行结果在存储单元中,或者发现程序运行错误,或者想跟踪程序的执行情况,则需要使用DEBUG程序。 6、汇编程序调试 DEBUG 是专门为汇编语言设计的调试程序。 它通过单步、设置断点等方式为汇编语言程序调试提供了一种非常有效的调试方法。在DOS提示符下键入命令:2>DEBUG z1.exe <CR>DOS。 将DEBUG.COM加载到内存后,调试好的z1程序也加载到内存中。 加载到内存中的地址从偏移0开始,加载后显示DEBUG提示符“—”。 在提示符“-”下可以执行DEBUG的各种命令。 7、常用的DEBUG命令介绍如下。 1、命令D格式1显示内存单元的内容:D<CR>表示从代码段cs:0000H开始的80H单元的内存。 格式2:D ds:[地址]<CR>表示从数据段指定地址开始的80H单元的存储器。
格式3:D [起始地址最后地址]<CR> 该命令显示指定范围内的内存。 例如,以下是 D 命令显示的行之一。 显示描述为:0B2E:0200 E8 DA E1 46 E8 AC DF 74-0D E8 45 00 AC E8 41 00 ...F...t..E...A。 左边的“0B2E:0200”是第一个存储单元的逻辑地址,对应的内容是“E8”,后面是后续存储单元的内容(十六进制形式),共16个数据。 中间的破折号“-”用于分隔第8个和第9个数据,以便于定位(位于16个数据的中间)。 右侧为存储单元内容的显示形式。 也就是说,如果是某个可以显示的字符对应的ASCII码(比如第四个数据是46),那么就会显示该字符(即字符“F”)。 如果没有,则可以将显示的字符显示为点“..” 标志寄存器中各个符号的含义如下: 1. 溢出 OV(,OF=1),无溢出 NV(无,OF=0) 2. 递减 DN(向下,DF=1),递增 UP(向上, DF = 0) 3. 使能中断 EI (, IF = 1), 禁止中断 DI (, IF = 0) 4. 负数 NG (, SF = 1), 正数 PL ( 加, SF = 0) 5.零 ZR(零,ZF = 1),非零 NZ(无零,ZF = 0) 6. 辅助进位 AC(进位,AF = 1),无辅助进位 NA(无进位,AF = 0) 7. 偶数奇偶校验 PE(偶,PF=1),奇校验 PO(奇,PF=0) 8. 进位 CY(进位,CF=1),无进位 NC(无进位,CF=0) 2. 修改内容存储单元命令E 格式1:E [地址] [内容] <CR> 3 将原存储单元的内容替换为命令给出的内容。
例如:E DS: 100 AA BB CC DD <CR>就是依次向 DS:100H 开始的 4 个单元发送 0AAH、0BBH、0CCH、0DDH。 格式 ⒉ E [地址]<CR>表示逐个修改内存单元的内容。 例如:E CS:108<CR> 只显示CS段108H内存的内容,等待修改。 修改后按空格键显示下一个单元的内容。 使用空格键修改连续单元格的内容,然后按 Enter 键结束命令。 3. 查看寄存器内容的命令R 格式: R<CR> 显示CPU 内部所有寄存器的内容和标志状态。 格式2:R[寄存器名称]检查指定寄存器的内容。 例如输入 R IP < CR > IP 0356:显示的 IP 内容为 0356 4. 运行命令 G 格式 1:G <CR > 从当前 CS:IP 开始,一直持续到 INT 3 指令。 跳出调试。 格式 2:G=0000 <CR> 从 0000 开始执行程序。 5、跟踪命令(单步运行) T 格式 1:T [=地址] <CR> 单次跟踪命令,即执行过程中逐一跟踪,从指定地址开始执行一条指令然后停止,显示所有寄存器值的内容和标志位,最后显示要执行的指令。
如果未指定地址,将从当前 CS:IP 开始执行。 格式2:T[=地址][N]<CR>多条跟踪,从指定地址开始执行N条指令,然后停止。 例如:T=0003 3<CR>表示从指定地址0003开始执行3条指令,然后停止。 6. 步进跟踪指令P4 与T 指令类似。 该命令可以执行循环、重复字符串、软件中断或程序调用。 即遇到CALL或INT等指令时,不会进入相应的子程序。 逐项落实。 7、反汇编命令U 如果某个程序的目标代码已经存在于内存的某个区域,为了了解这个程序的内存情况,可以使用U命令进行反汇编。 格式l:U<CR>从cs:0000H反汇编出32字节机器码。 然后继续按U键,显示下一个32字节机器码。 等等。 格式2:U[起始地址]<CR>从指定地址开始,反汇编32个字节。 然后继续按U键,显示下一个32字节机器码。 等等。 格式3:U[起始地址][结束地址]反汇编指定范围内的存储单元。 8、退出DEBUG,返回DOSQ<CR>DEBUG命令,还有其他命令,读者可以参考相关资料。
八、常见错误信息 1. 汇编内部发生逻辑错误 2. 符号语句的类型中有一些无法识别的东西 3. is 多次重复定义了一个符号 4. not 符号未定义 5. 语法错误语句与任何可识别的语法不匹配不同 6. is word 使用了汇编器的保留字(例如:将 add 定义为变量) 7. /type 参数不正确 8. 必须是 const 这是非法的使用加法指令 9. 必须相同或 1 个绝对值 这是减法指令的非法使用 10. 有基址尝试重复基地址 11. 由 item 的 size 引用的项的长度是非法的,(例如:双字移位) 12. value 指定寄存器值 不能放入“reg”字段 13. 必须是 AX 或 AL 某些指令只能使用 AX 或 AL14。 使用 reg 段寄存器是非法的(例如:mov ds,0) 15. 用 0 或给出除数 0 表达式 16. 值超出范围。 该值大于需要使用的值。 17.CS的使用。 试图非法使用 CS 寄存器。 18. DUP 对于 DUP 来说太大。 嵌套太长,导致无法从连接程序中获取所需的记录。 5 实验一:熟悉汇编流程和环境,调试第一个程序Hello ASM,学习使用masm,链接和调试实验二:调试示例3.1,并使用debug查看结果; 修改例3.1,求这十个数的和,并放在DATA3处查看结果。
示例 3.1 DATAS DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H DATAS ENDS CODES CS:CODES,DS:DATAS START:MOV AX,DA DS,AXMOV CX, 5MOV SI, 0CLC :MOV AL, DA TA2[SI]ADC DA TA1[SI], ALINC SIDEC CXJNZ AH, 21H CODES START 修改程序求和: DATAS DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H DATA3 DB 00H,00H 数据结束代码 CS:CODES,DS:DATAS 开始:MOV AX,DA DS,AXMOV CX, 10MOV SI, 06CLC:MOV AL, DA TA1[SI]ADD DA TA3, ALJNC DA TA3[ 1] 下一个:INC SIDEC CXJNZ AH,21H 代码