合肥工业大学计算机与信息学院实验报告课程:汇编语言程序设计专业班级:**************** 学号:**********姓名:*****目录实验一 (3)实验二 (7)实验三 (12)实验四 (22)实验一Debug程序的使用一.实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。
2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。
要求:本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序实验内容一:e ds:0200 E7 1A 3F 00e ds:0204 C4 E5 6B 00实验内容二:(1)直接寻址方式MOV AX,[0200]MOV BX,[0202]ADD AX,[0204]ADC BX,[0206]MOV [0208],AXMOV [020A],BX(2)寄存器间接寻址方式MOV SI,0200HMOV DI,0204HMOV BX,0208HMOV AX,[SI]MOV DX,[SI+2]ADD AX,[DI]ADC DX,[DI+2]MOV [BX],AXMOV [BX+2],DX四.实验结果(包括必要的截图)实验内容一:输入数据:显示数据:实验内容二:(1)直接寻址方式程序段编辑:反汇编:运行:结果在DS:0208 单元中为00AB00ABH(2)寄存器间接寻址方式程序段编辑:反汇编:运行:结果高字存放在dx中,低字存放在ax中(结果为00AB00ABh)五.实验体会通过本实验,实践debug程序中的命令,并在debug下调试运行汇编语言源程序。
在实践过程中,解决如何把数据录入存储单元、debug命令如何使用等问题后,知道存数据例如1234进存储单元时要34 12存,还有掌握了寄存器的寻址方式。
实验二汇编语言程序设计(顺序、循环)一.实验目的1、掌握顺序和循环程序结构和设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二.实验内容1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。
试编写汇编语言程序完成以下功能:①计算表达式值(V–(X*Y+Z-720))/X;②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。
2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示出来)3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。
如果有,输出‘Yes’;否则,输出‘No’)。
三.实验过程和程序(注:附加题没有做)实验内容一:X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。
试编写汇编语言程序完成以下功能:①计算表达式值(V–(X*Y+Z-720))/X;②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。
Data segmentx dw ?y dw ?z dw ?v dw ?sum1 dw ?sum2 dw ?Data endsCode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov ax,ximul ymov cx,axmov bx,dxmov ax,zcwdadd cx,axadc bx,dxsub cx,720sbb bx,0mov ax,vcwdsub ax,cxsbb dx,bxidiv xmov sum1,axmov sum2,dxmov ah,4chint 21hCode endsend start实验内容二:求一个班50名学生成绩的平均值(为了方便,只设置了5个学生数据)data segmentgrade dw 90,80,80,70,60;平均数76data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axxor ax,axmov cx,5mov bx,offset gradeagain: add ax,[bx]add bx,2loop againmov cx,5cwdidiv cxmov ah,4chint 21hcode endsend start实验内容三:从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串data segmentbuffer db 50db ?db 50 dup('$')cr db 0ah,0dh,"$"data endscodes segmentassume cs:codes,ds:datastart:mov ax,datamov ds,axinput:mov ah,10lea dx,bufferint 21hlea dx,crmov ah,9int 21houtput:lea dx,buffer+2mov ah,9int 21hmov ah,4chint 21hcodes endsend start四.实验结果(包括必要的截图)实验内容一:设x=156,y=10,z=220,v=2000,则sum1=0006h,sum2=0004h 在ax中看sum1,在dx中看sum2实验内容二:预先设置的数据求得平均数为76,在ax中查看,即ax=004Ch实验内容三:五.实验体会通过本实验,将课本上学到的算术运算类指令、变量定义伪指令、存储单元、DOS 0AH 号功能(字符串输入)和DOS 09H功能(字符串输出)等在实验中实现。
在实现过程中,解决遇到的问题(符号扩展、定义的数组存储空间地址、字符串如何输入输出等)后,对上述知识有了更深的了解,并掌握实现它。
实验三汇编语言子程序设计(分支、子程序)一.实验目的1、掌握分支和子程序结构和设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
3、通过汇编语言了解高级语言的参数传递等知识。
二.实验内容1、BL中的只有一位为1。
编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。
2. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。
要求通过堆栈(寄存器、内存)传送所有参数。
3. 实践C Asm的转换过程。
三.实验过程和程序实验内容一:BL中的只有一位为1。
编写程序测试,并输出提示信息“The X Bit is 1”(1)转移表;转移表,bl 左到右1-8位DATAS SEGMENTstr1 db 'the 1 bit is 1',0dh,0ah,'$'str2 db 'the 2 bit is 1',0dh,0ah,'$'str3 db 'the 3 bit is 1',0dh,0ah,'$'str4 db 'the 4 bit is 1',0dh,0ah,'$'str5 db 'the 5 bit is 1',0dh,0ah,'$'str6 db 'the 6 bit is 1',0dh,0ah,'$'str7 db 'the 7 bit is 1',0dh,0ah,'$'str8 db 'the 8 bit is 1',0dh,0ah,'$'DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXmov bl,00010000bmov cx,8mov si,0again:shl bl,1jc nextadd si,3loop againnext:add si,offset jmptablejmp sijmptable:jmp near ptr l1jmp near ptr l2jmp near ptr l3jmp near ptr l4jmp near ptr l5jmp near ptr l6jmp near ptr l7jmp near ptr l8l1:lea dx,str1jmp outputl2:lea dx,str2jmp outputl3:lea dx,str3jmp outputl4:lea dx,str4jmp outputl5:lea dx,str5jmp outputl6:lea dx,str6jmp outputl7:lea dx,str7jmp outputl8:lea dx,str8output:mov ah,9int 21hMOV AH,4CHINT 21HCODES ENDSEND START(2)地址表;地址表,bl左到右依次是第1-8位DATAS SEGMENTstr1 db 'the 1 bit is 1',0dh,0ah,'$'str2 db 'the 2 bit is 1',0dh,0ah,'$'str3 db 'the 3 bit is 1',0dh,0ah,'$'str4 db 'the 4 bit is 1',0dh,0ah,'$'str5 db 'the 5 bit is 1',0dh,0ah,'$'str6 db 'the 6 bit is 1',0dh,0ah,'$'str7 db 'the 7 bit is 1',0dh,0ah,'$'str8 db 'the 8 bit is 1',0dh,0ah,'$'addrtable dw show1,show2,show3,show4,show5,show6,show7,show8 DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXmov bl,00001000bmov cx,8mov si,0 again:shl bl,1jc nextadd si,2loop again next:jmp addrtable[si]show1:lea dx,str1jmp output show2:lea dx,str2jmp output show3:lea dx,str3jmp output show4:lea dx,str4jmp output show5:lea dx,str5jmp output show6:lea dx,str6jmp output show7:lea dx,str7jmp output show8:lea dx,str8jmp outputoutput:mov ah,9int 21hMOV AH,4CHINT 21HCODES ENDSEND START实验内容二:编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)(1)堆栈传递参数;z=x*y+x-y,x、y、z为有符号数,堆栈传递DATAS SEGMENTx dw 5y dw 2z dw ?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXsub sp,2push ypush xcall calpop zmov bx,zMOV AH,4CHINT 21Hcal procpush bpmov bp,sppush axpush bxmov ax,[bp+4]mov bx,[bp+6]imul bxadd ax,[bp+4]adc dx,0sub ax,[bp+6]sbb dx,0mov [bp+8],axpop bxpop axpop bpret 4cal endpCODES ENDSEND START(2)寄存器传递参数;z=x*y+x-y,x、y、z为有符号数,寄存器传递DATAS SEGMENTx dw 5y dw 2z dw ?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXmov ax,xmov bx,ycall calmov z,axMOV AH,4CHINT 21Hcal procmov cx,aximul bxadd ax,cxadc dx,0sub ax,bxsbb dx,0retcal endpCODES ENDSEND START(3)内存传递参数;z=x*y+x-y,x、y、z为有符号数,内存传递DATAS SEGMENTx dw 5y dw 2z dw ?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXcall calMOV AH,4CHINT 21Hcal procmov ax,ximul yadd ax,xadc dx,0sub ax,ysbb dx,0mov z,axretcal endpCODES ENDSEND START实验内容三:实践C—>ASM的转换过程_TEXT SEGMENT_c$ = -32 ; size = 2_b$ = -20 ; size = 2_a$ = -8 ; size = 2_main PROC ; COMDAT; 4 : void main(){push ebpmov ebp, espsub esp, 228 ; 000000e4Hpush ebxpush esipush edilea edi, DWORD PTR [ebp-228]mov ecx, 57 ; 00000039Hmov eax, -858993460 ; ccccccccH rep stosd; 5 :; 6 : short a,b,c;; 7 : a=1;mov eax, 1mov WORD PTR _a$[ebp], ax; 8 : b=a+1;movsx eax, WORD PTR _a$[ebp]add eax, 1mov WORD PTR _b$[ebp], ax; 9 : c=a+b;movsx eax, WORD PTR _a$[ebp]movsx ecx, WORD PTR _b$[ebp]add eax, ecxmov WORD PTR _c$[ebp], ax; 10 :; 11 :; 12 : }xor eax, eaxpop edipop esipop ebxmov esp, ebppop ebpret 0_main ENDP_TEXT ENDS四.实验结果(包括必要的截图)实验内容一:(1)转移表:设bl=00010000b(2)地址表:设bl=00001000b实验内容二:设x=5,y=2,则z=13(000D),结果在ax (1)堆栈传递参数(结果在bx中查看)(2)寄存器传递参数(结果在ax中查看)(3)内存传递参数(结果在ax中查看)五、实验体会通过本实验,让我更加深入了解地址表和转移表、子程序和从C输出汇编文件等知识,通过实现地址表与转移表加深了对汇编寻址方式的了解;实现子程序,掌握主程序如何调用子程序,及子程序与主程序之间的参数传递方式;用VS实现C->ASM后,对C或C++有了新的认识。