西安交通大学汇编语言实验报告(共16页).docx
精选优质文档-倾情为你奉上80X86汇编语言程序设计课内实验报告班级:电信硕41班姓名: 周翔宇 学号: 班级电信硕41实验时间ü 2016-4-1ü 206-4-23姓名周翔宇学号一、实验内容概述实验一 熟悉汇编语言实验环境(masm、link、debug/td)实验二 循环程序设计及分支程序设计实验三 子程序及 DOS/BIOS 调用程序设计实验四 高级汇编语言技术实验五 输入输出程序设计实验六 BIOS 和 DOS 中二、实验步骤实验一、masm, link, debug 的过程Debug调试命令:a, d, t, g, r, u, q等。 A (Assemble): 汇编语句 Aaddress C (Compare): 比较内存 C range address D (Display): 显示内存 Daddress或 Drange E (Enter): 改变内存 E addresslist F (Fill): 填充内存 F range list G (Go): 执行程序 G=addressaddressaddress. H: 十六进制运算命令 Haddressdrive|sector|sector I (Input): 输入 I port address L (Load): 装入内存 Laddressdrive|sector|sector M (Move): 传送内存 M range address N (Name): 定义文件和参数 N d:pathfilename.ext O (Output): 输出字节 O port address byte P (Proceed): 在下条指令前停止 P =addressvalue Q (Quit): 结束 DEBUG程序 Q R (Register): 显示寄存器/标志位 R register name S (Search): 捡索字符 S range list T (Trace): 执行并显示(跟踪) T =addressvalue U (Unassemble): 反汇编指令 U address或 Urange W (Write): 把文件或数据写盘 W addressdrive|sector|sector STEP1首先进入cmd命令运行界面STEP2进入masm5文件夹 cd d:masm5 STEP3Masm 输入程序代码文件 xxx 然后回车STEP4Link 输入程序代码文件 xxx 然后回车STEP5Debug xxx.exe 进入了Debug界面实验二、循环程序设计及分支程序设计(1) 循环程序设计 数据段中已定义了一个有 n 个字数据的数组 M, 试编写一程序求出M 中绝对值最大的数,把它放在数据段的 M+2n 单元中,并将该数的偏移地址存放在M+2(n+1)单元中。程序思路:STEP1取第一个数,记录此数;STEP2此数是正数吗?是转到STEP3,否转到STEP4;STEP3是正数,即为绝对值,转去判断下一个数;STEP4不是正数,变为其绝对值;STEP5判断绝对值大小;STEP6(AX)<(BX),使(AX)中为绝对值最大的数;STEP7记下绝对值最大的数的地址,记下此数;STEP8数判断完了吗?是结束,否继续;STEP9转到STEP1;程序源代码:见附件1(2) 分支程序设计 设计一程序,接收从键盘输入的数字(15),并对每个数字的输入次数进行计数,计数结果存放在以 COUNT 为首地址的数组中。(最好能将计数结果打印出来)。程序思路:STEP 1 设置一个五路分支,输入数为X则跳转到X步;STEP X COUNTX+1程序源代码:见附件2实验三、子程序及 DOS/BIOS 调用程序设计 设有 10 个学生的成绩分别是 76,69,84,90,73,88,99,63,100 和 80 分。 试编制一个子程序统计 6069 分,7079 分,8089 分,9099 分和 100 分的人数并分别存放到 S6, S7, S8, S9 和 S10 单元中。程序思路:将成绩除以10然后减6作为偏移地址,然后将此地址加1则表示人数加1程序代码:见附件3实验四、 高级汇编语言技术 试编写一段程序,完成以下功能:若给定名为 X 的字符串长度大于 5 时,下列指令将汇编 10 次。 ADD AX, AX (要求:使用条件汇编,编译过程中生成 LST 文件,查看宏展开情况)程序思路:用($-X)代表字符串长度,然后使用条件汇编指令IF程序代码:见附件4实验五、输入输出程序设计 编写程序,使类型 1CH 的中断向量指向中断处理程序 COUNT,COUNT 统计 1CH 中断次数并存入单元 M 中。 程序思路:STEP1取中断类型号STEP2取中断向量STEP3偏移地址送IP,段地址送CS(上述步骤为保存原中断向量)STEP4设置新的中断向量STEP5转入中断处理程序,并且中断一次M累加1STEP6中断返回程序代码:见附件5实验六、.BIOS 和 DOS 中断 编写一个程序,接收从键盘输入的 10 个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用 XLAT 指令变换)存入内存缓冲区 BUFFER。加密表为: 输入数字: 0,1,2,3,4,5,6,7,8,9 密码数字: 7,5,9,1,3,6,8,0,2,4程序思路:将密码存入数据段,利用XLAT指令,设置AL表示数字值,将对应表中数据送入程序代码:见附件六 三、实验中遇到的问题及其解决方法1、问题1问题描述:绝对值如何得到问题是在实验一中遇到,解决思路是:利用反码的思想解决问题的步骤是:是负数则对负数取反码2、问题2n问题描述:进入Debug界面后,更改输入,然后输入与要求不符n问题是在实验X中遇到,解决的思路是:理清调试步骤n解决问题的步骤是:Debug界面进入后修改了输入然后必须退出Debug界面然后修改后再次重新进入Debug界面3、问题3问题描述:如何调用中断,键盘输入,并且屏幕显示问题是在实验二遇到的,解决的思路是:调用DOS功能解决问题的步骤骤是:调用DOS功能(INT 21H)并选取AL=2从键盘输入;选取AL=30在屏幕上显示,然后选取AL=4CH返回4、问题4问题描述:如何设置中断向量问题是在实验五遇到的,解决思路是,保存原有中断向量,设置新的中断向量,恢复原有的中断向量解决问题的步骤是:首先保存原有的中断向量,然后设置新的中断向量,进入中断程序,最后恢复原有中断向量四、实验结果实验二(1)输出结果:实验二(2)输入:输出实验三、输出结果:数据段:实验四、反汇编:显示内存:查看LST文件:文件内容截图:实验五、内存结果:实验六、输入:输出: 五、附件 附件1:data segment M dw 1,4,3,2,-1,-5,-8,-9,'$'m1 dw 10 dup(?)disa db 'the location of M+2n is : $'disb db 'the location of M+2(n+1)is : $'disc db 0dh,0ah,24hdata endsstack segment stackdw 100 dup(?)top label wordstack endscode segmentmain proc farassume ss:stack,cs:code,ds:datastart:mov ax,stackmov ss,axlea sp,topmov ax,datamov ds,axxor si,si;用来放绝对值最大数的输出lea bx,Mmov si,bx;记录第一个数的地址mov cx,0;记录第一个数值假设是0L1:mov ax,bxcmp ax,24hje L4rol ax,1and ax,1hcmp ax,1;是负数的话就求原码je L2mov ax,bx;正数的话就直接比较mov di,0cmp cx,axjbe L3add bx,2jmp L1L2:mov di,1mov ax,bx;对负数进行求原码运算sub ax,1not axcmp cx,axjbe L3;记录绝对值比较大的数还有符号add bx,2jmp L1L3:mov cx,ax;改变cx的值mov si,bx;改变si的地址值mov dx,diadd bx,2jmp L1L4:lea bx,m1mov bx-2,cx;M+2n存放绝对值最大的数mov bx,si;M+2(n+1)存放他的地址mov bx+2,dx;存放他的符号L5:lea dx,disc;输出换行mov ah,9int 21hlea dx,disa;输出提示语mov ah,9int 21hlea bx,m1mov dx,bx+2cmp dx,0je L51mov dl,'-'mov ah,2int 21hL51:xor si,silea bx,m1;把结果地址传给bxmov si,bx-2;把结果传给simov cx,4L6:push cxmov cl,4rol si,clmov dx,siand dl,0fhcmp dl,9jbe L7add dl,7hL7:add dl,30hmov ah,2hint 21hpop cxloop L6L8:lea dx,disc;输出换行mov ah,9int 21hlea dx,disb;输出提示语mov ah,9int 21hxor si,silea bx,m1mov si,bxmov cx,4L9:push cxmov cl,4rol si,clmov dx,siand dl,0fhcmp dl,9jbe L10add dl,7hL10:add dl,30hmov ah,2hint 21hpop cxloop L9 mov ah,4chint 21hmain endpcode endsend start附件2:DATAS SEGMENTCOUNT db 5 dup (0)DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: push ds sub ax,ax push ax MOV AX,DATAS MOV DS,AXnext: mov ah,01h int 21h cmp al,'1' jz C1 ;jz当zf=1跳转 cmp al,'2' jz C2 cmp al,'3' jz C3 cmp al,'4' jz C4 cmp al,'5' jz C5 jmp exitC1: mov cl,COUNT add cl,1 mov COUNT0,cl jmp nextC2: mov bx,1 mov cl,COUNTbx add cl,1 mov COUNTbx,cl jmp nextC3: mov bx,2 mov cl,COUNTbx add cl,1 mov COUNTbx,cl jmp nextC4: mov bx,3 mov cl,COUNTbx add cl,1 mov COUNTbx,cl jmp nextC5: mov bx,4 mov cl,COUNTbx add cl,1 mov COUNTbx,cl jmp next exit: mov dl,COUNT0 add dl,30h mov ah,02 int 21h mov dl,COUNT1 add dl,30h mov ah,02 int 21h mov dl,COUNT2 add dl,30h mov ah,02 int 21h mov dl,COUNT3 add dl,30h mov ah,02 int 21h mov dl,COUNT4 add dl,30h mov ah,02 int 21h mov ah,4ch int 21hCODES ENDSEND START附件3:DSEGSEGMENTSDW 76,69,84,90,73,88,99,63,100,80S6DW 0S7DW 0S8DW 0S9DW 0S10DW 0DSEGENDSCSEGSEGMENTMAINPROCFARASSUME CS:CSEG,DS:DSEGstart:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AXBEGIN:MOVCX,10CALLCOUNTRETMAINENDPCOUNTPROCNEAR;成绩统计子程序MOVSI,0NEXT:MOVAX,SSIMOVBX,10; DIVBL;计算公式为:(成绩)/10-6)*2送(BX)MOVBL,AL; SUBBX,6;应为只统计60分以上成绩SALBX,1;(BX)*2INCS6BX;S6是S6,S7,S8,S9和S10单元的首地址ADDSI,2LOOPNEXTRETCOUNTENDP;COUNT子程序结束CSEGENDS;以上定义代码段ENDstart附件4:DSEG SEGMENT DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGMAIN PROC FAR EXE MACRO A IF ($-EXE) GT 5 REPT 10 ADD AX,AX ENDM ENDIFENDMMOV AX,DSEGMOV DS,AXEXE 'ABCDEF'MOV AH,1INT 21HMOV AX,4C00HINT 21HMAIN ENDPCSEG ENDSEND MAIN附件5:DATAS SEGMENTM DB 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV AL,1CHMOV AH,35HINT 21HPUSH ESPUSH BXPUSH DSMOV AX,SEG COUNTMOV DS,AXMOV DX,OFFSET COUNTMOV AL,1CHMOV AH,25HINT 21HPOP DSINT 1CHINT 1CHINT 1CHINT 1CHINT 1CHPOP DXPOP DSMOV AL,1CHMOV AH,25HINT 21HMOV AX,4C00HINT 21HCOUNT PROC NEARPUSH DSPUSH AXPUSH CSPUSH DXINC MPOP DXPOP CXPOP AXPOP DSIRETCOUNT ENDPCODES ENDSEND START附件6:DSEG SEGMENTDATA DB 7,5,9,1,3,6,8,0,2,4BUFFER DB 10 DUP(' ')DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGMAIN PROC FARSTART:MOV AX,DSEGMOV DS,AXMOV SI,0LEA BX,DATALOOP1:MOV AH,01HINT 21HCMP AL,0DHJZ EXITSUB AL,30HJB LOOP1CMP AL,09HJA LOOP1XLATMOV BUFFERSI,ALINC SILOOP LOOP1EXIT:MOV AX,4C00HINT 21HMAIN ENDPCSEG ENDSEND MAIN专心-专注-专业