千万不要使用盒武器!!花科人不盒花科人[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 | 关闭命令行窗口结束测试 | 略 |