合肥工业大学汇编语言程序设计实验报告 - 图文

更新时间:2024-06-11 16:01:01 阅读量: 综合文库 文档下载

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

合肥工业大学 计算机与信息学院

实验报告

课 程:汇编语言程序设计

专业班级:

学 号:

姓 名:

实验一 Debug程序的使用

一. 实验目的

1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。 2、掌握8086/8088的寻址方式及多字节数据的处理方法。

二. 实验内容

实验内容:

1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。

2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。

实验要求:

本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。

三. 实验过程和程序

1、启动DOS操作系统

2、运行DEBUG.COM程序(若当前盘为C) C:>DEBUG↙ – ;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)

3、用“A”命令编辑和汇编源程序 –A ↙

186E:0100 MOV AX,[0200]↙ 186E:0103 MOV BX,[0202]↙ 186E:0107 ADD AX,[0204]↙ 186E:010B ADC BX,[0206]↙ 186E:010F MOV [0208],AX↙ 186E:0112 MOV [020A],BX↙ 186E:0116 ↙

4、用“U”命令反汇编验证源程序 –U CS:0100↙

186E:0100 A10002 MOV AX,[0200] 186E:0103 8B1E0202 MOV BX,[0202] 186E:0107 03060402 ADD AX,[0204] 186E:010B 131E0602 ADC BX,[0206] 186E:010F A30802 MOV [0208],AX 186E:0112 891E0A02 MOV [020A],BX

186E:0116 注意:

1)检查源程序是否有错误,若有则返回到第3步用“A 地址”命令进行修改,直到程序无错误。

2)DEBUG约定在其命令或源程序中所涉及到的数据均被看作十六进制数,其后不用“H”说明。

3)在DEBUG下,源程序中不能使用“标号”、“变量”和一些伪指令。

4)在DEBUG下,大小写不敏感。

5、程序未执行前,用“R”命令观察,相关寄存器的内容。

–R↙

如:(AX)= 0000H,(BX)= 0000H,(SI)= 0000H, (DI)= 0000H,(CS)= 13F5H,(IP)= 0100H。

6、在程序未执行前,用“D”命令观察DS:0200H,DS:0204H、DS:0208H单元的内容

–D 200 20B ↙

7、用“G”命令运行源程序 –G =100 0116 ↙

8、再用“D”命令观察DS:0200H~DS:020BH字节单元中的内容 –D 200 20B↙

9、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄

器内容的变化,并与预计的结果相比较。

注意:D命令显示内存数据,注意观察多字节数据在内存中的存放方式。 指令执行的时。

程序运行结果:(AX)= 1110H ,(BX)= 1111H

DS:0208H四字节单元的内容: 11111110H 四. 实验结果(包括必要的截图)

五. 实验体会

通过这次实验的练习,我熟悉了在DEBUG的环境下,汇编程序中的命令,并且学会调试运行汇编语言源程序,掌握8086/8088的寻址方式及多字节数据的处理方法。虽然自己动手实现了简单的计算的中间出现了很多错误,但是在查阅书本以及在老师和同学的帮助下完成了实验任务。

实验二 汇编语言程序设计(顺序、循环)

一. 实验目的

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’)。

三. 实验过程和程序 1)data segment

x dw 1 y dw 0 z dw 0 v dw 0 sum1 dw ? sum2 dw ? data ends code segment

assume cs:code,ds:data start:

mov ax,data mov ds,ax mov ax,x imul y mov cx,ax mov bx,dx mov ax,z cwd

add cx,ax adc bx,dx sub cx,720 sbb bx,0 mov ax,v cwd

sub ax,cx sbb dx,bx idiv x

mov sum1,ax

mov sum2,dx mov ax,4c00h int 21h

code ends end start 2data segment

grade dw 98,98,96,95,94,93,87,86,85,97,86 data ends code segment

assume cs:code,ds:data start:

mov ax,data mov ds,ax xor ax,ax mov cx,11

mov bx,offset grade

loop1: add ax,[bx] inc bx inc bx loop loop1 mov cx,11 idiv cx

mov bx,ax mov ax,4c00h int 21h Code ends end start 3)DATA SEGMENT

BUF DB 50, ?, 50 DUP(24H) CHAR DB 0AH,0DH,\DATA ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATA START:

MOV AX,DATA MOV DS,AX

MOV AH,10 LEA DX,BUF INT 21H

LEA DX,CHAR MOV AH,9 INT 21H

LEA DX,BUF+2 MOV AH,9 INT 21H

MOV AH,4CH INT 21H

四.实验结果(包括必要的截图)

五.实验体会

通过这次实验的练习,我掌握了顺序和循环程序结构和设计方法,并且可以自己动手在debug下运用顺序和循环的程序结构自己设计汇编的代码,另外这节课我还学会了在在屏幕上输入和输出字符串,非常的有趣,顺便我又熟悉了一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程,感觉收获颇丰。挺高了自己对于学习汇编的兴趣。

实验三 汇编语言子程序设计(分支、子程序)

一. 实验目的

1、掌握分支和子程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。 3、通过汇编语言了解高级语言的参数传递等知识。

二. 实验内容

1、1. BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。

2. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。 3. 实践C?Asm的转换过程。

三. 实验过程和程序 1.

;实验三 第一题 DATA SEGMENT

;定义提示信息msg,msgi分别代表第i字节出为1 msg1 db'the 1 bit is 1',0dh,0ah,'$' msg2 db'the 2 bit is 1',0dh,0ah,'$' msg3 db'the 3 bit is 1',0dh,0ah,'$' msg4 db'the 4 bit is 1',0dh,0ah,'$' msg5 db'the 5 bit is 1',0dh,0ah,'$' msg6 db'the 6 bit is 1',0dh,0ah,'$' msg7 db'the 7 bit is 1',0dh,0ah,'$' msg8 db'the 8 bit is 1',0dh,0ah,'$' DATA ENDS

STACKS SEGMENT ;未定义栈内容 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATA,SS:STACKS START: MOV AX,DATA MOV DS,AX

;程序代码部分

xor bx,bx ;用异或将bx,dx部分清零 xor dx,dx mov bl,08h ;将00001000b赋值给bl mov cx,8 ;利用loop进行8次循环 Lp1: shr bl,1 ;将bl进行逻辑右移一次 jc next ;判断CF中数据是否为1,若是跳转到next处 add dx,3 ;dx加3 loop Lp1 next: mov ah,09h

lea si,table ;将转移表的地址传入到si中 add si,dx ;得到转移表的CF为1的地方 jmp si table:

;同一个代码段内使用near跳转 jmp near ptr l1 jmp near ptr l2 jmp near ptr l3 jmp near ptr l4 jmp near ptr l5 jmp near ptr l6 jmp near ptr l7 jmp near ptr l8

;Li: 将msgi的地址传入到dx中,并跳转到done处 l1: lea dx,msg1 jmp done l2: lea dx,msg2 jmp done l3: lea dx,msg3 jmp done l4: lea dx,msg4 jmp done l5: lea dx,msg5 jmp done l6: lea dx,msg6 jmp done l7: lea dx,msg7 jmp done l8: lea dx,msg8 jmp done ;返回汇编窗口 done: int 21h MOV AH,4CH INT 21H ;代码部分结束

CODES ENDS

END START 2.DATAS SEGMENT x dw 6 y dw 8 DATAS ENDS

STACKS SEGMENT ;未定义栈部分 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX ;主程序部分

mov ax,x ;分别将x,y压栈 push ax mov ax,y push ax call f ;调用子程序f(x,y) add sp,4 pop ax pop ax ;子程序调用结束,弹栈 MOV AH,4CH INT 21H

;子程序部分 f proc push bp mov bp,sp push ax push dx push bx mov bx,[bp+4] ;bx=y mov ax,[bp+6] ;ax=x imul bx ;x*y add ax,[bp+6] ;x*y+x adc dx,0 sub ax,[bp+4] ;x*y+x-y sbb dx,0 pop bx

pop dx pop ax ret f endp

CODES ENDS

END START

四. 实验结果(包括必要的截图)

五. 实验体会

通过这次实验的练习,我掌握分支和子程序结构和设计方法,特别是地址表和转移表的运用,已经可以熟练的运用转移表和地址表进行分支结构的设计,实验二又让我对子程序参数的调用有了深刻的体会,知道了在运用堆栈进行参数传递时需要注意的要点,另外这次实验又让我再一次熟悉一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

实验四 汇编语言高级编程专题

一. 实验目的

1、汇编语言宏程序设计;

2、 掌握中断服务子程序的编写。 3、 汇编语言与高级语言的混编。

二. 实验内容

1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min

2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。 3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。 char dbyte[] = {0x34,0x45,0x56,0x67,0xaf};

三. 实验过程和程序 1;宏 min3

min3 macro x,y,z mov al,x mov bl,y mov cl,z cmp al,bl ;比较al,bl jae j1 ;bl

j5: mov ah,02h ;min bl mov dl,bl or dl,30h int 21h jmp done

done: mov ah,4ch int 21h endm

DATAS SEGMENT

;未定义数据段数据 DATAS ENDS

STACKS SEGMENT ;未定义栈段数据 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX

min3 2,1,6 ;找出2 1 6三数中最小数

MOV AH,4CH INT 21H CODES ENDS

END START 2.

DATA SEGMENT OLDISR DW ?,? TIMER DB 100 COUNTER DW 0 ISDONE DB 0 DATA ENDS

STACKS SEGMENT ;未定义 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATA,SS:STACKS

START:

MOV AX,DATA MOV DS,AX xor ax,ax MOV ES,AX xor cx,cx

MOV AX, ES:[1ch*4] MOV OLDISR[0],AX MOV AX,ES:[1ch*4+2] MOV OLDISR[2], AX

MOV WORD PTR ES:[1ch*4], OFFSET ISR MOV WORD PTR ES:[1ch*4+2],SEG ISR WAITHERE:

CMP ISDONE,1 JNZ WAITHERE EXIT:

MOV AX,OLDISR[0] MOV ES:[1ch*4],AX MOV AX,OLDISR[2]

MOV ES:[1ch*4+2],AX MOV AX,4C00H INT 21H

ISR PROC FAR PUSH DX PUSH AX

MOV AX,DATA MOV DS,AX STI

INC TIMER AGAIN:

mov ah,0bh int 21h or al,al jz j2

MOV AH,8 ;不显示输入的字符 INT 21H

CMP AL, 'a' JNE j2

MOV AH,2h MOV DL,10 INT 21H

MOV COUNTER,0 j2: CMP TIMER, 1000/55

JB DONE

MOV TIMER,0 MOV AH,2 MOV DL,13 INT 21H

j3: MOV AX,COUNTER MOV DL,10 DIV DL

MOV DH,AH MOV DL,AL MOV AH,2 ADD DL,30H INT 21H mov ah,2 mov dl,dh ADD DL,30H INT 21H

inc COUNTER cmp COUNTER,60 JNE DONE

MOV ISDONE,1 DONE: PUSHF

CALL DWORD PTR OLDISR CLI POP AX POP DX

IRET ;中断返回 ISR ENDP CODES ENDS

END START 3.

#include using namespace std; int main(){

char dbyte[]={0x34,0x45,0x56,0x67,0x67};

__asm{

mov esi,0 again: mov cl,4 ror dbyte[esi],4 inc esi cmp esi,5

jne again }

for(int i=0;i<5;i++) cout<

四. 实验结果(包括必要的截图)

五. 实验体会

这次实验的练习,使我对汇编语言中宏程序有了一定的了解,并且自己动手编写了宏程序,另外我还掌握了中断服务子程序的编写,感觉非常的复杂,很长时间找不到头绪,最后请教了老师和同学。在他们的帮助下完成了实验。虽然花了很久的时间,但是还是非常值得的。

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

Top