西安交通大学 汇编语言实验报告 计算机26班 石磊 2120505140 80X86汇编语言程序设计课内实验报告 班级 姓名 实验内容概述 实验步1.熟悉汇编语言的实验环境(学校机房:集成编译环境;个人电脑:emu8086),了解各项功能的调用。 2.编译课本上例题、习题某些程序,利用debug调试。 实验一 数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 石磊 学号 2120505140 计算机26班 实验时间 2014年4月28日 实验二 设计一程序,接收从键盘输入的数字(1~5),并对每个数字的输入次数进行计数,计数结果存放在以COUNT为首地址的数组中。(最好能将计数结果打印出来)。 骤 3.调试并优化实验一程序。 4.调试并优化实验二程序。 5.观看老师当堂演示debug的使用,请老师验收实验结果。 6.完成实验。 实验结果 1.实验一结果 1.结果显示 ① ② ③ ④ 输出结 2.结果分析 程序执行完成后最大的数是-7的绝对值7,符合M数组中最大值; 并且位置在M+2,符合M数组中最大元素位置。 2、 实验二结果 ① 输入结果 果 ② 输出结果 ③ 结果分析 输入待统计数字后,输入任意大于5的数字则输出统计结果。1的数目是2个,2的数目是2个,3的数目是1个。符合实际数目。 建议 1、 可以考虑增加实验时间。汇编语言的风格、思路与我们之前学习过的高级语言有所不同,熟悉编程环境需要时间。感觉上机期间,同时需要熟悉环境、设计算法、编写程序和调试程序是很有压力的。所以可以考虑在正式编程前增加一次实验。 2、 可以考虑设计一些更加有趣的题目。本次需要编写的两个程序有些枯燥,不妨再生动些。 3、 是够可以考虑使用类似C语言学习时的moodle系统,可以同时减轻老师和学生的负担。而且实现了在寝室中可以随时编写程序。避免到上机时猝不及防。 备1. 实验一程序: assume ds:data, cs:code 注 data segment count dw 7 array dw 1, 2, -7, 4, -5, 6, 3 maxv dw 0 maxd dw 0 data ends code segment start: mov ax, data mov ds, ax mov cx, count mov bx, offset array mov ax, 0 loop1: mov dx, [bx] cmp dx, 0 jg nneg neg dx ;取反 nneg: cmp dx, ax jl nupdate mov ax, dx mov dx, [bx] mov maxv, dx mov maxd, bx nupdate: add bx, 2 loop loop1 mov ax, 4c00h int 21h code ends end start 2. 实验二程序: COUNT db 5 dup (0) DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: 备注 DATAS SEGMENT COUNT db 5 dup (0) DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: push ds sub ax,ax push ax MOV AX,DATAS MOV DS,AX next: mov ah,01h int 21h cmp al,'1' jz bijiao1 cmp al,'2' jz bijiao2 cmp al,'3' jz bijiao3 cmp al,'4' jz bijiao4 cmp al,'5' jz bijiao5 jmp exit bijiao1: mov cl,COUNT add cl,1 mov COUNT[0],cl jmp next bijiao2: mov bx,1 mov cl,COUNT[bx] add cl,1 mov COUNT[bx],cl jmp next bijiao3: mov bx,2 mov cl,COUNT[bx] add cl,1 mov COUNT[bx],cl jmp next 备注 bijiao4: mov bx,3 mov cl,COUNT[bx] add cl,1 mov COUNT[bx],cl jmp next bijiao5: mov bx,4 mov cl,COUNT[bx] add cl,1 mov COUNT[bx],cl jmp next exit: mov dl,COUNT[0] add dl,30h mov ah,02 int 21h mov dl,COUNT[1] add dl,30h mov ah,02 int 21h mov dl,COUNT[2] add dl,30h mov ah,02 int 21h mov dl,COUNT[3] add dl,30h mov ah,02 mov dl,COUNT[4] add dl,30h mov ah,02 int 21h int 21h mov ah,4ch int 21h CODES ENDS END START 80X86汇编语言程序设计课内实验报告 班级 姓名 实验内容概述 计算机26 实验时间 2014-5-19 石磊 学号 2120505140 实验一 子程序及 DOS/BIOS 调用程序设计 题6.9 设有10 个学生的成绩分别是76,69,84,90,73,88,99,63,100 和80 分。 试编制一个子程序统计60~69 分,70~79 分,80~89 分,90~99 分和100 分的人数并分别存放到S6, S7, S8, S9 和S10 单元中。 实验二 高级汇编语言技术 题7.11 试编写一段程序,完成以下功能:若给定名为X 的字符串长度大于5 时,下列指令将汇编10 次。 ADD AX, AX (要求:使用条件汇编,编译过程中生成LST 文件,查看宏展开情况) 实验三 输入输出程序设计 编写程序,使类型1CH 的中断向量指向中断处理程序COUNT,COUNT 统计1CH 中断次数并存入单元M 中。 实验四 BIOS 和DOS 中断 题9.2 编写一个程序,接收从键盘输入的10 个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用XLAT 指令变换)存入内存缓冲区BUFFER。 加密表为: 输入数字: 0,1,2,3,4,5,6,7,8,9 密码数字: 7,5,9,1,3,6,8,0,2,4 实验步骤 第一题: 在主程序中调用子函数count,完成将每个在数组mark里的成绩一一取出,分别判定其大小而放入统计60~69 分,70~79 分,80~89 分,90~99 分和100 分的人数的S6, S7, S8, S9 和S10 单元中,在屏幕上依次显示出S6, S7, S8, S9 和S10中的数。 第二题: 使用条件汇编和重复汇编。判断当给定名为X 的字符串长度大于5 时,重复 ADD AX, AX 10 次。 第三题: 使类型1CH 的中断向量指向中断处理程序COUNT,COUNT中 1CH 中断每调用一次则给num加一,计算出num最后的值后存入单元M 中。 第四题: 接收从键盘输入的10 个十进制数字,输入回车符则停止输入, 在bx里存入数组7,5,9,1,3,6,8,0,2,4的符号地址,每键入一个数后都存入al,调用xlat使得(al)<—((al)+(bx)) al中为译码后的数,存入string并一次输出所有的数。 实验中遇到的无 问题及其解决方法 实验结果 建议 备注 见下页 无 源代码和截图见下页 程序一 程序代码: SSEG SEGMENT PARA STACK 'stack' ary dw 100h dup(0) SSEG ENDS DATA SEGMENT sum dw 10 mark dw 76,69,84,90,73,88,99,63,100,80 S6 db 0 S7 db 0 S8 db 0 S9 db 0 S10 db 0 DATA ENDS CODE SEGMENT assume cs:CODE, ds:DATA, ss:SSEG MAIN PROC FAR call near ptr count MAIN ENDP mov ax, 4c00h int 21h mov ah,1 int 21h mov ax, data mov ds, ax push ds sub ax,ax push ax count proc near push ax push cx push bx push si lea si, mark mov cx,sum xor ax,ax MOV BX,SI COMPARE: MOV AX,[BX] CMP AX,60 JL EXIT CMP AX,70 JL SIX CMP AX,80 JL SEVEN CMP AX,90 JL EIGHT CMP AX,100 JNE NINE INC S10 JMP NEWDATA SIX: INC S6 JMP NEWDATA SEVEN: INC S7 JMP NEWDATA EIGHT: INC S8 JMP NEWDATA NINE: INC S9 NEWDATA: ADD BX,2 LOOP COMPARE PRINT: MOV DL,AL MOV AL,S6 ADD AL,30H MOV AH,2 INT 21H MOV AL,S7 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H MOV AL,S8 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H MOV AL,S9 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H MOV AL,S10 ADD AL,30H MOV DL,AL EXIT:mov ax, 4c00h int 21h POP SI pop bx pop cx MOV AH,2 INT 21H pop ax count endp CODE ENDS END MAIN 截图: 程序二 程序代码: SSEG SEGMENT PARA STACK 'stack' DSEG SEGMENT a dw ? ary dw 100h dup(0) SSEG ENDS DSEG ENDS CSEG SEGMENT assume cs:CSEG, ds:DSEG, ss:SSEG MAIN PROC FAR push ds push ax mov ax, dseg mov ds, ax mov ax,1 x db 'asjfdddkahd' cnt equ $-x if cnt gt 5 rept 10 add ax,ax endm endif mov ah,1 int 21h mov ax, 4c00h int 21h MAIN ENDP CSEG ENDS END MAIN 截图: 程序三 程序代码: DATAS SEGMENT NUM Db 0 M Db 0 DATAS ENDS STACKS SEGMENT stack db 100 dup(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AL,1CH MOV AH,35 INT 21H PUSH ES PUSH BX PUSH DS MOV AX, SEG COUNT MOV DS, AX MOV DX, OFFSET COUNT MOV AL, 1CH MOV AH,25 INT 21H mov dl,M POP DX POP DS MOV AH,1CH MOV AH,25 INT 21H MOV AX,4C00H INT 21H COUNT PROC NEAR PUSH CX push ds push ax mov ax,datas mov ds,ax INC NUM mov al,num mov M,al POP CX pop ax pop ds IRET COUNT ENDP CODES ENDS END START 截图: 程序四 程序代码: Code Segment Assume CS:Code,DS:Code Output MACRO Str_Addr lea dx,Str_Addr mov ah,9 int 21h EndM Enter_CTLF proc Near push ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax ret Enter_CTLF endp Encode db '7591368024' Prompt_Str1 db 'Please input the orical code: $' Prompt_Str2 db 'The encode: $' Start: push cs pop ds push cs pop es Output Prompt_Str1 cld lea di,String mov cx,20 Read_Encode: mov ah,1 int 21h cmp al,13 jz Disp_Encode cmp al,'0' jb Read_Encode cmp al,'9' ja Read_Encode stosb loop Read_Encode Disp_Encode: mov cx,di sub cx,offset String lea si,String lea bx,Encode Encoding: lodsb and al,0fh xlat mov [si-1],al loop Encoding mov byte ptr [si],'$' call Enter_CTLF call Enter_CTLF Output Prompt_Str2 Output String Exit_Proc: mov ah,4ch int 21h String db ? Code ENDS END Start 截图: 本文来源:https://www.wddqw.com/doc/e16f15085a0102020740be1e650e52ea5518ce87.html