版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语复习实验三实验三 汇编语程序调试运1.实验请安装并使MASM5汇编器。(1)将下的数据段输,取名为1.asm, 保存在MASM件夹下,成.lst件,不必连接运,查看1.lst件,试回答:DA1,DA2 的偏移量分别为多少?COUNT的值为多少?data segment org 20hnum1=8 num2=num1+10h da1 db 'IBM PC'da2 db 0ah,0dh count equ $-da1data endsendDA1的偏移量为20H。DA2的偏移量为26H。COUNT值为8。不对程序进连接和调试,也可以查看程序中内容的状态,具体实现法如下:如图,
2、这是编译过程中的部分,都1.asm件进masm,中间会有步问询是否需要成.lst件,这个.lst件就是我们需要的, 为它随便赋予个件名,我们就可以在1.asm件夹中找到.lst件,打开.lst件,就能查看程序中的各种状态。打开.lst件,内容是这样的:$此处是使notepad+打开的,当然也可以记事本打开。2.(2)输下列指令,改正可能的错误(调试不要运程序):data segmentvar1 db 0, 25, 0dh,300 var2 db 12h,a4h,6bh var3 db 'ABCDEF' var4 dw 1234h, 5678h var5 dw 10h dup(?
3、) data endscode segmentassume cs:code, ds:data begin mov ax, datamov ds, ax lea si, var5mov bx, offset var2mov si, 0abh ;没有指定移动数据类型mov ax, var1+2mov bx, si ;需要使寄存器中转mov var5+4, var4mov ah, 4ch int 21hcode endsend start总之,调试到没有warning和error即可:;修正后的代码:assume cs:code, ds:data data segmentvar1 dw 0, 25,
4、 0dh,300 var2 db 12h,0a4h,6bh var3 db 'ABCDEF'var4 dw 1234h, 5678h var5 dw 10h dup(?) data endscode segment start: mov ax,datamov ds, ax lea si,var5mov bx, offset var2 mov ax, 0abhmov si,axmov ax,var1+2 mov ax,simov bx,axmov var5+4,offset var4 mov ah, 4chint 21h code endsend start3. 将完整程序放在代
5、码段C_SEG 中,编写程序把数据段D_SEG中的AGUEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG 中的SUM中。其中AUGEND,ADDEND,SUM均为dw类型,AUGEND赋值为9251,ADDEND赋值为-5962。实验报告中要求写出源 程序,简单叙述上机步骤,调试法。;程序源代码:assume cs:C_SEG,ds:D_SEG,es:E_SEG D_SEG segmentAGUEND dw 9251SUM dw 0 D_SEG ends E_SEG segmentADDEND dw -5962E_SEG ends C_SEG segmentstart:
6、mov AX,D_SEGmov DS,AX ;将段地址移动带地址段寄存器mov AX,E_SEGmov ES,AX ;将段地址移动到附加段寄存器mov BX,offset AGUEND;得到AGUEND的地址mov AX,DS:BXmov BX,offset ADDEND;得到ADDEND的地址add AX,ES:BXmov BX,2mov DS:BX,AXmov ah, 4chint 21h ;实验1中有提及,int 21h和ah = 4ch的组合,实现了调return进程。C_SEG endsend start注意offset指令,如果不加offset,得到的是AGUMEND这个数本,但是
7、加上offset,得到的就是它的地址。4. 数组中是组符号数,将最数放在M单元中,经过汇编后,形成.EXE件,先G=0命令执程序,-D命令查看M单元的内容, 会发现结果不正确。单步执命令T查找程序中的逻辑错误。DSEG SEGMENTMSG DB 13, 15, 7, 25, 24 M DB ?DSEG ENDS CSEG SEGMENTASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEGMOV DS, AX MOV CX, 4MOV AL, MSGMOV SI, OFFSET MSG+1 L1:CMP AL, SI;INC SIJB NEXT ;CMP
8、A,B若A<B则转移MOV AL, SI ;A>B 则SI中的内容,存ALNEXT: INC SI;在此处执增,因为如果得到了较值,需要将较值移;AL,移动的时候SI的位置是不能改变的LOOP L1 MOV M, AL MOV AX, 4C00H INT 21HCSEG ENDSEND START本处考察的是各种跳转指令的应,详细可以参考这篇博:。5. 试编制个汇编语程序,求出地址为DATA的10个符号字数组中的最偶数,把它存放在AX中。画出程序框图,写出源程序清单和执结果。Data word 0141H, 0AE00H, 07B4H, 0A508H, 0691H,word 087
9、0H, 7542H, 0081H, 0916H, 0017H程序框图:;源程序:assume ds:Dseg,cs:Code Dseg segmentdata dw 0141H, 0AE00H, 07B4H, 0A508H, 0691H,0870H, 7542H, 0081H, 0916H, 0017HDseg ends Code segmentstart: mov AX,dseg mov DS,AXmov CX,9 mov AX,datamov SI,offset data+2L1: test AX,01H ;判断AX中最后位是否为1,为1则为奇数,是奇数换值jnz L2 ;jnz:jump
10、 if not zerotest word ptr SI,01H ;判断要和当前数较的数是否为奇数jnz NEXT ;不是奇数,跳转执cmp AX,SI ;较jb NEXT ;AX中的值于SI,跳转L2: mov AX,SI ;这段代码两个功能:;如果开始AX中放的不是偶数,反复执这代码,使它变成偶数;如果找到AX中更的偶数,那么更换AX中的值为值NEXT: add SI,2loop L1MOV AX, 4C00H INT 21HCode endsend start注意此处判断奇偶的法: 使的是实验中讲到的TEST指令,即将两个操作数进逻辑与操作,得到的结果于改变标志位不进保存。进制中判断奇偶
11、的法很简单,如果最低位为1,就是奇数,否则就是偶数,因此判断8位寄存器中的数据是奇是偶,只需 和01H进TEST即可,如果ZF = 1(Zero Flag,为1表刚才得到的运算结果为0),则说明是偶数,否则是奇数。其次考察的同样是跳转指令。je代表的是相等则跳转,上通常使cmp指令来改变标志位。jne则为不相等即跳转。jg(jump if greater)和jl(jump if less)为有符号的较,jg为如果于则跳转,jl为如果于则跳转,上通常使cmp来改变标志位,于和于指的是第个数于第个数和第个数于第个数。jge和jle即于等于和于等于。ja(jump if over)和jb(jump
12、if below) 为符号的较跳转。6. 有10个数,统计正数的个数,存放在变量M中。经过汇编后,形成.EXE件,先G=0命令执程序,-D命令查看M单元的内容,会 发现结果不正确。单步执命令T查找程序中的逻辑错误,注意每次循环中AL寄存器中的值变化是否正确(AL寄存器中存放正数的个数)。;未修正的代码:DSEG SEGMENTMSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6 M DB ?DSEG ENDS CSEG SEGMENTASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEGMOV DS, AX MOV CX, 10MO
13、V AL, 0 LEA SI, MSGL1: MOV BL, SI CMP BL, 0JBE NEXT ;这是错误的,JBE是符号较,应该改为JLE。符号较不能对负数进较,所以;不能区分正数和负数。;这统计的是正数的个数,所以遇到于等于0的数则跳转。INC AL NEXT: INC SILOOP L1 MOV M, ALMOV AX, 4C00H INT 21HCSEG ENDSEND START;正确代码:DSEG SEGMENTMSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6 M DB ?DSEG ENDS CSEG SEGMENTASSUME CS: CSE
14、G, DS: DSEG START: MOV AX, DSEGMOV DS, AX MOV CX, 10MOV AL, 0 LEA SI, MSGL1: MOV BL, SI CMP BL, 0JLE NEXT;JBE使符号较,因此不能较出正数。;如果0算正数的话,JLE改为JLINC AL NEXT: INC SILOOP L1 MOV M, ALMOV AX, 4C00H INT 21HCSEG ENDSEND STARTLEA指令:通过LEA指令,可以将第操作数的 地址 赋予第操作数。如, LEA SI,ARRAY ,就是将ARRAY的元素地址赋予SI。 MOV SI,ARRAY 等同于
15、 MOV SI,ARRAY ,是将ARRAY地址下第个元素的值赋予SI。注意, LEA SI,ARRAY 等价于 MOV SI,OFFSET ARRAY 。7. 假设有组数据:5,-4,0,3,100,-51请编程序,判断:每个数于0,等于0,还是于0;并将最终结果存于以result为存储 的字节单元中,(Result DB 6 dup(?))即:编程提:1. 先将原始数据装起始地址为XX的字节存储单元中。2. 其中判断部分可采CMP指令,得到个分结构,分别输出“y=0”, “y=1”, “y=-1”。将结果存result的相应单元3. 程序中存在个循环结构,循环6次,调6次分结构后结束。;程
16、序源代码:assume ds:Dseg,cs:Cseg Dseg segmentdata db 5,-4,0,3,100,-51result db 6 dup(?) Dseg endsCseg segment start:mov ax,Dseg ;取得数据段的地址mov ds,ax ;将数据段的地址放在数据段寄存器中mov cx,6mov si,offset data mov bx,offset result L1: cmp byte ptr si,0jg L2 ;的操作数于原操作数,跳转jl L3 ;于,跳转jle L4 ;于等于,跳转,因已经判断过是否于,则默认为等于跳转L2: mov b
17、yte ptr bx,1 jmp NEXTL3: mov byte ptr bx,-1 jmp NEXTL4: mov byte ptr bx,0 NEXT: inc bxinc si loop l1mov ax,4c00H int 21Cseg endsend start这道题没有什么可说的,按照题意做即可,注意跳转指令的应。 mov byte ptr bx,1 此处需要使 byte ptr 指定数据类型,因为 bx 是块内存,不知道需要多的内存来容纳移的即数,因此需要 byte ptr 指定为字节型。8. 数据段中的三个字符,调程序将其逐个显出来。程序的功能是显个字符。单步执,观察SP、I
18、P的变化,并D命令查看栈 顶的内容。DATA SEGMENT MAG DB 'ABC' DATA ENDSSTACK_SEG SEGMENT DB 100 DUP(?)TOS LABEL WORD STACK_SEG ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS: STACK_SEG START:MOV AX, STACK_SEG MOV SS, AXMOV SP, OFFSET TOS MOV AX, DATAMOV DS, AX MOV SI, 0MOV CX, 3LL: MOV DL, MAGSI CALL MADDINC SI
19、LOOP LLMOV Ax, 4C00H INT 21HMADD PROC MOV AH, 02H INT 21HRETMADD ENDP CODE ENDS END START此处使proc和endp指定了汇编程序的个进程,我们可以把它看作个程序,在其他程序运的进程中,可以通过call指令来调这个此程序,程序的返回使ret指令。具体的实现原理:1)call指令:格式为 call 标号先将当前的IP或CS和IP压栈中,再跳转标号处,跳转类似于jmp。call指令不能执短跳转,但可以进近跳转和远跳转。2)ret和retf指令:格式为 ret 。ret指令栈中的数据,修改IP的内容,从实现近转移。
20、retf指令栈中的数据,修改CS和IP的内容,从实现远转移。9. 将个给定的进制数按位转换成相应的ASCII码字符串,送到指定的存储单元,如进制数10010011转换成字符串为10010011。要求将转换过程写成程序,且程序应具有较好的通性,必须能实现对8位和16位进制数的转换。(寄存 器或变量实现参数传递)测试数据:Var8bit byte 10010011BVar16bit word 1010001111000100B 显单元:Show8bit byte 8 dup (?) Show16bit byte 16 dup (?);程序源代码:assume ds:Dseg,cs:Cseg Dse
21、g segmentVar8bit db 10010011BVar16bit dw 1010001111000100BShow8bit db 8 dup(?) Show16bit dw 16 dup(?) Dseg endsCseg segment main procstart: mov ax,Dseg mov ds,axmov dl,Var8bit;使dx的低位dl;直接将Var8bit这个值赋给dl。mov cx,8;8位,循环8次lea si,Show8bit;将show8bit的地址传给si;此处要取得的是地址,因为要在Show8bit这个数组中存储结果。call solve;调进程,进
22、进制->字符串的处理mov si,byte ptr 0dh;回车,添加在字符串尾mov si+1,byte ptr 0ah;换mov si+2,byte ptr '$'结束符;上三句直接加上即可。lea dx,Show8bit;打印ds:dx位置的内容mov ah,9h;打印字符串int 21hmov dx,Var16bit mov cx,16lea si,Show16bit call solvemov si,byte ptr 0dh;回车mov si+1,byte ptr 0ah;换mov si+2,byte ptr '$'结束符lea dx,Show1
23、6bit;打印ds:dx位置的内容mov ah,9h;打印字符串int 21hmov ax,4c00h int 21hmain endp solve proccmp cx,8 ;判断要处理的数据是8位还是16位jne L1mov dh,dl;如果不是16位,将dl复制给dh L1: mov al,0;将al置0,即每次只处理位rol dx,1;循环左移1位,将最位放CFrcl al,1;带进位的循环左移,位,即将刚才取到的位数放在al中add al,30h;因为0的ASCII码为48,即30H,加上30H将数字变成字符mov si,al;这个字节处理完了,存到si中inc si loop L1
24、 retsolve endp Cseg ends end start这段程序实际上没有“主函数”,是将“main”也做成了个proc程序,我们可以为地把它当成主函数,在主函数中调solve函数,完成需要解决的问题。细节详见注释。solve程序实现的实际上是:将存储数据的dx循环左移,将移出的数据循环左移到al中,即al的最低位即为刚才移的数据。加上30H后变成字符,处理完成,放si中。10. 将个给定的进制数按位转换成相应的ASCII码字符串,送到指定的存储单元,如进制数10010011转换成字符串为10010011。要求将转换过程写成程序,且程序应具有较好的通性,必须能实现对8位和16位进制
25、数的转换。(堆栈 实现传参:可以选择过程来平衡堆栈,也可以调过程来实现平衡堆栈,程序功能说明中要指出)测试数据:Var8bit byte 10010011BVar16bit word 1010001111000100B 显单元:Show 8bit byte 8 dup (?) Show 16bit byte 16 dup (?);程序源代码:assume ds:data,cs:code,ss:stack data segmentVar8bit db 10010011BVar16bit dw 1010001111000100BShow8bit db 8 dup(?) Show16bit dw 16 dup(?) data endsstack segmentdw 24 dup(?);开辟20位的空间,即5个字节tos label word;设置栈底地址stack ends code segment main procstart: mov ax,stack mov ss,axmov sp,offse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 九江职业技术学院《职业发展规划》2024-2025学年第二学期期末试卷
- 烟台大学《中学语文课本剧编演》2024-2025学年第二学期期末试卷
- 鹤壁职业技术学院《视觉艺术与传播》2024-2025学年第二学期期末试卷
- 武汉体育学院体育科技学院《跨文化交流与比较方法汉英双语》2024-2025学年第二学期期末试卷
- 山东政法学院《园林建筑小品设计实践》2024-2025学年第二学期期末试卷
- 企业筹资管理制度
- 周口职业技术学院《韩国语入门》2024-2025学年第二学期期末试卷
- 河北医科大学临床学院《产品语义学》2024-2025学年第二学期期末试卷
- 周口理工职业学院《产品表现技法》2024-2025学年第二学期期末试卷
- 2026人力资源社会保障部所属事业单位招聘62人笔试备考试题及答案解析
- JJF 1427-2013微机电(MEMS)线加速度计校准规范
- GB/T 8804.2-2003热塑性塑料管材拉伸性能测定第2部分:硬聚氯乙烯(PVC-U)、氯化聚氯乙烯(PVC-C)和高抗冲聚氯乙烯(PVC-HI)管材
- GB/T 7583-1987声学纯音气导听阈测定听力保护用
- GB/T 4025-2010人机界面标志标识的基本和安全规则指示器和操作器件的编码规则
- GB/T 30775-2014聚乙烯(PE)保护膜压敏胶粘带
- GB/T 29086-2012钢丝绳安全使用和维护
- 2023年AIGC发展趋势报告:迎接人工智能的下一个时代-腾讯研究院
- 温敏型羟丁基壳聚糖护创敷料技术审评报告
- 船体结构介绍课件
- 热处理加工中心年加工10000吨金属构件项目可行性研究报告写作模板立项备案文件
- 轨道工程监理实施细则-
评论
0/150
提交评论