华科网安学院汇编程序设计实验三报告(22级)

千万不要使用盒武器!!花科人不盒花科人[doge]!!


任务1(寄存器传参):

;PREPEND BEGIN
	.model small
	.stack
	.data
	.code
start:
	mov ah, 08h
 	int 21h
 	sub al, '0'
xor ah,ah
	call ditui1
	call print_ax
;******exit******
 mov ax, 4c00h
 int 21h
;******exit******
;PREPEND END
;TEMPLATE BEGIN
;ax=n 寄存器ax传递参数   
ditui1 proc
;ditui1
;***begin****
    	push bx
   	push cx
		push dx
    	cmp al, 0	            ;先让al分别与0、1、2进行比较,若大于,
		je zero	            ;则进行递归遍历;若小于,则跳转对ah
cmp al, 1                  ;赋值
		je one    
    	cmp al, 2
		je two  
		mov dl, al		;保护al
    	sub al, 1		;对n=al-1进行递归运算
    	call ditui1
    	mov bx,ax                ;将计算得到的值存储在bx中      
    	mov al,dl
    	sub al, 2		;对n=al-2进行递归运算
		call ditui1                      
    	mov cx,ax		;将计算得到的值存储在cx中
    	mov ax,bx
		add ax,cx		;得到ditui1(al)=ditui(al-1)+ditui(al-2),存入ax
    	jmp over
zero:
    	mov ah,0
    	jmp over
one:
		mov ah,1
    	jmp over
two:
   	mov ah,2
over:   	
pop dx			;一次递归结束或整个子程序结束
   	pop cx
   	pop bx
   	ret
;****end******
ditui1 endp
;TEMPLATE END
;APPEND BEGIN
print_ax proc
	push ax	;过程中使用了AX、CX和DX
	push cx
	push dx
	push ax	;暂存ax
	mov dl,al	;转换al的高4位
	mov cl,4
	shr dl,cl
	or dl,30h	;al高4位变成3
	cmp dl,39h
	jbe aldisp1
	add dl,7	;是0Ah~0Fh,还要加上7
aldisp1:	
mov ah,2	;显示
	int 21h
	pop dx	;恢复原ax值到dx
	and dl,0fh	;转换al的低4位
	or dl,30h
	cmp dl,39h
	jbe aldisp2
	add dl,7
aldisp2:	
mov ah,2	;显示
	int 21h
	pop dx
	pop cx
	pop ax
	ret	;过程返回
print_ax endp
end start
;//APPEND END

任务2(栈传参): 

;PREPEND BEGIN
		.model small
		.stack
		.data	
		.code
start:
		mov ah, 08h
   	    int 21h
    	sub al, '0'
		xor ah,ah
		push ax	
		call ditui1
		pop ax
		call print_ax
;******exit******
    	mov ax, 4c00h
    	int 21h
;******exit******
;PREPEND END
;TEMPLATE BEGIN   
ditui1 proc
;***begin****
    	;PREPEND BEGIN
    		.model small
    		.stack
    		.data
    		.code
start:
    		mov ah, 08h
    		int 21h
    		sub al, '0'
    		xor ah,ah
    		push ax 
    		call ditui1
    		pop ax
    		call print_ax
;******exit******
    		mov ax, 4c00h
    		int 21h
;******exit******
;PREPEND END
;TEMPLATE BEGIN   
ditui1 proc
;***begin****
    		push   ax
    		push   cx
    		push   bp
    		mov    bp,sp		;将堆栈的堆栈赋值给bp以进行栈传递
    		xor    cx,cx
    		mov    al,[bp+8]	;将堆栈中的值传递到al中,完成栈传递
    		cmp    al, 0		;将al与0、1、2进行比较
   		je     zero
    		cmp    al, 1
    		je     one    
   		cmp    al, 2
    		je     two  
    		sub    al, 1		;将al-1,压入栈,进行递归
    		push   ax
    		call   ditui1
    		pop    cx         	;将计算结果弹入cx            
    		sub    al,1		;将al-1,压入栈,进行第二次递归
    		push   ax		
    		call   ditui1      
    		pop    ax			;将计算结果存入ax
    		add    cx,ax		;将两次递归的计算结果之和存入cx
    		jmp over			;跳转到over
zero:
    		mov cx,0
    		jmp over
one:
    		mov cx,1
   		jmp over
two:
    		mov cx,2
over:   
    		mov [bp+8],cx		;将cx中存储的计算结果存入堆栈
    		pop bp
    		pop cx
    		pop ax
    		ret
;****end******
;TEMPLATE END
ditui1 endp
;APPEND BEGIN
print_ax proc
    		push ax ;过程中使用了AX、CX和DX
    		push cx
   		push dx
    		push ax ;暂存ax
    		mov dl,al   ;转换al的高4位
   	 	mov cl,4
    		shr dl,cl
    		or dl,30h   ;al高4位变成3
    		cmp dl,39h
    		jbe aldisp1
    		add dl,7    ;是0Ah~0Fh,还要加上7
aldisp1:    mov ah,2    ;显示
    		int 21h
    		pop dx  ;恢复原ax值到dx
    		and dl,0fh  ;转换al的低4位
    		or dl,30h
    		cmp dl,39h
    		jbe aldisp2
    		add dl,7
aldisp2:    mov ah,2    ;显示
    		int 21h
    		pop dx
    		pop cx
    		pop ax
    		ret ;过程返回
print_ax endp
end start
;//APPEND END
;****end******
;TEMPLATE END
ditui1 endp
;APPEND BEGIN
print_ax proc
		push ax	;过程中使用了AX、CX和DX
		push cx
		push dx
		push ax	;暂存ax
		mov dl,al	;转换al的高4位
		mov cl,4
		shr dl,cl
		or dl,30h	;al高4位变成3
		cmp dl,39h
		jbe aldisp1
		add dl,7	;是0Ah~0Fh,还要加上7
aldisp1:	
mov ah,2	;显示
		int 21h
		pop dx	;恢复原ax值到dx
		and dl,0fh	;转换al的低4位
		or dl,30h
		cmp dl,39h
		jbe aldisp2
		add dl,7
aldisp2:	
mov ah,2	;显示
		int 21h
		pop dx
		pop cx
		pop ax
		ret	;过程返回
print_ax endp
end	start
;//APPEND END

任务3(公共变量传参):

;PREPEND BEGIN
		.model small
		.stack
		.data
		N dw 0 ;
		result dw 0 ;
		.code
start:
		mov ah, 08h
    	int 21h
   		sub al, '0'
		xor ah,ah
		mov N,ax
		xor ax,ax
call ditui1
		mov ax,result
		call print_ax
;******exit******
		mov ax, 4c00h
		int 21h
;******exit******
;PREPEND END
;TEMPLATE BEGIN
ditui1 proc
;ditui1
;***begin****
    	push bx
   		push cx
		push dx
   	 	mov ax,n		;将n的值存入ax
		cmp al, 0	   	;先让al分别与0、1、2进行比较,若大于,
		je zero	       ;则进行递归遍历;若小于,则跳转对al
    	cmp al, 1      	;赋值计算
		je one    
		cmp al, 2
		je two  
		mov dl, al		;保护al
    	sub al, 1			;对n=al-1进行递归运算
    	mov n,ax		;用n-1覆盖n
    	call ditui1
		mov bx,ax     	;将计算得到的值存储在bx中      
    	mov al,dl
    	sub al, 2			;对n=al-2进行递归运算
    	mov n,ax     	;用n-2覆盖n
		call ditui1                      
    	mov cx,ax		;将计算得到的值存储在cx中
    	mov ax,bx
		add ax,cx		
    	mov result,ax	;将计算结果存入公共变量result
    	jmp over
zero:
    	mov al,0
    	jmp over
one:
		mov al,1
    	jmp over
two:
   		mov al,2
over:   	
    	pop dx			;一次递归结束或整个子程序结束
   		pop cx
   		pop bx
   		mov result,ax	;若n值小于2,在结束时将计算结果存入result
   		ret
;****end******
ditui1 endp
;TEMPLATE END
;function: print_eax value in decimal;
;input:eax, use buffer (10 bytes)
print_ax proc
		push ax	;过程中使用了AX、CX和DX
		push cx
		push dx
		push ax	;暂存ax
		mov dl,al	;转换al的高4位
		mov cl,4
		shr dl,cl
		or dl,30h	;al高4位变成3
		cmp dl,39h
		jbe aldisp1
		add dl,7	;是0Ah~0Fh,还要加上7
aldisp1:	mov ah,2	;显示
		int 21h
		pop dx	;恢复原ax值到dx
		and dl,0fh	;转换al的低4位
		or dl,30h
		cmp dl,39h
		jbe aldisp2
		add dl,7
aldisp2:	mov ah,2	;显示
		int 21h
		pop dx
		pop cx
		pop ax
		ret	;过程返回
print_ax endp
;function end
end	start
;//APPEND END

任务4(混合编程):

#define _CRT_SECURE_NO_WARNINGS 1   
#include <iostream>
#pragma warning(2:4235)
int ditui1(int n, int result) {
    __asm {
        mov eax, 1
        mov ecx, 2
        mov ebx, 3
   	judge:
        cmp ebx, n		;判断ebx是否大于n
        jna inloop		;若大于则进入循环
        mov result, ecx	;若小于则将ecx中的计算结果存入result
        mov ebx, n		;在输入的数字小于3的情况下,进行以下操作:
        cmp ebx, 0		;将n存入ebx,再跳转进行比较,为result赋值
        jz zero
        cmp ebx, 1
        jz one
        cmp ebx, 2
        jz two
        jmp over
 	inloop :
        add ebx, 1
        mov edx, eax
        mov eax, ecx
        add ecx, edx
        jmp judge
zero :
       mov result, 0
       jmp over
one :
       mov result, 1
       jmp over
two :
       mov result, 2
       jmp over
over:
        }
    return result;		;返回结果
}

int main() {
    int n;
    int result=0;
    scanf("%d", &n);		//输入一个数,存入n
    result=ditui1(n, result);	//将返回的计算结果存入result
    printf("%d", result);	//输出结果
    return 0;
}

任务4其他事项:

1)实验环境:

                1.操作系统:Windows操作系统

                2.IDE: Microsoft Visual Studio

                3.编译器:Microsoft Visual C++ 编译器

2)配置实验环境:

                

步骤

操作内容

操作截图

1

将“解决方案平台”更改为“x86”

2

进入“生成依赖项”的“生成自定义”,勾选“masm(.targets,.props)”

     

2)进行测试

步骤

操作内容

操作截图

1

将代码输入到VS中,单击“本地Windows调试器”

2

在出现的命令行中输入要测试的数字,如“11”,再输入回车,命令行中会显示计算结果,并且退出程序

3

在VS窗口中单击“本地Windows调试器”

4

重复2、3步骤,继续测试

5

关闭命令行窗口结束测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值