汇编语言实验报告 - 图文

更新时间:2024-03-15 07:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编语言 实验报告 学 号: 姓 名: 提交日期: 成 绩: 4110611 郑景卫 2012年12月27日 东北大学秦皇岛分校 计算机与通信工程学院 汇编语言 实验报告 【实验编号】实验1 【实验名用机器语言和汇编语言编程 称】 【实验目的】 1. 熟悉debug实验环境; 2. 熟悉常用debug命令的语法功能; 3. 掌握常用的程序错误分析及排除的方法; 【实验内容】 (1)使用debug,将上面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。 3 东北大学秦皇岛分校计算机与通信工程学院 第1页 指导教师: 汇编语言 实验报告 (2)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。 东北大学秦皇岛分校计算机与通信工程学院 第2页 指导教师: 汇编语言 实验报告 (3)查看内存中的内容 PC机主板上的ROM中写有一个生产日期,在内存FFF00~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。 地址C0000~FFFFF的内存为只读存储器,写入数据操作是无效的,因此出厂日期无法改变。 (4)向内存从B8100H开始的单元中填写数据, 8086的显存地址空间是A0000H~BFFFFH,其中B8000H~BFFFFH为80*25彩色字符模式显示缓冲区,当向这个地址空间写入数据时,这些数据会立即出现在显示器上。 【实验编号】实验2 【实验名汇编语言程序的编写过程 称】 【实验目的】 1.掌握汇编语言程序的编写、编译、链接、执行过程; 2.了解程序分段的目的和意义; 【实验内容】 (1)使用DEBUG,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。 东北大学秦皇岛分校计算机与通信工程学院 第3页 指导教师: 汇编语言 实验报告 ax=2000h ax=C0EAh bx=0000h bx=30F0h sp=0100h; 修改的内存单元的地址是2000:0100内容为C0FCh sp=00FE; 修改的内存单元的地址是2000:00FE内容为6021h sp=00FCh ;ax=C0FCh sp=00FE ;bx=6021 sp=0100;修改的内存单元的地址是2000:0100内容为30F0 东北大学秦皇岛分校计算机与通信工程学院 第4页 指导教师:

汇编语言 实验报告 sp=00FE,修改的内存单元的地址是2000:00FE内容为2F31 (2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:F中的内容会发生改变? 因为在debug使用T等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以,栈里就有些不是你操作的数据了。 因为如果是在中断过程中压栈是栈越界的话,在windows下的命令窗口会强制关闭的。 【实验编号】实验3 【实验目的】将下面的程序保存,生成可执行文件 【实验内容】 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: mov ax,2000h mov ss,ax mov sp,0 东北大学秦皇岛分校计算机与通信工程学院 第5页 指导教师: 汇编语言 实验报告 add sp,10 pop ax pop bx push ax push bx pop ax pop bx mov ax,4c00h int 21h CODES ENDS END START 东北大学秦皇岛分校计算机与通信工程学院 第6页 指导教师: 汇编语言 实验报告 【实验编号】实验4 【实验名称】[BX]和LOOP的使用 【实验内容】 (1)编程,向内存0:200—0:23F依次传送数据0—63。 (2)编程,向内存0:200—0:23F依次传送数据0—63,且只能使用九条指令,包括中止指令。 (3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。 【实验代码】 (1) assume cs:code code segment mov bx,20h mov ss,bx mov sp,40h mov bx,3f3eh mov cx,32 s: push bx sub bx,202h loop s;利用压栈传递数值 mov ax,4c00h int 21h code ends 东北大学秦皇岛分校计算机与通信工程学院 第7页 指导教师: 汇编语言 实验报告 end (2) assume cs:code code segment mov ax,20h mov ds,ax mov bx,0 mov cx,40h s: mov [bx],bl inc bx loop s;利用间接寻址传递数值 mov ax,4c00h int 21h code ends end (3) assume cs:code code segment mov ax, code ;将代码的段和ds关联 mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx, 18h ;需要循环十八次 s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end 【执行结果】 (1) 东北大学秦皇岛分校计算机与通信工程学院 第8页 指导教师: 汇编语言 实验报告 (2) (3) 【实验编号】实验5 【实验名称】编写、调试具有多个段的程序 【实验内容】 (1)编写code段的代码,将a段和b段的数据相加,并放入c段中。 东北大学秦皇岛分校计算机与通信工程学院 第9页 指导教师:

汇编语言 实验报告 (2)编写code段的代码,用push指令,将a段中的前八个字形数据逆序存储至b段中。 【实验代码】 (1) assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 8 dup(0) c ends code segment start:mov ax,a mov ds,ax mov di,10h mov si,20h mov cx,8 mov bx,0 s:mov al,[bx] add al,[bx+di] mov [bx+si],al inc bx loop s;循环取值计算并存入内存中 mov ax,4c00h int 21h code ends end start (2) assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start:mov ax,a mov ds,ax mov ax,b 东北大学秦皇岛分校计算机与通信工程学院 第10页 指导教师: 汇编语言 实验报告 mov ss,ax mov sp,16 mov cx,8;只传递八个数值 mov bx,0 l:push ds:[bx] add bx,2 loop l;利用压栈传递数值 mov ax,4c00h int 21h code ends end start 【执行结果】 (1) 东北大学秦皇岛分校计算机与通信工程学院 第11页 指导教师: 汇编语言 实验报告 (2)【实验编号】实验6 【实验名称】实践课程中的程序 【实验内容】 编程,完成问题7.9 问题7.9:编程,将datasg段中的每个单词前四个字母改写为大写。 【实验代码】 assume cs:code,ss:stack,ds:data stack segment dw 8 dup (0) stack ends data segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' data ends code segment start:mov ax,data mov ds,ax mov bx,stack mov ss,bx mov sp,16 mov cx,4 d:push cx;双重循环需要保存外围的cx mov cx,4 mov bx,3 s:mov dl,[bx] 东北大学秦皇岛分校计算机与通信工程学院 第12页 指导教师: 汇编语言 实验报告 and dl,11011111b;利用and将小写转换为大写 mov [bx],dl inc bx loop s inc ax mov ds,ax pop cx;取出外围的循环次数 loop d mov ax,4c00H int 21H code ends end start 【执行结果】 【实验编号】实验7 【实验名称】寻址方式在结构化数据访问中的应用 【实验内容】 编程,将data段中的数据按格式写入table段中,并且计算21年中的人均收入(取整),结果也按照格式保存入table段。 【实验代码】 assume cs:code data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985' db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 东北大学秦皇岛分校计算机与通信工程学院 第13页 指导教师: 汇编语言 实验报告 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8826 dw 11542,14430,15257,17800 data ends table segment db 21 dup ('year summ ne ?? ') table ends code segment start:mov ax,data mov ds,ax mov ax,table mov es,ax mov bx,0 mov bp,0 mov di,21*4 mov si,21*8 mov cx,21 s:mov ax,ds:[bx] mov dx,ds:[bx+2] mov es:[bp],ax mov es:[bp+2],dx add bp,16 add bx,4 loop s;第一个循环,传送年份 mov cx,21 mov bp,5 s2:mov ax,ds:[di] mov dx,ds:[di+2] mov es:[bp],ax mov es:[bp+2],dx div word ptr ds:[si];计算平均值 mov dx,ds:[si] mov es:[bp+5],dx mov es:[bp+8],ax add bp,16 add di,4 add si,2 loop s2;第二个循环,传送其他值 mov ax,4c00h int 21h code ends end start 【执行结果】 东北大学秦皇岛分校计算机与通信工程学院 第14页 指导教师:

汇编语言 实验报告 【实验编号】实验9 【实验名称】根据材料编程 【实验内容】 编程,在屏幕中间分别显示绿色、绿底白色、白底蓝色的字符串‘welcome to masm!’ 【实验代码】 assume cs:code data segment db 'welcome to masm!' data ends code segment start:mov ax,data mov ds,ax mov bx,0 mov ax,0b850h mov es,ax mov bp,10 mov cx,16 mov al,00000010b s:mov ah,[bx] mov es:[bp],ah mov es:[bp+1],al inc bx add bp,2 loop s;第一行 mov cx,16 东北大学秦皇岛分校计算机与通信工程学院 第15页 指导教师: 汇编语言 实验报告 mov bx,0 add bp,64*2 mov al,00100100b;改变属性 s2:mov ah,[bx] mov es:[bp],ah mov es:[bp+1],al inc bx add bp,2 loop s2;第二行 mov cx,16 mov bx,0 add bp,64*2 mov al,01110001b;改变属性 s3:mov ah,[bx] mov es:[bp],ah mov es:[bp+1],al inc bx add bp,2 loop s3;第三行 mov ax,4c00h int 21h code ends end start 【执行结果】 【实验编号】实验10 【实验名称】编写子程序 【实验内容】 (1)显示字符串:在指定的位置用指定的颜色,显示一个以0结束的字符串。 参数:dh:行号,dl:列号,cl:颜色,ds:si指向字符串首地址。 (2)解决除法溢出:编写一个不会溢出的除法运算,被除数dword型,除数word型,结果为dword型。 东北大学秦皇岛分校计算机与通信工程学院 第16页 指导教师: 汇编语言 实验报告 参数:ax:低十六位,dx:高十六位,cx:除数。 返回:dx:高十六位,ax:第十六位,cx:余数。 (3)数值显示:编程,将data段的数据以十进制方式显示出来。 子程序:将word型数据变为十进制数的字符串,以0为结尾符。 【实验代码】 (1) assume cs:code data segment db 'welcome to masm!',0 data ends code segment start: mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 call showstr;调用子程序 mov ax,4c00h int 21h showstr: push ax push es push bp push bx mov ax,0b800h mov es,ax mov al,80*2 mul dh mov bp,ax mov ah,0 mov al,dl add bp,ax add bp,ax mov ah,cl mov bx,0 s:mov al,[bx] cmp al,0 je e;判断是否传送完毕 mov es:[bp],al 东北大学秦皇岛分校计算机与通信工程学院 第17页 指导教师: 汇编语言 实验报告 mov es:[bp+1],ah inc bx add bp,2 jmp s;循环传送 e:pop bx pop bp pop es pop ax ret code ends end start (2) assume cs:code code segment start: mov ax,4240h mov dx,000fh mov cx,0ah call divdw;调用子程序 mov ax,4c00h int 21h divdw: push si push di push bx mov si,ax ;低位 mov ax,dx mov dx,0 div cx ;高位除法 mov di,ax ;高位除得商 mov ax,si ;高位除得余数 div cx mov cx,dx ;第二块的余数 mov dx,di ;第一块商=高位,第二块商=低位 pop bx pop di pop si ret (3) assume cs:code data1 segment dw 123,12666,1,8,3,38 东北大学秦皇岛分校计算机与通信工程学院 第18页 指导教师: 汇编语言 实验报告 data1 ends data2 segment db 16 dup (0) data2 ends code segment start: mov ax,data1 mov es,ax mov ax,data2 mov ds,ax mov si,0 mov di,0 mov cx,6 s: mov ax,es:[di] call dtoc;调用子程序,产生字符串 add di,2 loop s mov dh,8 mov dl,5 mov cl,2h mov si,0 call showstr;显示数字 mov ax,4c00h int 21h dtoc: push cx push dx push bx mov bx,0 l: mov dx,0 mov cx,0ah call divdw;防止产生溢出,使用之前编写的除法 add cl,30h push cx inc bx cmp ax,0 jne l mov cx,bx spop:pop bx mov ds:[si],bl inc si loop spop;调整顺序 mov ds:[si],cl 东北大学秦皇岛分校计算机与通信工程学院 第19页 指导教师:

汇编语言 实验报告 inc si pop bx pop dx pop cx ret showstr:;之前的子程序 push ax push es push bp push bx mov ax,0b800h mov es,ax mov al,80*2 mul dh mov bp,ax mov ah,0 mov al,dl add bp,ax add bp,ax mov ah,cl mov bx,0 s4:mov al,[bx] cmp al,0 je e mov es:[bp],al mov es:[bp+1],ah inc bx add bp,2 jmp s4 e:pop bx pop bp pop es pop ax ret divdw:;之前的子程序 push si push di push bx mov si,ax mov ax,dx mov dx,0 div cx mov di,ax mov ax,si div cx 东北大学秦皇岛分校计算机与通信工程学院 第20页 指导教师: 汇编语言 实验报告 mov cx,dx mov dx,di pop bx pop di pop si ret code ends end start 【执行结果】 (1) (2) 东北大学秦皇岛分校计算机与通信工程学院 第21页 指导教师: 汇编语言 实验报告 (3) 【实验编号】实验11 东北大学秦皇岛分校计算机与通信工程学院 第22页 指导教师: 汇编语言 实验报告 【实验名称】编写子程序 【实验内容】编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字符转换为大写。 子程序:名称:letterc, 功能:将以0结尾的字符串中的小写字母转换为大谢字母, 参数;ds:si指向字符首地址。 【实验代码】 assume cs:codesg datasg segment db \ datasg ends codesg segment begin: mov ax,datasg mov ds,ax mov si,0 call letterc mov ax,4c00h int 21h ;子程序 letterc:push si let: cmp byte ptr [si],0 ;和0进行比较 je let0 cmp byte ptr [si],61h jb let1 ;低于60h继续循环 cmp byte ptr [si],86h ja let1 ;高于86h继续循环 and byte ptr [si],11011111b ;利用and转为大写 let1: inc si jmp let let0: pop si ret codesg ends end begin 【执行结果】 东北大学秦皇岛分校计算机与通信工程学院 第23页 指导教师: 汇编语言 实验报告 【实验编号】实验12 【实验名称】编写0号中断的处理程序 【实验内容】编写0号中断的处理程序,当除法溢出发生,在屏幕中间显示“divide error!”,并返回DOS。 【实验代码】 assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0 mov ax,0 mov es,ax mov di,200h mov cx,offset do0end-offset do0 cld rep movsb;传送完毕 mov ax,0 mov es,ax mov word ptr es:[0*4],200h mov word ptr es:[0*4+2],0 ;设置中断向量表 mov ax,0ffffh mov bl,01h div bl;测试 东北大学秦皇岛分校计算机与通信工程学院 第24页 指导教师:

汇编语言 实验报告 do0: jmp short do0start db 'divide error!' do0start:mov ax,cs mov ds,ax mov si,202h;设置ds:si指向字符串 mov ax,0b800h mov es,ax mov di,12*160+34*2 ;设置es:di指向显存空间的中间位置 mov cx,13 ;设置cx为字符串长度 s: mov al,[si] mov es:[di],al inc si add di,2 loop s mov ax,4c00h int 21h;中断中直接结束程序而不返回 do0end: nop code ends end start 【执行结果】 东北大学秦皇岛分校计算机与通信工程学院 第25页 指导教师: 汇编语言 实验报告 实验编号13.1 【实验目的】编写并安装int7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。 【实验内容】 DATAS SEGMENT db\,0 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: mov ax,cs mov ds,ax mov si,offset show mov ax,0 mov es,ax mov di,200h mov cx,offset showend-offset show cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 mov dh,10 mov dl,10 mov cl,2 mov ax,datas mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h show:mov bx,10*160 add bx,10*2 s :mov ch,ds:[si] mov cl,0 东北大学秦皇岛分校计算机与通信工程学院 第26页 指导教师: 汇编语言 实验报告 jcxz ok mov cl,2 mov ax,0b800h mov es,ax mov es:[bx],ch mov es:[bx+1],cl inc si add bx,2 jmp s ok:iret mov ax,4c00h int 21h showend:nop CODES ENDS END START 【实验编号】实验13.2 【实验名称】编写、应用中断例程 东北大学秦皇岛分校计算机与通信工程学院 第27页 指导教师: 汇编语言 实验报告 【实验内容】 (1)编写并安装int 7ch中断,功能为显示一个用0结束的字符串,安装于0:200处。 参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址。 (2)编写并安装int 7ch中断,功能为完成loop指令的功能。 参数:cx=循环次数,bx=位移。 应用:在屏幕中间显示80个‘!’。 【实验代码】 (1) assume cs:code data segment db 'welcome to masm!',0 data ends code segment start: mov ax,cs mov ds,ax mov si,offset show_str mov ax,0 mov es,ax mov di,200h mov cx,offset show_strend-offset show_str cld rep movsb ;传送完成 mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量 mov dh,10 mov dl,10 mov cl,2 mov ax,data mov ds,ax mov si,0 int 7ch ;测试 mov ax,4c00h int 21h 东北大学秦皇岛分校计算机与通信工程学院 第28页 指导教师: 汇编语言 实验报告 show_str:push ax push bx push es push si mov ax,0b800h mov es,ax mov ax,160 mul dh mov bx,ax mov ax,2 mul dl add bx,ax ;设置es:bx指向显存首地址 mov al,cl ;把颜色cl赋值al mov cl,0 show0: mov ch,[si] jcxz show1 ;(ds:si)=0时,转到show1执行 mov es:[bx],ch mov es:[bx+1],al inc si ;ds:si指向下一个字符地址 add bx,2 ;es:bx指向下一个显存地址 jmp show0 show1: pop si pop es pop bx pop ax iret mov ax,4c00h int 21h show_strend:nop code ends end start (2) assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpend-offset lp cld rep movsb ;传送完成 mov ax,0 mov es,ax 东北大学秦皇岛分校计算机与通信工程学院 第29页 指导教师:

汇编语言 实验报告 mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量 mov ax,0b800h mov es,ax mov di,160*12 mov bx,offset s-offset se ;设置从标号se到标号s的转移位移 mov cx,80 s: mov byte ptr es:[di],'!' add di,2 int 7ch ;执行loop! se: nop mov ax,4c00h int 21h lp:push bp mov bp,sp dec cx jcxz lpret add [bp+2],bx lpret: pop bp iret lpend:nop code ends end start 【执行结果】 (1) (2) 【实验名称】 实验编号13.3 编写,应用中断例程 东北大学秦皇岛分校计算机与通信工程学院 第30页 指导教师: 汇编语言 实验报告 【实验目的】下面的程序,分别在屏幕的第2,4,6,8行显示4句英文诗,补全程序。 【实验内容】 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS s1: db 'Good,better,best,','$' s2: db 'Never let it rest,','$' s3: db 'Till good is better,','$' s4: db 'And better,best.','$' s: dw offset s1,offset s2,offset s3,offset s4 row: db 2,4,6,8 START:mov ax,cs mov ds,ax mov bx,offset s mov si,offset row mov cx,4 ok:mov bh,0 mov dh,[si] mov dl,0 mov ah,2 int 10h mov dx,[bx] mov ah,9 int 21h inc si add bx,2 loop ok mov ax,4c00h int 21h CODES ENDS END START 编译器出现问题,不知道咋解决,老师。 东北大学秦皇岛分校计算机与通信工程学院 第31页 指导教师: 汇编语言 实验报告 东北大学秦皇岛分校计算机与通信工程学院 第32页 指导教师:

本文来源:https://www.bwwdw.com/article/u918.html

Top