Win32汇编备份--递归程序设计

递归程序设计

  1. 设有一棵二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHJKMNOP^^T”,其中“”表示不存在的结点。
    List item
    现要求编程输入字符数组B的值,然后按中序遍历输出各结点的值。
    若运行后若输入:
    ABCD^^G
    则运行结果输出:
    DBACG
    请在;/和;/之间编写程序。
.386
.model flat, stdcall
option casemap :none
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;*【*/
.data
infmt BYTE '%s',0
outfmt BYTE '%c',0
s DB 80 DUP(0)
len DWORD ?
flag DWORD 0
.code
PreOrder PROC i:DWORD,mark:DWORD
MOV ESI,i
.IF ESI<mark
MOV ECX,i
IMUL ECX,2
ADD ECX,1
invoke PreOrder,ECX,mark
MOV EAX,i
.IF s[EAX]!='^'
invoke printf,ADDR outfmt,s[EAX]
.ENDIF
MOV ECX,i
IMUL ECX,2
ADD ECX,2
invoke PreOrder,ECX,mark
.ENDIF
RET
PreOrder ENDP
start:
invoke scanf,ADDR infmt,ADDR s
MOV AL,0
LEA EDI,s-1
MOV ECX,80
.repeat
INC EDI
.untilcxz [EDI]==AL
LEA EAX,s
SUB EDI,EAX
MOV len,EDI
invoke PreOrder,flag,len
RET
end start
 ;*】*/
  1. 设有一棵完全二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHIJKLMNOPQRST”。 
    现要求编程输入字符数组B的值,然后按先序遍历输出各结点的值。
    在这里插入图片描述
    若运行后若输入:
    ABCDEFG
    则运行结果输出:
    ABDECFG
    请在;/和;/之间编写程序。
.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none
 ;*【*/
.data
infmt BYTE '%s',0
outfmt BYTE '%c',0
s DB 80 DUP(0)
len DWORD ?
flag DWORD 0
.code
PreOrder PROC i:DWORD,mark:DWORD
MOV ESI,i
.IF ESI<mark
MOV EAX,i
invoke printf,ADDR outfmt,s[EAX]
MOV ECX,i
IMUL ECX,2
ADD ECX,1
invoke PreOrder,ECX,mark
MOV ECX,i
IMUL ECX,2
ADD ECX,2
invoke PreOrder,ECX,mark
.ENDIF
RET
PreOrder ENDP
start:
invoke scanf,ADDR infmt,ADDR s
MOV AL,0
LEA EDI,s-1
MOV ECX,80
.repeat
INC EDI
.untilcxz [EDI]==AL
LEA EAX,s
SUB EDI,EAX
MOV len,EDI
invoke PreOrder,flag,len
RET
end start
 ;*】*/
  1. 用归递方法实现Hanoi(汉诺)塔问题。运行后若输入:
    在这里插入图片描述
    1
    则结果输出:
    A移1个盘到C

运行后若输入:
2
则结果输出:
A移1个盘到B
A移1个盘到C
B移1个盘到C

运行后若输入:
3
则结果输出:
A移1个盘到C
A移1个盘到B
C移1个盘到B
A移1个盘到C
B移1个盘到A
B移1个盘到C
A移1个盘到C

请在;/和;/之间编写程序。

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;*【*/
.data
infmt BYTE '%d',0
outfmt BYTE '%c移1个盘到%c',13,0
x DWORD ?
an DWORD 'A'
bn DWORD 'B'
cn DWORD 'C'
.code
Fun PROC n:DWORD,mark:DWORD,flag:DWORD,temp:DWORD
.IF n<=1
invoke printf,ADDR outfmt,mark,temp
.ELSE
MOV ECX,n
DEC ECX
invoke Fun,ECX,mark,temp,flag
invoke printf,ADDR outfmt,mark,temp
MOV ECX,n
DEC ECX
invoke Fun,ECX,flag,mark,temp
.ENDIF
RET
Fun ENDP
start:
invoke scanf,ADDR infmt,ADDR x
invoke Fun,x,an,bn,cn
RET
end start
 ;*】*/

after all

考题(IMPORTANT!!!)

编一函数fun(int n),用归递方法实现将一个十进制数各位数字按逆序输出。
运行后输入:
123456789
则结果输出:
9,8,7,6,5,4,3,2,1,

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
outfmt BYTE '%d,',0
fun PROC x:DWORD
LOCAL flag:DWORD
MOV flag,10
MOV EAX,x
CDQ
IDIV flag
MOV EDI,EAX
invoke printf,ADDR outfmt,EDX
.IF EDI!=0
invoke fun,EDI
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start
 ;*】*/

编一函数fun(int n),用归递方法实现求十进制数中各位值为奇数的数字和,运行后输入正整数n,然后输出和。
运行后输入:
1234567891
则结果输出:
26

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
LOCAL flag:DWORD,tamp:DWORD,mark:DWORD,tem:DWORD,sum:DWORD
MOV sum,EAX
MOV flag,10
MOV tamp,2
MOV EAX,x
CDQ
IDIV flag
MOV tem,EDX
MOV mark,EAX
MOV EAX,tem
CDQ
IDIV tamp
.IF EDX!=0
MOV EAX,sum
ADD EAX,tem
MOV sum,EAX
.ENDIF
MOV EDI,mark
.IF EDI!=0
MOV EAX,sum
invoke fun,EDI
.ELSE
MOV EAX,sum
SUB EAX,1
invoke printf,ADDR fmt,EAX
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

设有一棵二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHJKMNOP^^T”,其中“”表示不存在的结点。
在这里插入图片描述
现要求编程输入字符数组B的值,然后按中序遍历输出各结点的值。
若运行后若输入:
ABCD^^G
则运行结果输出:
DBACG
请在;/和;/之间编写程序。

.386
.model flat, stdcall
option casemap :none
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;*【*/
.data
infmt BYTE '%s',0
outfmt BYTE '%c',0
s BYTE 80 DUP(0)
flag DWORD 0
.code
InOrder PROC x:DWORD,len:DWORD
MOV ESI,x
.IF ESI<len
MOV EAX,x
IMUL EAX,2
ADD EAX,1
invoke InOrder,EAX,len
MOV ESI,x
.IF s[ESI]!='^'
invoke printf,ADDR outfmt,s[ESI]
.ENDIF
MOV EAX,x
IMUL EAX,2
ADD EAX,2
invoke InOrder,EAX,len
.ENDIF
RET
InOrder ENDP
start:
invoke scanf,ADDR infmt,ADDR s
MOV EDI,0
.WHILE s[EDI]!=0
INC EDI
.ENDW
invoke InOrder,flag,EDI
RET
end start
 ;*】*/

设有一棵完全二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHIJKLMNOPQRST”。
在这里插入图片描述
现要求编程输入字符数组B的值,然后按先序遍历输出各结点的值。
若运行后若输入:
ABCDEFG
则运行结果输出:
ABDECFG
请在;/和;/之间编写程序。

.386						;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none			;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib		;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data						;⑤数据段
 ;*【*/
infmt BYTE '%s',0
outfmt BYTE '%c',0
s BYTE 80 DUP(0)
flag DWORD 0
.code
PreOrder PROC x:DWORD,len:DWORD
MOV ESI,x
.IF ESI<len
MOV ESI,x
invoke printf,ADDR outfmt,s[ESI]
MOV EAX,x
IMUL EAX,2
ADD EAX,1
invoke PreOrder,EAX,len
MOV EAX,x
IMUL EAX,2
ADD EAX,2
invoke PreOrder,EAX,len
.ENDIF
RET
PreOrder ENDP
start:
invoke scanf,ADDR infmt,ADDR s
MOV EDI,0
.WHILE s[EDI]!=0
INC EDI
.ENDW
invoke PreOrder,flag,EDI
RET
end start
 ;*】*/

Hanoi(汉诺塔)问题,传说梵天创造世界时做了三根宝石针A、B、C,在A针上从下往上按照从大到小顺序穿着64个大小不同的圆盘(如下图)。梵天命令僧侣借助B针把圆盘从A针移到C针上,移动的规则是:一次只能移动一片,且不管在哪根针上,小盘必须在大盘之上。现请编程实现僧侣的工作,程序运行后输入圆盘数n,输出每一步移动的顺序。
在这里插入图片描述
运行后若输入:
1
则结果输出:
A移1个盘到C
运行后若输入:
2
则结果输出:
A移1个盘到B
A移1个盘到C
B移1个盘到C
运行后若输入:
3
则结果输出:
A移1个盘到C
A移1个盘到B
C移1个盘到B
A移1个盘到C
B移1个盘到A
B移1个盘到C
A移1个盘到C
请在;/和;/之间编写程序。

.386						;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none			;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib		;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data						;⑤数据段
 ;*【*/
infmt BYTE '%d',0
outfmt BYTE '%c移1个盘到%c',13,0
n DWORD ?
flag DWORD 'A'
mark DWORD 'B'
tamp DWORD 'C'
.code
Hanoi PROC x:DWORD,an:DWORD,bn:DWORD,cn:DWORD
MOV EAX,x
.IF EAX<=1
invoke printf,ADDR outfmt,an,cn
.ELSE
MOV EAX,x
SUB EAX,1
invoke Hanoi,EAX,an,cn,bn
invoke printf,ADDR outfmt,an,cn
MOV EAX,x
SUB EAX,1
invoke Hanoi,EAX,bn,an,cn
.ENDIF
RET
Hanoi ENDP
start:
invoke scanf,ADDR infmt,ADDR n
invoke Hanoi,n,flag,mark,tamp
RET
end start
 ;*】*/

编一函数fun(int n),用归递方法实现将一个十进制数各位数字按逆序输出。
运行后输入:
123456789
则结果输出:
987654321
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
MOV EAX,x
MOV ECX,10
CDQ
IDIV ECX
MOV EDI,EAX
invoke printf,ADDR fmt,EDX
.IF EDI!=0
invoke fun,EDI
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

编一函数fun(int n),用归递方法实现将十进制数转换为八进制数,运行后输入正整数n,输出n的八进制数。
运行后输入:
255
则结果输出:
377
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
Local anw
MOV EAX,x
.IF EAX!=0
MOV EAX,x
MOV ECX,8
CDQ
IDIV ECX
MOV EDI,EAX
MOV anw,EDX
invoke fun,EDI
invoke printf,ADDR fmt,anw
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

编一函数fun(int n),用归递方法实现将十进制数转换为二进制数,运行后输入正整数n,输出n的二进制数。
运行后输入:
250
则结果输出:
11111010
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
Local anw
MOV EAX,x
.IF EAX!=0
MOV EAX,x
MOV ECX,2
CDQ
IDIV ECX
MOV EDI,EAX
MOV anw,EDX
invoke fun,EDI
invoke printf,ADDR fmt,anw
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

编一函数fun(int n),用归递方法实现n!,运行后输入正整数n,输出n!。
运行后输入:
5
则结果输出:
120
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
.IF x==1
invoke printf,ADDR fmt,EAX
.ELSE
IMUL EAX,x
MOV ECX,x
DEC ECX
invoke fun,ECX
.ENDIF
RET
fun ENDP
 ;*】*/
start:						;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start					;指明程序入口点start

编一函数fun(int n),用归递方法实现求十进制数各位数字和,运行后输入正整数n,输出n各位数字和。
运行后输入:
123456789
则结果输出:
45
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',13,0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
LOCAL flag:DWORD,tamp:DWORD,mark:DWORD,tem:DWORD,sum:DWORD
MOV sum,EAX
MOV flag,10
MOV tamp,2
MOV EAX,x
CDQ
IDIV flag
MOV tem,EDX
MOV mark,EAX
MOV EAX,sum
ADD EAX,tem
MOV EDI,mark
.IF EDI!=0
invoke fun,EDI
.ELSE
SUB EAX,1
invoke printf,ADDR fmt,EAX
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

求排列组合数
输入:6 2
输出:15

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;*【*/
.data
infmt BYTE '%d%d',0
outfmt BYTE '%d ',0
x DWORD ?
y DWORD ?
.code
Com PROC a:DWORD,b:DWORD
LOCAL t:DWORD
MOV ECX,a
MOV EDX,b
.IF EDX>ECX
MOV EAX,0
.ELSE
.IF EDX==1
MOV EAX,a
.ELSE
.IF ECX==EDX
MOV EAX,1
.ELSE

MOV ECX,a
SUB ECX,1
MOV EAX,b
SUB EAX,1
invoke Com,ECX,EAX
MOV t,EAX

MOV ECX,a
SUB ECX,1
invoke Com,ECX,b
ADD EAX,t

.ENDIF
.ENDIF
.ENDIF
RET
Com ENDP
start:
invoke scanf,ADDR infmt,ADDR x,ADDR y
invoke Com,x,y
invoke printf,ADDR outfmt,EAX
RET
end start
 ;*】*/

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值