文档详情

汇编语言源程序的运行过程

lis****211
实名认证
店铺
DOCX
41.89KB
约12页
文档ID:176405692
汇编语言源程序的运行过程_第1页
1/12

汇编语言源程序的运行过程一、概述无语法错误的汇编语言源程序NAME ・ASM (以ASCI I码形式存盘)在 DOS 管理下键入汇编语言• 源程序编辑程序EDLIN.EXE ,编辑过程~~,汇编程序MASM・EXE . 目标(机器码)文件汇编过程 NAME・OBJI连接程序LINK・EXE片 可执行文件连接过程 name・EXE调试程序DEBUG 'EXE 无逻辑错误的可执行文调试过程 件 NAME・ EXE二、具体操作过程1.编辑过程在计算机“附件”的“记事本”中,用word编辑汇编语言源程序,比用编辑程序EDLIN 要方便得多因为使用后者,必须熟记它的各种命令及其功能使用前者的操作步骤如下:第一步:编辑并建立扩展名为ams的文件开始一程序一附件一记事本一键入汇编语言源程序(也可用Ctrl+C及Ctrl+V拷贝已 有程序)f文件f另存为f出现“另存为”窗口f在‘文件名:'处为该文件命名,并切 记:将扩展名由・txt改为.asmf在“另存为”窗口里的“我的电脑”中找到含有MASM.EXE、 LINK.EXE以及DEBUG.EXE这三个工具的文件夹(如,8086experi),并双击之f该文件 夹名便出现在“保存在:”处f保存(至此,该文件夹中将出现你所编辑的扩展名为asm 的汇编语言源程序。

此时的源程序以ASCII码形式存盘,而非机器码)f关闭记事本注意:上述三个工具及用户程序必须在同一文件夹中此后,为显示,打印或修改该程序,双击该程序的图标即可第二步:在DOS下运行EDLIN,以便查找并排除源程序中可能存在的语法错误window状态f开始f运行f打开:cmd/f确定f出现DOS提示符:C:\ >—指定存有你的程序的文件夹所在盘(如D盘)为当前盘D: /fD:\>cd文件夹名/fD:\文件夹名>edlin文件名.asm /End of input file* L/此处为选择性操作显示 24 条指令* 25L/显示从第25 条指令开始的另24 条指令* E/按结束编辑命令E之前,生成了一个扩展名为$$$的文件;结束编辑状态之后,该文 件的扩展名由$$$变为BAK特别指出:即使不用EDLIN进行编辑,也必须进行此步否则,若源程序中存在语 法错误,下一步进行汇编后,不予提示,也不生成机器码文件,无法进行再下一步的连接, 致使程序无法运行除非源程序中无任何语法错误2.汇编过程D:\文件夹名〉masm文件名;/汇编程序负责将源程序文件(扩展名为.ASM)翻译为二进制的机器码文件(扩展名 为.OBJ)。

在汇编过程中,计算机对源程序文件要进行语法检查,若有错误,在汇编结束后,屏 幕上将出现错误信息提示,这时需要返回到编辑过程,对有语法错误的语句进行修改,修 改后的源程序需要重新汇编,直到汇编结束时无语法错误为止注意:汇编过程不能发现 程序中的逻辑错误汇编结束时,生成扩展名为OBJ的文件(即CPU可识别的目标(object)文件,又称 机器码文件)若在编辑阶段中留有任何语法错误未改,则不能生成OBJ文件,从而无法 往下进行3.连结过程D:\文件夹名〉Link文件名;/我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的 基本工作机理,达到可以随心所欲地控制计算机的目的基于这种考虑,我们的编程活动, 大都是直接对硬件进行的我们希望直接对硬件编程,却并不希望用机器码编程我们用 汇编语言编程,就要用到:编辑器(Edit)、编译器(Masm)、连接器(Link)、调试工具 (Debug)等工具,而这些工具都是在操作系统控制下运行的程序,所以我们的学习过程 必须在操作系统的环境中进行而操作系统,使用了许多工具,这势必要牵扯到操作系统、 编译原理等方面的知识和原理我们只是利用这些环境、工具来方便我们的学习,而不希 望这些东西分散了我们的注意力。

所以,对于涉及到而又不在本课程学习内容之中的东西, 只做简单的解释连接的作用有以下几个:•当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;• 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文 件连接到一起,生成一个可执行文件;• 一个源程序编译后,得到机器码的目标文件,目标文件中的有些内容还不能直接 用来生成可执行文件,需通过连接程序将这些内容处理为最终的可执行信息 所 以,既便只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也 必须用连接程序对目标文件进行处理,生成可执行文件注意,对于连接过程,可执行的目标文件是我们要得到的最终结果LINK把汇编产生的目标程序(扩展名为.OBJ)转换为一个可执行文件(扩展名 为.EXE)如果LINK运行结束时给出错误标志,这时仍需返回到编辑过程,修改源程序后重新 汇编、连接,直到LINK运行结束时,不显示错误标志为止连接后,若显示:“Warning: no stack segments” 可不予理采4.调试过程D:\文件夹名〉debug文件名.exe/出现调试状态提示符‘—',表示已进入调试阶段。

这时已存盘的代码段的机器码及其数据段的数据便由硬盘调入了内存,供调试用,但 程序尚未执行CS已自动赋值,但DS和SS、ES (如果用到的话)尚未赋值(这三个段 寄存器是通过程序的运行对其赋值的)三、DEBUG调试程序的使用DEBUG调试程序的功能十分强大,在DEBUG的控制下,操作人员可以通过命令直 接输入汇编源程序,并用相应命令将其汇编成机器语言程序;然后调试并运行该程序,这 样免去使用 MASM 和 LINK 程序的麻烦,因而调试周期短,除此之外,更重要的是,使 用DEBUG,它能使程序设计人员触及到机器的内部,能观察并修改寄存器和存储单元的 内容,能监视目标程序的执行情况,便于操作人员调试程序然而由于在DEBUG控制下,只宜编写较小的程序,编写较大程序很不方便,不便于 程序的分块设计,它不具备编写大程序所需的编辑功能因而,人们通常使用DEBUG来 调试程序,而很少用DEBUG来编写较大程序1使用DEBUG调试程序的条件在你所使用的硬盘或软盘上,必须有DEBUG.EXE这个文件2 ■进入与退出DEBUG在进入DEBUG后,出现提示符“一”此时CPU各寄存器内容处于初始状态(注意: 此时程序尚未执行):CS:保存程序开始运行段的段基值。

IP:保存第一条要执行的指令的偏移量SS:保存程序段定义语句中组合类型指定作堆栈段的段基值SP:保存堆栈底部+1单元的偏移量DS、ES:保存程序段前缀的(PSP)的段基值标志寄存器:各标志位均为‘0'(复位)状态如需退出DEBUG,返回DOS操作系统,可使用:—Q3.程序连续运行的命令(1) 在DEBUG下运行时:—G=CS:0 (不返回 DOS,显示“Program terminated normally” 不保留运行结果)—G=CS:0,指令INT 21H所在地址(不返回DOS,保留运行结果)(2) 在 DOS 下运行时:D:\文件夹名〉不带扩展名的文件名(返回DOS)注意:一旦返回DOS,代码段、数据段以及寄存器内容均消失4■反汇编命令U已装入内存的可执行目标文件,可以用反汇编U命令将其转换成相应的源程序从而 可以找出各段寄存器之值,以供调试用u .CS u 9?33:OOO° B8300B 0B33:0003 8ED8 0B33:0005 B8310B 0B3 3:0008 8EDG 0B33:000A BC1C00 OB33:OOOD E8O5OO' 0B33:0010B8004C 0B33:0013 CD21 OB33:OO35 5O 0B33:0016 53 0B33:0()17 51 0B33:001S56 0B33:0019 57 0B33:001A9C OB33:001BBEOOOO 0B33:00lE BF0400MOV AX,OB30 今 DJMOV DSAXMOV AX,0B31 今&MOV SS,AXMOV . SR001CCALL 0015MOV AXt4C00INT 21PUSH AXPUSH BXPUSH CXPUSH SIPUSH DIPUSHFMOV SI,0000MOV 01,0004由第一条指令可知:CS=0B33从第一、二条指令可看出: DS=0B30第三、四条指令表明: SS=0B31每个反汇编命令U只能对33个字节进行反汇编。

如有必要,可从断点处(此例的断 点是0B33: 0021)继续进行反汇编,为此只需键入命令U即可u0b33:00210B33:0021 BB08000B33:0024 8BOEOCOO0B33:0028 F8OB33:0029 8B040B33;002B 13050B33:002D 460B33:002E46OB33:002F47OB33:0030 470B33:0031 8907OB33:0033 430B33:0034 430B33:0035 E2F20B33:0037 9DOB33:0038 5F0B33:0039 5E0B33:003A590B33:O03B 5BOB33:003C 580B33:003DC3OB33:003E 308OCFO2欲从某存贮单元开始进行反汇编的命令如下—U 该单元的段基址:偏移量例如:MOV BK0008MOV CX,[OOOC]CLCMOV AX,[SI]ADC AX,[DI]INC SIINC SIINC DIINC DIMOV [BX];AXINC BXINC BXLOOP 0029POPFPOP DIPOP SIPOP CXPOP BXPOP AXRETXOR [BX+SimCFJ^AL5.显示命令 D 或 R(1)显示内存单元内容 D命令命令格式:D[地址]或 D[范围]其中,D是命令字母,[地址]或[范围]都是为了指定要显示的存储单元的范围。

例如:为显示代码段的内容:—DCS:O ;可显示由CS:O存贮单元开始的128个存贮单元的内容为显示数据段的内容:—DDS:0—DDS:100—D100 —DDS:100,110110H)可显示由DS:0开始的128个存贮存单元的内容从DS:100H开始显示80H个字节单元内容用上次使用的段寄存器显示80H个字节单元内容从DS:100H开始显示11H个字节单元内容(显示范围为100H到显示示例如下:—dds:0OAD4{0000 CD 20 00 9F OO SA FO FE0AD4:O010 CA 07 56 01 07 07 GA 07 OAD4 ;0020 FF FF FF FF FF FF FF FF0AD4:OO3O CA 07 14 00 18 00 D4 0A0AD4:0040 06 00 00 00 00 00 00 000AD4 :0050 CD 21 CB 00 00 00 00 00OAD4;0060 20 20 20 00 00 00 00 000AD4:0070 20 20 20 20 20 20 20 20-ID FO 42 02 CA 07 70 02.PB J-P.-01 01 01 00 02 FF FF FF J.V-J -FF FF FF FF CC 0A C6 2A L.F»-FF FF FF FF 00 00 00 00 JT -00 00 00 00 00 00 00 00 -00 00 00 00 00 20 20 20 MIK -00 00 00 00 00 20 20 20 •…“-00 00 00 00 44 4F 47 00 -DOG.在屏幕上显示内容分为3部分,左边是每一行存储单元的起始地址(段基址:偏移量), 中间是各字节单元两位十六进制数内容显示,右边是把中间各字节单元用相应的ASCII码 字符显示。

2)显示寄存器内容——R命令例如:_RAX=0064 BX=0000 CX=0200 DX^OOOO SP«0100 BP=OOQO SI«0000 DI«0000DS=10B4 ES*10B4 SS=10C4 CS^IODA IP=0000 NV UP DI PL NZ NA PO NC10PA: 000C \B8D410 MOV AX, 10D4前两行显示的是上一条指令执行后所有CPU内部寄存器的内容和全部标志位的状态, 各标志位的复位(‘0'状态)和置位(‘1'状态)是用字符表示的,如下表所示状态标老显示形式标志位 ’状态显示形式溢出标志OF有/无OV/NV方向标志DF减/增DN/UP中断标志IF开/关EI/DI符号标志SF负/正NG/PL零标志ZF零/非ZR//7Z辅助进位AF有/无AC/NA奇偶标志PF偶/奇PE/PO进位标志CF有/无CY/NC(无单步标志 TF)显示的第三行是表示现在CS: IP指向的一条指令,也即是下一条即将执行的指令6.修改命令E(1)修改内存单元内容——E命令此命令用于修改存储单元的内容,它有两种基本格式:(1) 用命令中给定的内容表去代替指定范围的内存单元的内容:命令格式: E 地址 内容表例如: E ds: 200 BF “RST” 7F则内容单元ds: 200到ds: 204这5个存储单元的内容,由表中指定的5个字节的内容 所代替,在以DS: 0200为起始单元的连续五个字节单元中依次分别存放数据BFH,字符 'R'、'S'、'C'的 ASCII 码和数据 7FH。

ii) 一个单元一个单元地连续修改方式命令格式: E 地址 在输入了上述命令后,屏幕上显示指定单元的地址和原有的内容之后,键入新内容, 为连续修改后续存贮单元的内容,可以采取下述操作;键入空格键,屏幕上显示下一个高字节单元的内容,并等待输入新的数据,如再键入 空格键,则又显示更高一个字节内容, ,依次由低地址向高地址逐个字节单元进行修 改,当修改完毕,按回车键,结束E命令2) 修改寄存器内容——R命令命令格式: R 寄存器名例如为了检查和修改寄存器AX的内容,可打入以下命令:—R AX则系统可能出现如下响应:AX 2F34此时,若原内容不需修改,可直接键入回车键;若需要改变其内容,可输入 1—4 个 16 进制字符制,再按回车键就实现了修改例:—R AXAX 2F34;AX 原有内容: 79FE;修改AX的内容(3)修改标志位状态 命令的格式为:RF屏幕显示:OV DN EI NG ZR AC PE CY— 可采取下述操作: 若不需要修改任一个已设置的标志状态,可直接按回车键 若有一个或多个标志需要修改,则可输入此标志的相反的值输入的标志的次序是无 关的,输入的各标志位之间,可以没有空格,按回车键结束修改。

各显示字符所代表的标志位的状态,见表13.17.汇编命令A对那些不含伪指令、变量、转移指令和地址标号等简单程序,可在debug下直接用A 命令输入源程序欲退出汇编命令A,可按回车键然后直接用单步执行命令T执行之 而不必在DOS控制下经编辑一汇编一连接之后再作运行这样,便可免去使用EDLIN时 所必需熟练掌握并记住的文本编辑的各种命令例:D:\>debug■a0ADE:0100 mov ax,a2bc0ADE:0103 mov bx,e4I60ADE:0106 addbx,ax r .0ADE:01O8如果所输入的指令无语法错误,则回车后自动给出下一条指令的地址 为显示程序执行前各寄存器的内容,可用命令R*rAX-0000 BX=0000 CX^OOOO DX-0000 SP*FFEE BM000 SI=0000 DI=0000 DS^OADE ES=OADE SS^OADE CS^OADE IP=0100 NV UP El PL NZ NA PO NC OADE:O1OO B8BCA2 MOV AXfA2BC连续三次使用单步命令,可看出对AX, BX赋值,将其和存于BX以及对 各标志位的影响:AX-A2BC BX=()000 CX-0000 DX=O(M)O SP^FFEE BPMKMK) SM)000 DIM1000DSM1ADE ES-OADE SS-OADE CS-OADE II- .403 NV UP El PLNZNA PO NC 0ADE:0IO3 BB16E4 MOV BX,E4K>AX-A2BC BX-E416 CX-0000 DX-0000 SP^FFEE BP-0000 Sl^OOOO DI=0000DS=OADE ES-OADE SS吨ADE CSFADE IP=0106 NV UP El PL NZ NA PO NC ()ADE:01()6 01C3 ADD BX,AXAX-A2BC BX-86D2 CX^OOOO DX-0000 SP=FFEE BP-0000 SI=0000 DI=0000 DSM)ADE ESTADE SSTADE CS=OADE IP-0108 NV UP El NGNZAC PE CY8•在DEBUG下程序运行命令G或TDEBUG 有两种程序运行方式。

1)连续运行方式 G命令 一g=CS: 0命令格式:G[=起始地址],[断点地址]其中, [=起始地址]用于指定程序执行的起始地址:这个地址必定是以 CS 为段基址, 以冒号后给出的地址作为偏移量输入时“=”号是必不可缺的,以区别于后面的断点地 址当程序从给出的起始地址连接运行到预置的断点地址时,便自动停止,并显示各寄存 器的内容以及下一条将要执行的指令于是,便可利用DEBUG的各种命令来观察断点指 令之前运行的结果是否正确,也可进行必要的修改若命令G后,不键入起始及断点地址而直接回车,则从当前的CS: IP连续运行至程 序结束2)跟踪运行方式 T命令命令格式:T[=地址]其中,匸地址]为程序的运行起始地址,如命令中未指定,就以CS和IP现有内容为 起始地址,每执行一次T命令,则执行一条指令,屏幕上自动显示CPU各寄存器和标志 寄存器的内容,继续打入T命令,则继续执行下一条指令例:假设文件已装入内存,在DEBUG状态下UCS:O0AE7:0D00B8E40AMOVAX,0AE4OAE7:00038ED8MOVDS, AX0AE7:00058EC0MOVES,AX0AE7:0007B8E90AMOVAX.0AE9OAE7:OOOA8ED0MOVSS,AX0AE7:000CB86400MOVAX, 0064OAE7:OOOF8BE0MOVSP,AX0AE7:0011BAOOOOMOVDX.00000AE7:O014B409MOVAH, 090AE7;OO16CD21INT21OAE7;0018B44CMOVAH,4COAE7:001ACD21INT210AE7;O01C0000ADDCBX+SD,AL0AE7:001E0000ADD〔BX+SI〕,ALBP=0000 SI=0000 DI=0000NV UP DI PL NZ NAPONCBP=0000 SI=0000 DI=0000NV UP DI PL NZ NA PO NCBP=0000 SI=0000 DI=0000NV UP DI PL NZ NA PO NCBP=0000 SI=0000 DI=0000NV UP DI PL NZ NA PO NC_RAX=0000 BX=0000 CX=0080 DX=0000 SP=OO64 BP=0000 SI=0000 DI=0000NV UP DI PL NZ NAPONCDS=0AE7 ES=0AD4 SS=0AE9 CS=0AE7 IP=0000OAE7:0000 B8E4OA MOV AX,OAE4-tAX=0AE4 BX=0000 CX=0080 DX=0000 SP=0064DS=0AD4 ES=0AD4 SS=0AE9 CS=0AE7 IP=0003OAE7:0003 E8D8 MOV DS,AX—tAX=0AE4 BX=0000 CX=0080 DX=0000 SP=0064DS=0AE4 ES=0AD4 SS=0AE9 CS=0AE7 IP=0005OAE7;OOO5 8EC0 MOV ES,AX—tAX=0AE4 BX=0000 CX=0080 DX=0000 SP=0064DS=0AE4 ES=0AE4 SS=0AE9 CS=0AE7 IP=00070AE7:0007 B8E90A MOV AX.0AE9AX=0AE9 BX=0000 CX=0080 DX=0000 SP=0064DS=0AE4 ES=0AE4 SS=0AE9 CS=0AE7 IP = 000A0AE7s00QA 8ED0 MOV SS.AXAX=0064 BX-0000 CX=0080 DX^OOOO SP-0064 BP-0000 SI=0000 5=0000DS=0AE4 ES=0AE4 SS-0AE9 CS=0AE7 IP-OOOF NV UP DI PL NZ NA PO NC0AE7:000F 8BE0 MOV SP,AXAX=OO64 BX-0000 CXT080 DX=0000 SP=0064 BP500 SI=0000 DIFQ00DS=0AE4 ES=0AE4 SS=0AE9 CS=0AE7 IP^OOll NV UP DI PL NZ NA PO NC0AE7;0011 BAOOOO MOV DX,0000二=0064 BX=0000 CX=0080 DX=0000 SP=0064 BP=0000 SI=0000 DI=OOOQDS=0AE4 ES=0AE4 SS=0AE9 CS=0AE7 IP^00014 NV UP DI PL NZ NA PO NCOAE75OO14 B409 MOV AH,09g—0014welcome to use 8088 assembler language!对于初学者,一般编写的程序比较短,用T命令逐条执行指令,可清楚了解程序的执 行过程,但如果遇上用户程序中的软中断指令I NT (如INT 21H),这时,通常不要用单步 工作方式执行INT指令,因为系统提供的软中断指令INT是以中断处理子程序形式实现功 能调用,且这种处理子程序常常是较长的。

如用T命令去执行INT指令,那么将跳转到相 应的功能调试子程序,而逐条完成这个子程序需要花费较式时间因此,遇到[NT指令且 需执行时,应该使用连接运行方式的G,且将断点设置在INT指令的下一条在单步运行情况下,解决这一问题的方法是:用命令P来执行'INT nn'指令同 理,此法也可用来执行'LOOP Lable'类指令,以便节省时间。

下载提示
相关文档
正为您匹配相似的精品文档