版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、例 1.1 求平均数。试编写一程序:在数据段中定义一个5字节数据的数组array,把它们看作有符号数求其平均数,结果送avg内存单元。程序框图见图1.1:开始初始化地址指针si计数结束?结束YN计算平均值、保存赋值循环计数器cx,清累加器al,取数据累 加修改指针si 图1.1 例1.1的程序框图上机过程如下:1. 调用文本编辑程序Edit建立asm文件Edit是Dos系统环境下的编辑工具,当然读者也可以用其它的W32编辑工具如EditPlus、Ultra edit、NotePad等软件在Windows下来建立源文件。下面假设启动的是Dos操作系统或启动Windows切换到Command命令窗
2、口(为便于讨论下面均以Dos系统说明之),汇编语言上机的工作环境在E:masm子目录下。键入以下命令:E:masmeditsample.asm使用该命令建立以sample.asm为文件名的源文件如图1.2所示。然后,保存文件返回到Dos系统。;*data segment;定义数据段 array db 1,2,3,4,5 avg db ?data ends;*code segment;定义代码段;-main proc far;定义主过程 assume ds:data,cs:codestart:;程序的入口地址标号 push ds;以下3条指令为返回Dos系统做准备 xor ax,ax push
3、ax ; mov ax,data;装载Ds段寄存器 mov ds,ax ; lea si,array;设置数组的指针si mov cx,5;装载循环计数器cx mov al,0;累加器al清零next:;循环求累加和movdl,si add al,dl inc si loop next cbw;将al中的累加和扩展到ax mov bl,5 idiv bl;商在al中,余数在ah中 mov avg,al ; ret;返回到Dos系统main endp;主过程结束;-code ends;代码段结束;* end start;整个程序结束 ;图1.2 例1.1的源文件sample.asm2. 调用汇编
4、程序Masm对源文件汇编产生目标文件sample.obj键入以下命令:E:masm masmsample屏幕显示如下:Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename sample.OBJ:Source listing NUL.LST:Cross-reference NUL.CRF: 50956 + 450516 Bytes symbol space free 0 Warning Errors0 S
5、evere Errors上述三个问题以回车作为默认回答,如汇编指示出错则须重新调用编辑程序修改错误,直至汇编通过为止。如调试时需要列表文件lst,则应在汇编过程中建立该文件。键入以下命令:E:masm masmsample屏幕显示如下:Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename sample.OBJ:Source listing NUL.LST: smplCross-reference NUL
6、.CRF: 50414 + 451058 Bytes symbol space free 0 Warning Errors0 Severe Errors则生成smpl.lst列表文件,该文件是纯文本文件,可用编辑程序打开,以获得相应的汇编信息。还可以键入以下命令,可省略三个问题从而加速汇编。E:masm masmsample;屏幕显示如下:Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved. 50956 + 450516 Bytes
7、 symbol space free 0 Warning Errors0 Severe Errors3. 调用连接程序Link对目标文件连接产生可执行文件sample.exe键入以下命令:E:masm linksample屏幕显示如下:Microsoft (R) Overlay Linker Version 3.60Copyright (C) Microsoft Corp 1983-1987. All rights reserved.Run File SAMPLE.EXE:List File NUL.MAP:Libraries .LIB:LINK : warning L4021: no sta
8、ck segment上述三个问题以回车作为默认回答。该警告错误不影响连接的通过,已产生可执行文件sample.exe。以下命令可加速连接:E:masm linksample;屏幕显示如下:Microsoft (R) Overlay Linker Version 3.60Copyright (C) Microsoft Corp 1983-1987. All rights reserved.LINK : warning L4021: no stack segment4. 调用调试程序Debug对可执行文件调试、运行本程序执行结果没有送往显示器输出,因此,不能从Dos系统运行,否则看不到结果,只能通
9、过Debug装载运行查看内存内容。键入以下命令:E:masm Debugsample.exe屏幕显示如下:-Debug以短横作为应答,此时,Debug已将可执行程序sample.exe装入内存,进入调试运行状态。一般先反汇编,将机器码反汇编成汇编语言指令,提供一些相关的调试信息。命令如下:-u0B40:0000 1E PUSH DS0B40:0001 33C0 XOR AX,AX0B40:0003 50 PUSH AX0B40:0004 B83F0B MOV AX,0B3F0B40:0007 8ED8 MOV DS,AX0B40:0009 8D360000 LEA SI,00000B40:00
10、0D B90500 MOV CX,00050B40:0010 B000 MOV AL,000B40:0012 8A14 MOV DL,SI0B40:0014 02C2 ADD AL,DL0B40:0016 46 INC SI0B40:0017 E2F9 LOOP 00120B40:0019 98 CBW0B40:001A B305 MOV BL,050B40:001C F6FB IDIV BL0B40:001E A20500 MOV 0005,AL其中第一列为代码段的段地址0B40H,该值由系统自动分配;第二列为代码段内的偏移地址,后面所选断点只能从这一列根据需要选取;第三列为机器语言指令;最
11、后是汇编语言的符号指令。输入如下命令,接着前面继续往后反汇编。-u0B40:0021 CB RETF0B40:0022 40 INC AX0B40:0023 50 PUSH AX0B40:0024 8D4680 LEA AX,BP-800B40:0027 50 PUSH AX0B40:0028 8D867AFE LEA AX,BP+FE7A0B40:002C 50 PUSH AX0B40:002D E8E270 CALL 71120B40:0030 83C406 ADD SP,+060B40:0033 B8C805 MOV AX,05C80B40:0036 50 PUSH AX0B40:003
12、7 8D4680 LEA AX,BP-800B40:003A 50 PUSH AX0B40:003B E83E0D CALL 0D7C0B40:003E 83C404 ADD SP,+04很显然,反汇编结果中仅第一行 0B40:0021 CB RETF 与本程序有关,其后的内容是系统中已经存在的,我们不必关心。如果想再看看前面机器码反汇编的结果可用带起始地址的反汇编命令,如:-u00B40:0000 1E PUSH DS0B40:0001 33C0 XOR AX,AX0B40:0003 50 PUSH AX0B40:0004 B83F0B MOV AX,0B3F0B40:0007 8ED8 M
13、OV DS,AX0B40:0009 8D360000 LEA SI,00000B40:000D B90500 MOV CX,00050B40:0010 B000 MOV AL,000B40:0012 8A14 MOV DL,SI0B40:0014 02C2 ADD AL,DL0B40:0016 46 INC SI0B40:0017 E2F9 LOOP 00120B40:0019 98 CBW0B40:001A B305 MOV BL,050B40:001C F6FB IDIV BL0B40:001E A20500 MOV 0005,AL表示再从头反汇编。为了看到在数据段中定义的5个字节数据,必
14、须将程序执行到装载Ds段寄存器之后,所以可将断点设置在0009H处(当然可写成9)。比较:-d00B2F:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 52 05 8A 03 . .O.R.0B2F:0010 52 05 17 03 52 05 41 05-01 01 01 00 02 FF FF FF R.R.A.0B2F:0020 FF FF FF FF FF FF FF FF-FF FF FF FF FF 0A 4C 01 .L.0B2F:0030 12 0A 14 00 18 00 2F 0B-FF FF FF FF 00 00 00 00 ./.0
15、B2F:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0B2F:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!.0B2F:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 .0B2F:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 .d命令默认显示ds段内容,其中第一列为当前数据段的段地址0B2FH,该值由系统自动分配;第二列为数据段内存储单元的偏移地址;中
16、间为存储单元的内容,每行对应16个字节,前8个字节与后8个字节以短横隔开,共8行;最右边是将各个字节作为ASCII码值对应的可显示字符。这里显示的是系统本来就存在的内容。没有装载Ds寄存器,所以不能显示自己定义的5个字节数据。下面先执行程序,再用d命令显示。-g9AX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0009 NV UP EI PL ZR NA PE NC0B40:0009 8D360000 LEA SI,0000 DS:0000=020
17、1-d00B3F:0000 01 02 03 04 05 00 00 00-00 00 00 00 00 00 00 00 .0B3F:0010 1E 33 C0 50 B8 3F 0B 8E-D8 8D 36 00 00 B9 05 00 .3.P.?.6.0B3F:0020 B0 00 8A 14 02 C2 46 E2-F9 98 B3 05 F6 FB A2 05 .F.0B3F:0030 00 CB 40 50 8D 46 80 50-8D 86 7A FE 50 E8 E2 70 .P.F.P.z.P.p0B3F:0040 83 C4 06 B8 C8 05 50 8D-46 80
18、 50 E8 3E 0D 83 C4 .P.F.P.0B3F:0050 04 C7 86 FE FE 00 00 EB-05 90 FF 86 FE FE A1 56 .V0B3F:0060 07 39 86 FE FE 73 7D 8B-9E FE FE D1 E3 D1 E3 8B .9.s.0B3F:0070 87 BE 22 0B 87 C0 22 74-E1 8B 9E FE FE D1 E3 D1 .t.g9表示从当前IP(0)所指指令处执行到地址9处的指令停下。注意:可执行程序刚被Debug装载入内存时,IP0。此时,数据段寄存器Ds的内容变成了0B3FH,我们的数据段的段地址就
19、是该值,可查看自己定义的5个字节数,在这一行内:0B3F:0000 01 02 03 04 05 00 00 00-00 00 00 00 00 00 00 00 .对应着源程序,我们不难发现avg单元的偏移地址是0005H(这一点是要理解的吆!)。好了,到这儿我们已经初步领略了汇编语言程序调试的要点那就是:根据需要找出断点、分段执行程序、查看相关内容、比较是否与自己设想的内容一致、决定下一步做什么。当前程序执行到什么地方,我们可用R命令显示,如下所示:-rAX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000DS=0B3
20、F ES=0B2F SS=0B3F CS=0B40 IP=0009 NV UP EI PL ZR NA PE NC0B40:0009 8D360000 LEA SI,0000 DS:0000=0201说明下面要执行 LEA SI,0000指令。当前SI=0000,因为LEA SI,0000执行后SI仍为0,为了能反映出SI的变化,我们先改掉SI的值,如下所示:-rsiSI 0000:1234-rAX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC BP=0000 SI=1234 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=000
21、9 NV UP EI PL ZR NA PE NC0B40:0009 8D360000 LEA SI,0000 DS:0000=0201SI的值修改成了1234H。 OK! 我们现在可以单步执行一条指令,如下所示:-tAX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=000D NV UP EI PL ZR NA PE NC0B40:000D B90500 MOV CX,0005显然,此时SI是0000,下面要执行的指令为 MOV CX,0005。我们
22、当然也可以单步执行2条指令,如下所示:-t2AX=0B3F BX=0000 CX=0005 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0010 NV UP EI PL ZR NA PE NC0B40:0010 B000 MOV AL,00AX=0B00 BX=0000 CX=0005 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0012 NV UP EI PL ZR NA PE NC0B
23、40:0012 8A14 MOV DL,SI DS:0000=01执行结果是将计数器CX赋值为5,将累加器AL清为0。下面,我们将断点设在0019H,亦即执行到循环退出,如下所示:-g19AX=0B0F BX=0000 CX=0000 DX=0005 SP=FFFC BP=0000 SI=0005 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0019 NV UP EI PL NZ NA PE NC0B40:0019 98 CBWg19表示从当前IP(0012H)所指指令处执行到 CBW指令停下。此时,累加和在AL中且值为0FH,与所设想的值15一致,说明
24、没有发现程序错误。注意:没有发现错误并不能表示程序一定对。下面把断点放在0021H处,执行命令如下:-g21AX=0003 BX=0005 CX=0000 DX=0005 SP=FFFC BP=0000 SI=0005 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0021 NV UP EI PL NZ NA PE NC0B40:0021 CB RETF至此,平均数已经求出在AL中且送到了avg内存单元。我们可用d命令显示如下:-d00B3F:0000 01 02 03 04 05 03 00 00-00 00 00 00 00 00 00 00 .0B3
25、F:0010 1E 33 C0 50 B8 3F 0B 8E-D8 8D 36 00 00 B9 05 00 .3.P.?.6.0B3F:0020 B0 00 8A 14 02 C2 46 E2-F9 98 B3 05 F6 FB A2 05 .F.0B3F:0030 00 CB E9 B3 00 89 3E E6-99 C6 06 E8 99 00 80 3E .0B3F:0040 A4 98 01 75 1D E8 57 E3-75 18 50 A0 C6 96 04 41 .u.W.u.P.A0B3F:0050 E8 2E 01 B0 3A E8 29 01-58 89 3E E6 99 C6 06 E8 .:.).X.0B3F:0060 99 00 E8 7E E0 74 06 E8-17 01 AC EB 78 80 3E A4 .t.x.0B3F:0070 98 01 75 03 E8 96 E0 3C-2E 75 09 FE 06 E9 99 C6 .u.0B3F:0040 A4 98 01 75 1D E8 57 E3-75 18 50 A0 C6 96 04 41 .u.W.u.P.A0B3F:0050 E8 2E 01 B0 3A E8 29 01-58 89 3E E6 99
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面诊课件教学
- 安徽省定远县四中2026届高一数学第一学期期末学业质量监测试题含解析
- 品牌故事叙事:绩效成果的价值传递
- 呼吸机数据分析的呼吸衰竭预警模型
- 声屏障施工技术规范方案
- 主动防护网施工安全方案
- 地基注浆加固施工方案及要点
- 施工方案报审表电子版填写方案
- 高标准农田建设实施计划方案
- 内墙乳胶漆涂刷施工方案设计
- 鹿邑县2025年事业单位引进高层次人才备考题库及答案详解(新)
- 2025云南昆明巫家坝城市发展建设有限公司社会招聘14人笔试历年难易错考点试卷带答案解析
- 2025年大学(直播电商实训)管理实操试题及答案
- 医院重症医学科主任谈重症医学治疗
- 云南省2025年普通高中学业水平合格性考试地理试题
- 基础土方回填施工工艺方案
- 2025年苏州工业园区领军创业投资有限公司招聘备考题库及一套答案详解
- 天一大联考海南省2026届数学高二上期末统考试题含解析
- DB50∕T 1803-2025 乡村振兴劳务品牌人员等级评定 武陵山缝纫工
- 中煤集团机电装备部副部长管理能力考试题集含答案
- 党支部2026年度主题党日活动方案
评论
0/150
提交评论