合肥工业大学2021汇编语言程序设计上机实验一

实验一  基本汇编程序设计

  • 实验目的

1、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程;

2、掌握基本汇编语言程序设计方法。

3、熟悉DOSBOX下运行dos程序方法;

4、熟悉debug调式程序的基本方法;

  • 实验内容

1、数据段中X、Y、Z、V均为字变量,存放的是16位带符号数。编写汇编语言程序计算表达式值(V–(X*Y+Z-720))/X。要求:

(1)使用MASM和LINK生成可执行程序后,使用Debug装入内存;

(2)使用U、D命令查看代码段和数据段的内容,特别注意变量在代码段中的形式;使用G命令执行代码,并查看结果;

(3)用E命令修改各个命令的内容,再次用G命令执行。

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

(1)使用地址表实现分支功能,在分支中输出提示信息;

(2)程序直接执行,不需要再使用debug。

3、编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字数),要求:

(1)输入参数通过堆栈传送,输出参数通过AX传送;

(2)结果需要输出到屏幕上。

  • 实验过程和程序

1:

详细过程:由题目中“字变量”和“带符号数”的条件,所以在定义数据段时,为X、Y、Z、V分配一个字的空间;然后定义res和rem这两个字单元用来分别存放运算结果的整数部分和小数部分。分别对X、Y、Z、V赋初值或是在DEBUG环境下通过E命令修改初值,如此就可以用不同的数据来验证程序。在有符号数运算中,乘法运算的乘数是字类型,被乘数默认是AX中的内容,得到结果为(DX,AX);除法运算的除数同样也是字类型,除数默认为(DX,AX),但不同的是需要对被除数进行扩展,也就是cwd。最后将结果的整数部分存入res单元中,余数存入rem单元中。

源程序:

stack	segment stack
dw 512	dup(?)
stack	ends
data	segment;在数据段定义数据
		x dw 0001h 
		y dw 0002h
		z dw 0003h 	
		v dw 0004h
		res dw ?
		rem dw ?
data	ends
code	segment ;(V–(X*Y+Z-720))/X
assume	cs:code,ds:data,ss:stack
start:	mov ax,data;把data赋给给ax							
		mov ds, ax;把数据转到数据段寄存器
		mov ax,x
		imul y
		mov cx,ax
		mov bx,dx
		mov ax,z
		cwd
		add cx,ax
		adc bx,dx;x*y+z
		sub cx,720
		sbb bx,0;x*y+z-720
		mov ax,v
		cwd
		sub ax,cx
		sbb dx,bx;(V–(X*Y+Z-720))
		idiv x;(V–(X*Y+Z-720))/X
		mov res,ax;把结果整数部分存放在res单元中
		mov rem,dx;把结果余数部分存放在rem单元中

		mov ah,4ch
		int 21h
code	ends
		end start

2:

详细过程:实验二要求我们使用地址表实现分支功能,并在分支中输出提示信息,所以需要在定义数据段时,使用字单元,实现n号分支地址=入口地址表首地址+n *2;然后题目要求检查bl这八位二进制数中哪一位为1,我想到了使用test命令,在al中放置00000001b,与bl进行test,得到结果便跳转到地址表中相应的提示信息,否则将al左移,继续进行test,直到得到结果。

源程序:

stack	segment stack
dw 512	dup(?)
stack	ends
data	segment;在数据段定义数据
		address dw L1,L2,L3,L4,L5,L6,L7,L8;地址表
		string1 db 'The 1 Bit is 1 $'
		string2 db 'The 2 Bit is 1 $'
		string3 db 'The 3 Bit is 1 $'
		string4 db 'The 4 Bit is 1 $'
		string5 db 'The 5 Bit is 1 $'
		string6 db 'The 6 Bit is 1 $'
		string7 db 'The 7 Bit is 1 $'
		string8 db 'The 8 Bit is 1 $'
		string9 db 'No bit is 1 $'
data	ends
code	segment
assume	cs:code,ds:data,ss:stack
start:	mov ax, data;把data赋给给ax							
		mov ds, ax;把数据转到数据段寄存器
		mov al,00000001B
		mov si,0
		mov bl,00000100B;设置bl
		cmp bl,0
		jz error
		mov cx,8
again:
		test bl,al
		jz next
		jmp address[si]
next:
		shl al,1
		add si,2;指向下一地址
		loop again
L1:
		mov dx,offset string1
		jmp print
L2:
		mov dx,offset string2
		jmp print
L3:
		mov dx,offset string3
		jmp print
L4:
		mov dx,offset string4
		jmp print
L5:
		mov dx,offset string5
		jmp print
L6:
		mov dx,offset string6
		jmp print
L7:
		mov dx,offset string7
		jmp print
L8:
		mov dx,offset string8
		jmp print
error:
		mov dx,offset string9
		mov ah,09h
		int 21h
print:
		mov ah,09h
		int 21h

		mov ah,4ch
		int 21h
code	ends
		end start

3:

详细过程:实验三要求编写子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字数),

因为是有符号数,所以先定义DW类型的x、y、z;而后题目要求输入参数通过堆栈传送,输出参数通过AX传送,所以先分别定义两个子程序input和output实现输入和输出;调用输入子程序input,从键盘输入x、y,得到x、y后通过堆栈传送到计算子程序计算后得到结果在ax,最后调用输出子程序将ax中的结果输出到屏幕上。

源程序:

stack	segment stack
		dw 512	dup(?)
stack	ends
data	segment;在数据段定义数据
		x dw 0 
		y dw 0
		z dw 0
		mes1 db 'Please input x: $';,0dh,0ah,'$'
		mes2 db 'Please input y: $';,0dh,0ah,'$'
		mes3 db 'The result is: $';,0dh,0ah,'$'
data	ends
code	segment ;z=f(x,y)=x*y+x-y
assume	cs:code,ds:data,ss:stack
start:	mov ax,data;把data赋给给ax							
		mov ds,ax;把数据转到数据段寄存器

        mov ah,09h
       	mov dx,offset mes1;提示输入
        int 21h
				
		call input
		mov x,ax;输入x

		mov ah,09h
       	mov dx,offset mes2;提示输入
        int 21h

		call input
		mov y,ax;输入y

		;计算
		push x
		push y
		call fun

		mov z,ax
		mov ah,09h
        mov dx,offset mes3
        int 21h
		mov ax,z
		call output
		jmp done

fun	proc near
		push bp
		mov bp,sp
		push bx
		push cx
		
		mov cx,[bp+6];提取x
		mov bx,[bp+4];提取y

		mov ax,cx
		imul bx;x*y
		add ax,cx;x*y+x
		sub ax,bx;x*y+x-y

		pop cx
		pop bx
		pop bp
		
		ret 4
fun	endp

input proc near
		push bx
        push cx
        push dx
		xor bx,bx;bx保存结果
		xor cx,cx;cx为正负标志,0为正,1为负
		mov ah,1;输入一个字符
		int 21h
		cmp al,'+';是“+”,继续输入字符
		jz input1
		cmp al,'-';是“-”
		jnz input2
		mov cx,-1;设置-1标志
input1:
		mov ah,1
		int 21h
input2:
		cmp al,'0';不是0~9之间的字符,则输入数据结束
		jb input3
		cmp al,'9'
		ja input3
		sub al,30h;是0~9之间的字符,则转换为二进制数
		
		shl bx,1;利用移位指令,实现数值乘10:BX<-BX*10
		mov dx,bx
		shl bx,1
		shl bx,1
		add bx,dx
		mov ah,0
		add bx,ax;已输入数值乘10后,与新输入数值相加
		jmp input1;继续输入字符
input3:
		cmp cx,0;是负数,进行求补
		jz input4
		neg bx
input4:
		mov ax,bx;设置出口参数
		pop dx
		pop cx
		pop bx
		ret;子程序返回

output proc near
        push ax
        push bx
        push dx
        test ax,ax
        jnz output1
        mov dl,'0'
        mov ah,2
        int 21h
        jmp output5
output1:
		jns output2
        mov bx,ax
        mov dl,'-'
        mov ah,2
        int 21h
        mov ax,bx
        neg  ax
output2:
		mov bx,10
        push bx
output3:
		cmp ax,0
        jz output4
        sub dx,dx
        div bx
        add dl,30h
        push dx
        jmp output3
output4:
		pop dx
        cmp dl,10
        je output5
        mov ah,2
        int 21h
        jmp output4
output5: 
		pop dx
        pop bx
        pop ax
        ret

done:	
		mov ah,4ch
		int 21h
code	ends
		end start
  • 实验结果(包括必要的截图)

1:

将程序装入debug

合肥工业大学2021汇编语言程序设计上机实验一_第1张图片

合肥工业大学2021汇编语言程序设计上机实验一_第2张图片

 分别使用u、d、g 命令:

合肥工业大学2021汇编语言程序设计上机实验一_第3张图片

合肥工业大学2021汇编语言程序设计上机实验一_第4张图片

合肥工业大学2021汇编语言程序设计上机实验一_第5张图片

x=1,y=2,z=3,v=4

使用d命令查看结果:结果为02 CF,正确

合肥工业大学2021汇编语言程序设计上机实验一_第6张图片

e命令修改x=20 ,y=30,z=10,v=60 后g命令执行

然后d命令查看,如图所示,结果为FF E9,正确

合肥工业大学2021汇编语言程序设计上机实验一_第7张图片

 2:

 合肥工业大学2021汇编语言程序设计上机实验一_第8张图片

 3:

合肥工业大学2021汇编语言程序设计上机实验一_第9张图片

  • 实验体会
  1. 加深了我对汇编语言中算数运算指令的理解与掌握,特别是imul:对于两个有符号字相乘ax存低16位,dx存高16位,且默认目的操作数为ax,8进制相乘默认操作数为al 结果传ax;对于除法:两个16进制字相除,其商存于低16位ax,其余数存高16位dx,且默认目的操作数为ax,只需一个源操作数r16,字节相除默认操作数为ax,商传 al,余数存ah,需一个r6。
  2. 我了解了如何使用地址表和转移表,并且通过实现地址表与转移表加深了对汇编寻址方式的了解。
  3. 加强了我对子程序的认识,对子程序压栈传参数过程中,栈中的变化更加深刻,far段间压栈系统压入 cs:ip,段内near则默认压入ip,在传参取相应的栈中的数据时,要注意数据地址和sp的相对位置,压栈入栈只针对r16和mem16。可将bp压栈并将sp赋值给bp,利用[bp+x]获取相应的栈内的数据的值,最后程序需要保护现场,顺序压栈,逆序出栈;平衡堆栈,可以利用子程序中ret相应的压入数据的字节数总和,或者主程序执行call后add sp,n(相应的压入数据的字节数总和)。

其他实验:

合肥工业大学2021汇编语言程序设计上机实验二https://blog.csdn.net/qq_52791068/article/details/122703830

你可能感兴趣的:(汇编语言程序设计,反汇编)